6

我正在尝试将特定于应用程序的 TTS 引擎添加到我的应用程序中 - 不是基于系统的,所以每个人都会有另一个,但所有人都有一个。

在文档中有方法:setEngineByPackageName(),看起来它可以满足我的需求。但是,在前面查看其他类似问题时,我发现使用这种方法的一些东西:https ://stackoverflow.com/questions/12549086/selecting-required-tts-programmatically-in-android 。

它看起来还不错,但是在系统检查是否安装了 TTS 引擎后使用它,如果没有安装它(没有定义哪个)。

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Fire off an intent to check if a TTS engine is installed
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
}

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == MY_DATA_CHECK_CODE)
    {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS)
        {
            // success, create the TTS instance
            mTts = new TextToSpeech(this, this);
        }
        else
        {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                    TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }
}

所以,我想问一下在检查时是否有任何方法可以安装特定的tts引擎,因为现在这些方法是在创建TTS之前调用的,所以你不能调用setEngineByPackageName(),或者带有引擎设置的构造函数(取决于Android版本)。

我正在考虑作为一个关于Text-To-Speech Extended的引擎,所以据我所知,我应该使用包名称: com.google.tts 我假设它来自 Play 商店链接。

4

2 回答 2

2

在 onCreate() 中尝试检查是否安装了特定的 TTS 引擎:

        if ((isPackageInstalled(getPackageManager(), SPECIFIC_TTS_PACKAGE_NAME))) {
        Log.e(TTS_TAG, "Intended TTS engine installed");
        mTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.ERROR) {
                    Log.e(TTS_TAG, "TTS initialize failed");
                } else {
                    int result = mTTS.setLanguage(Locale.US);

                    if (result == TextToSpeech.LANG_NOT_SUPPORTED
                            || result == TextToSpeech.LANG_MISSING_DATA) {
                        Log.e(TTS_TAG, "Language not supported");
                    } else {
                        mButtonSpeak.setEnabled(true);
                    }
                }
            }
        }, SPECIFIC_TTS_PACKAGE_NAME);
    } else {
        Log.e(TTS_TAG, "Intended TTS engine is not installed");
        installSpecificTTSEngine();
    }

这种安装 TTS 引擎的方法:

 private void installSpecificTTSEngine() {
    if (internetIsConnected()) {
        Intent installIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id="+SPECIFIC_TTS_PACKAGE_NAME));
        installIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET|Intent.FLAG_ACTIVITY_MULTIPLE_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);

        try {
            Log.e(TTS_TAG, "Installing TTS engine: " + installIntent.toUri(0));
            startActivity(installIntent);
        } catch (ActivityNotFoundException ex) {
            Log.e(TTS_TAG, "Failed to install TTS engine, no activity found for " + installIntent + ")");
        }
    } else {
        Log.e(TTS_TAG, "Internet is not connected for download tts engine");
    }
}

其他方法:

public static boolean isPackageInstalled(PackageManager pm, String packageName) {
    try {
        pm.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}

/* Check is there a NetworkConnection */
protected boolean internetIsConnected() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm != null ? cm.getActiveNetworkInfo() : null;
    if (netInfo != null && netInfo.isConnected()) {
        return true;
    } else {
        return false;
    }
}
于 2018-11-19T09:43:12.823 回答
1

为什么你在 onCreate 调用意图?

将安装检查程序移到说话之前的位置

于 2018-08-20T14:35:55.123 回答