2012-07-28 83 views
5

我与Android的TTS功能​​和文字转语音类玩弄了这个方法来设置它得到通知,一旦文字转语音播放完毕的监听器:为什么UtteranceProgressListener不是一个接口?

public int setOnUtteranceCompletedListener(TextToSpeech.OnUtteranceCompletedListener listener) 

OnUtteranceCompletedListener被定义为public abstract class。由于我的MainActivity已经扩展了Activity,所以它也不能延伸OnUtteranceCompletedListener。我可以用一个OnUtteranceCompletedListener旧的方法,但是不赞成这种方式:

public int setOnUtteranceCompletedListener (TextToSpeech.OnUtteranceCompletedListener listener)` 

为什么OnUtteranceCompletedListener没有定义为public static interface?我正在考虑编写我自己的UtteranceProgressListenerImpl,然后再调用MainActivityonDone方法。这是正确的方式,还是有更好的/更清洁的选择?

private class UtteranceProgressListenerImpl extends UtteranceProgressListener { 

    private MainActivity mainActivity; 

    UtteranceProgressListenerImpl(MainActivity mA) { 
     mainActivity = mA; 
    } 

    @Override 
    public void onDone(String utteranceId) { 
     mainActivity.onDone(utteranceId); 
    } 

    @Override 
    public void onError(String utteranceId) { /* empty */ } 

    @Override 
    public void onStart(String utteranceId) { /* empty */ } 


} 

回答

6

我不知道我认为它应该是一个接口。我使用此代码来解决它。它也可用here

另外,我投了一个this bug我刚刚提交。

public void setTts(TextToSpeech tts) 
    { 
     this.tts = tts; 
     if (Build.VERSION.SDK_INT >= 15) 
     { 
      tts.setOnUtteranceProgressListener(new UtteranceProgressListener() 
      { 
       @Override 
       public void onDone(String utteranceId) 
       { 
        onDoneSpeaking(utteranceId); 
       } 

       @Override 
       public void onError(String utteranceId) 
       { 
       } 

       @Override 
       public void onStart(String utteranceId) 
       { 
       } 
      }); 
     } 
     else 
     { 
      Log.d(TAG, "set utternace completed listener"); 
      tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() 
      { 
       @Override 
       public void onUtteranceCompleted(String utteranceId) 
       { 
        onDoneSpeaking(utteranceId); 
       } 
      }); 
     } 
    } 
+0

匿名内部类的替代解决方案是创建一个完全独立的(非匿名)内部类来扩展UtteranceProgressListener。这是我在修改使用文本到语音的应用程序时采用的方法。不过,我已经在开发者控制台中收到了几个NoClassDefFoundError异常,并得出结论,这种方法是不健全的(没有双关语意图)。偶尔,类加载器无法及时或完全无法加载类(很难判断哪个类)。所以不要采用那条路线。 – Phil 2012-08-30 19:19:07