为什么UtteranceProgressListener不是一个接口?

时间:2012-07-28 18:36:00

标签: android text-to-speech

我正在玩Android的TTS功能​​,TextToSpeech类有这个方法设置一个侦听器,一旦TextToSpeech完成播放就会收到通知:

public int setOnUtteranceCompletedListener(TextToSpeech.OnUtteranceCompletedListener listener)

OnUtteranceCompletedListener定义为public abstract class。由于我的MainActivity已经扩展了活动,因此它也无法扩展OnUtteranceCompletedListener。我可以将旧方法与OnUtteranceCompletedListener一起使用,但不推荐使用:

public int setOnUtteranceCompletedListener (TextToSpeech.OnUtteranceCompletedListener listener)`

为什么OnUtteranceCompletedListener未定义为public static interface?我正在考虑编写自己的UtteranceProgressListenerImpl,然后只需调用MainActivity s onDone方法。这是正确的方式还是有更好/更清洁的替代方案?

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 */ }


}

1 个答案:

答案 0 :(得分:7)

我不知道我认为它应该也是一个界面。我用这段代码来解决它。它也可用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);
                }
            });
        }
    }