12

デバイスに現在インストールされている言語パッケージをコードで特定することはできますか? これを試しました:

    Intent detailsIntent =  new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS);
    sendOrderedBroadcast(detailsIntent, null, new LanguageDetailsChecker(), null, Activity.RESULT_OK, null, null);

 

    public class LanguageDetailsChecker extends BroadcastReceiver  {

    private List<String> supportedLanguages;

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Bundle results = getResultExtras(true);
        if (results.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES))
        {
            supportedLanguages =results.getStringArrayList(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);
            Log.d("TAG","languages: " + supportedLanguages);
        }
    }
}

ただし、en_UK、en_US、および es_ES しかインストールされていないのに、出力には大量の言語が表示されます。何か案が?

4

3 に答える 3

2

ルートがある場合 (申し訳ありません)、次の方法で実行できます。

public static boolean isOfflineDictionaryPresent(String language) {
    if (locale == null) locale = Locale.US;
    String dir = "/system/usr/srec/config/" +
            language.replace('_', '.').toLowerCase();
    if ((new File(dir)).isDirectory()) return true;
    return false;
}

これは Android 4.2.2 Recognizer.java ソースからリッピングされ、次のように変更されました。

  • 辞書ディレクトリの代わりに単純なブール値を返します
  • ロケールの代わりに文字列入力 (例: "en_US") を取ります

あなたと同じように完全なリストを取得し、それらをループして、オフラインで利用できるものを確認します。/system/usr/srec/config/2 台のデバイスでフォルダを確認しましたが、どちらもインストールした辞書と一致しています。

もちろん、欠点は root でしか機能しないことです。そのため、これが最終的にどの程度役立つかはわかりません。非ルートに対して何を言うべきか本当にわかりません。何も見つかりません。


編集: 好奇心からですが、オフラインの場合、EXTRA_SUPPORTED_LANGUAGES には何が含まれていますか? 正しく返された場合は、ネットワークマネージャーを偽造する必要があるかもしれません.

于 2013-07-25T19:50:28.677 に答える
0

このサンプルを確認してください:

public class SpeakingAndroid extends Activity implements  OnInitListener {

        //TTS object
    private TextToSpeech myTTS;
        //status check code
    private int TS_CHECK_CODE = 0;

        //create the Activity
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

            //check for TTS data
            Intent checkTTSIntent = new Intent();
            checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
            startActivityForResult(checkTTSIntent, TS_CHECK_CODE);
    }

        //act on result of TTS data check
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == MY_DATA_CHECK_CODE) {
            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
                //the user has the necessary data - create the TTS
            myTTS = new TextToSpeech(this, this);
            }
            else {
                    //no data - install it now
                Intent installTTSIntent = new Intent();
                installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installTTSIntent);
            }
        }
    }

        //setup TTS
    public void onInit(int initStatus) {

            //check for successful instantiation
        if (initStatus == TextToSpeech.SUCCESS) {
            if(myTTS.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE)
                myTTS.setLanguage(Locale.US);
        }
        else if (initStatus == TextToSpeech.ERROR) {
            Toast.makeText(this, "Sorry! Text To Speech failed...", Toast.LENGTH_LONG).show();
        }
    }
}

すべての言語を取得して、各言語が tts でサポートされているかどうかを確認できますか?myTTS.isLanguageAvailable(Locale.US)

于 2013-08-01T06:49:56.060 に答える
0

これを試してみてください:

 for (Locale locale : Locale.getAvailableLocales()) {
                try {
                    if (tts != null) {
                        if (locale != null && locale.getISO3Country() != null && locale.getISO3Language() != null && tts.isLanguageAvailable(locale) == 1) {
                            available_locs.add(locale);
                            tts.setLanguage((Locale) locale);

                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                                if (tts.getVoice().getFeatures().contains(TextToSpeech.Engine.KEY_FEATURE_NOT_INSTALLED)) {
                                    Log.i(TAG, "[onInit]contains:IF " + locale.getDisplayName());
                                } else {
                                    Log.i(TAG, "***********[onInit]contains:ELSE " + locale.getDisplayName());
                                }

                            } else {
                                    /*not supported  21 below sdk so hide progressbar and hide spinner and only TTs in default
                                    language */
                                Log.i(TAG,"Not supported");
                            }

                        }
                    }
                } catch (Exception e) {
                    Log.i(TAG, "[onViewCreated] " + e.getLocalizedMessage());
                }
            }

それ以外の場合は、デバイスのインストール言語を知っている必要があります。

于 2018-10-19T09:16:53.883 に答える