2

私のアプリ (Android API 10) では、標準的な方法を使用して、TTS エンジンと音声が利用可能かどうかを確認します。

Intent checkIntent = new Intent();
checkIntent.setAction( TextToSpeech.Engine.ACTION_CHECK_TTS_DATA );
startActivityForResult( checkIntent, CHECK_TTS_DATA );

複数の TTS エンジンを搭載したデバイスでは、Android は 1 つを選択するよう求めます (「完全なアクションを使用して...」)。

デフォルトの TTS エンジンを使用して ACTION_CHECK_TTS_DATA をチェックする方法はありますか (エンジン選択ダイアログを回避するため)? または ... ユーザーが選択した TTS エンジンを取得するにはどうすればよいですか (setEngineByPackageName() (API 10) で使用するには) ?

4

1 に答える 1

2

これを行うにはいくつかの方法があります。デフォルトの TTS エンジンを取得するには、onInit リスナーをチェックインします。

TextToSpeech tts = new TextToSpeech(context, onInitListener);


    @Override
        public void onInit(final int status) {

            switch (status) {

            case TextToSpeech.SUCCESS:

                try {

                    final String initEngine = tts.getDefaultEngine();

    // Check it's != null before doing anything with it.

                } catch (final Exception e) {

                }

        break;
    }
}

一部の IVONA および SVOX TTS エンジンでクラッシュが発生したため、try/catch ブロックが存在します。

パッケージ名を取得したら、インテント アクティビティをクエリし、必要に応じてカスタム チューザーを使用するか、上記で取得したパッケージ名だけにインテントを制限できます。

    private void getEngines(String initEngine) {

        Intent ttsIntent = new Intent();
        ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);

        PackageManager pm = getPackageManager();

        List<ResolveInfo> list = pm.queryIntentActivities(ttsIntent,
                PackageManager.GET_META_DATA);

        for (ResolveInfo appInfo : list) {

// Might want a null check in here

            if(appInfo.activityInfo.applicationInfo.packageName.matches(initEngine) {

            ttsIntent
                    .setPackage(appInfo.activityInfo.applicationInfo.packageName);
        }


            startActivityForResult(ttsIntent, 33);

        }
    }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 33 && data != null) {

       // do something
    }
}

上記をテストしていませんが、それを基に構築して、必要なことを実行できると確信しています。

于 2013-10-16T13:01:29.460 に答える