0

私の目的は、利用可能な TTS 音声エンジンとそれぞれの利用可能な言語を取得することです。次のコードを使用して、使用可能なエンジンを正常に取得できます。

    PackageManager pm = getPackageManager();

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

    ArrayList<String> engineInfo = new ArrayList<String>();

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

    for (ResolveInfo appInfo : list) {
        engineInfo.add(appInfo.activityInfo.applicationInfo.packageName);
        engineInfo.add(appInfo.activityInfo.applicationInfo.loadLabel(pm)
                .toString());
    }

上記のコメントアウトされた行は、インテントのデータ エクストラを要求します。私は多くの検索を行いましたがqueryIntentActivities()、この方法で「getExtra」または「putExtra」を使用する例は見つかりません。

したがって、これはオプションではなく、どこかでこれが不可能な理由の基本を読むために戻る必要があると思いますか!?

データを取得しようとすると、null ポインターが返されます!=null。どちらが少し奇妙かを確認している場合でも、null ポインターが返されます。

appInfo.activityInfo.applicationInfo.metaData.getEtcEtc...

事前に感謝します。

postPutEXTRA:API レベルは 9 であるため、getEngines()は使用できませんが、それぞれの tts オブジェクトを初期化する必要があるため、とにかく理想的ではありません。

postPutEDIT:関連する uid を抽出するためにループ内で次のことを試しましたが、テストした音声エンジンの 1 つを除いてすべてでは機能しませんでした。

    ApplicationInfo ai = null;
    try {
        ai = pm.getApplicationInfo(appInfo.activityInfo.applicationInfo.packageName, 0);
    } catch (NameNotFoundException e) {
        e.printStackTrace();
        return;
    }

    String[] voices = pm.getPackagesForUid(ai.uid);
4

2 に答える 2

0

私も同様のプロセスを経ましたが、正しく覚えていれば、インテントクエリを実行して利用可能な言語を取得することはできません。利用できる言語は、ユーザーがTTSエンジンとともにインストールする音声やその他のパッケージによって異なるため、これは絶対に理にかなっています。つまり、クエリする静的パラメーターではありませんが、実行時に解決する必要があります。

TTSエンジンで利用可能な音声(およびその他の情報)を取得するには、実際に起動/初期化する必要があります。つまり、次のようなことをする必要があります。

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

そして、次のデータを取得しますonActivityResult(...)

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode != MY_DATA_CHECK_CODE) return;
    // here you should be able to get the info from 'data', i.e.
    ArrayList<String> voices = getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
}

上記のほとんどをAndroid開発ブログの記事からコピーして貼り付けたことに注意してください。

前回TTSで遊んでからしばらく経ちましたので、うまくいかない場合はコメントを残してください。当時の実装を詳しく見ていきます。

于 2012-11-03T22:07:05.367 に答える
0

この質問の具体的なタイトルを解決することはできませんでしたが、次の方法で、ユーザーの操作なしで、デバイスで使用可能な音声エンジンとその言語について必要な情報を取得しました。

private void getEngines() {

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

    ArrayList<String> engineInfo = new ArrayList<String>();

    PackageManager pm = getPackageManager();

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

    for (ResolveInfo appInfo : list) {
        engineInfo.add(appInfo.activityInfo.applicationInfo.packageName);

        ttsIntent
                .setPackage(appInfo.activityInfo.applicationInfo.packageName);
        ttsIntent
                .getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);

        startActivityForResult(ttsIntent, 33);

    }

    if (DE.BUG) {
        MyLog.d("engineInfo: " + engineInfo.size() + " : "
                + engineInfo.toString());
    }
}

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

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

        ArrayList<String> available = data
                .getStringArrayListExtra("availableVoices");

        if (DE.BUG) {
            MyLog.i("Voices: " + available.toString());
        }
    }
}

データをキャプチャしている場所を示すために、カスタムロギングクラス/メソッドを残しました。上記を再配置して、すべてのデータを1つ以上のグローバル配列リストに入れることができます。

于 2013-01-05T12:27:09.170 に答える