web-dev-qa-db-ja.com

API 21を使用したTextToSpeech

誰かがAPI 21でTTSを使用するのを手伝ってくれますか?利用可能なすべての例はバージョン21で非推奨です

最後の行にエラーを与える私のコードは次のとおりです。

Calendar cal = Calendar.getInstance();
                    cal.getTime();
                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
                    String text = sdf.toString();
                    btn.setText("Ouvir as Horas");

                    TextToSpeech tts = new TextToSpeech(NightClock.this,(TextToSpeech.OnInitListener) NightClock.this);
                    tts.setLanguage(Locale.US);
                    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);

Android開発者では、このメソッドは廃止され、これに置き換えられると述べています:

speak(String text、int queueMode、HashMap params)このメソッドはAPIレベル21で非推奨になりました。APIレベル21の時点で、speak(CharSequence、int、Bundle、String)に置き換えられました。

誰かが私のアプリのコーディングを手伝ってくれますか?.

18
Jose Borges

いろいろなサイトを検索しました。最後に、私はあなたの質問に対する答えを得ることができると思います...

Tts.speak()を直接呼び出す代わりに、次のif-elseステートメントを追加します。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    ttsGreater21(text);
} else {
    ttsUnder20(text);
}

次に、ttsGreater21()およびttsUnder20()を次のように宣言します。

@SuppressWarnings("deprecation")
private void ttsUnder20(String text) {
    HashMap<String, String> map = new HashMap<>();
    map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);
}

@TargetApi(Build.VERSION_CODES.Lollipop)
private void ttsGreater21(String text) {
    String utteranceId=this.hashCode() + "";
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
}

上記のコードをGenymotionで確認しましたVM Android 5.0 and Android 4.4.4.

41
xanadu6291

だから私はこれがトリックだと思う:

_if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    tts.speak("12 e8", TextToSpeech.QUEUE_FLUSH, null, null);
    }
else {
    tts.speak("12 e8", TextToSpeech.QUEUE_FLUSH, null);
    }
_

エミュレータでこれをテストするだけです。

ちなみに、@ Adityaはとても役に立ちましたので、TextToSpeechを話し、画面をオンにする必要がある同じプロジェクトにこだわっていますが、画面をオンにすることはできません。私が見つけたすべての例からウェイクロックとフラグを使用しようとしました:)これは、私が管理することができた近接センサーを介して行われます。テキストは表示されますが、画面は表示されません。これで私を助けてもらえますか?

よく練習することが成功の鍵です。私が提案した答えはすべて、私のEclipse IDEで完全に機能しています。画面ロックの解決策は次のとおりです

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); wl.acquire(); ..screen will stay on during this section.. wl.release();

5
Jose Borges
tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null);

これを試して。

5
Aditya

(1)私のアクティビティはTextToSpeech.OnInitListenerを実装します

(2) onInitメソッドで合成音声を再生しますが、onInit()が呼び出された後はいつでも再生できると思います(試していません)。しかし、これが重要です。TextToSpeechエンジンが初期化されるのを待つ必要があります。

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
    public TextToSpeech mTTS;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTTS = new TextToSpeech(this, this);
    }

    @Override
    public void onInit(int i) {
        mTTS.setLanguage(Locale.UK);
        mTTS.speak("Hello, how are you?", TextToSpeech.QUEUE_ADD, null, null);
    }    
}
2
unshul

これを試して

tts=new TextToSpeech(getBaseContext(),new TextToSpeech.OnInitListener() 
{       
       @Override        
       public void onInit(int status) 
       {
            tts.setLanguage(Locale.getDefault());
            tts.setPitch(1.3f);
            tts.setSpeechRate(1f);
       }
});
0
Aditya

ウェイクロック、私はtiをこのように機能させることができました:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP |
                                    PowerManager.ON_AFTER_RELEASE, "MyWakelock");

wl.aquire();
wl.release();
0
Jose Borges