2012-07-28 71 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

相關問題