Android TTS(文本到语音):本班经理

Android TTS(文本到语音):本班经理,android,text-to-speech,Android,Text To Speech,我正在尝试在自己的Manager类中构建一个文本到语音管理器 当前我的代码如下所示: public class TTSManager extends Activity implements OnInitListener{ private TextToSpeech myTTS; private int MY_DATA_CHECK_CODE = 0; private boolean readyToSpeak = false; public TTSManager() { ; } publ

我正在尝试在自己的Manager类中构建一个文本到语音管理器

当前我的代码如下所示:

public class TTSManager extends Activity implements OnInitListener{

private TextToSpeech myTTS;
private int MY_DATA_CHECK_CODE = 0;
private boolean readyToSpeak = false;

public TTSManager()
{
    ;
}

public void checkIfTTSModulesInstalled()
{
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
}


protected 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
            myTTS = new TextToSpeech(this, this);
        } 
        else 
        {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }
}


@Override
public void onInit(int status) 
{
    if (status == TextToSpeech.SUCCESS)
    {
        if(myTTS.isLanguageAvailable(Locale.US) == TextToSpeech.LANG_AVAILABLE)
        {
            myTTS.setLanguage(Locale.US);
            readyToSpeak = true;
        }
    }
}

public void speak(String text)
{
    if (readyToSpeak)
        myTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

}
不幸的是,我在尝试初始化TTS模块时收到一个空指针异常。
如何构建一个TTS管理器是一个自己的类(而不是直接在应该使用TTS的活动中)?

不要让你的管理器类扩展
活动
。如果你这样做了,就没有办法在其他活动中使用它,我认为这就是你的目标(它必须由Android初始化,只需调用
new TTSManager()
并不能使它成为有效的活动)。将其设为常规类,并将
上下文
参数传递给所有需要它的方法

至于NPE,您可能需要查看堆栈跟踪

这是我写的类似的东西,可能会给你一些提示。它有很多用于切换引擎的代码,但如果您只是使用默认引擎,则可以忽略这一点:


不要让你的经理类扩展
活动。如果你这样做了,就没有办法在其他活动中使用它,我认为这就是你的目标(它必须由Android初始化,只需调用
new TTSManager()
并不能使它成为有效的活动)。将其设为常规类,并将
上下文
参数传递给所有需要它的方法

至于NPE,您可能需要查看堆栈跟踪

这是我写的类似的东西,可能会给你一些提示。它有很多用于切换引擎的代码,但如果您只是使用默认引擎,则可以忽略这一点:

我现在是这样做的(尽管不确定这种方式是否“合适”):

我现在是这样做的(虽然不确定这种方式是否合适):


您好,据我所知,您正在检查TTS是否以其他方式安装。是否只是检查是否安装了某个包(-name)?我正在检查是否安装了特定的TTS引擎,但如果使用默认的TTS引擎,则无需执行此操作。如果您正在检查TTS数据是否是使用
startActivityForResult()
安装的,则必须在实际活动中使用
onActivityResult()
。关键是,管理器可以托管
TextToSpeech
对象并负责初始化、配置和销毁它,但它仍然必须由活动触发。还有一个问题:是否有一种安全且不同的方法来检查TTS是否可用?检查设备上是否有特定的软件包(名称)还不够吗?不确定你的确切意思。包可能可用(已安装),但TTS引擎可能未初始化。例如,一些TTS应用程序会在第一次运行时下载实际的语音数据。您好,据我所知,您正在检查TTS是否以不同的方式安装。是否只是检查是否安装了某个包(-name)?我正在检查是否安装了特定的TTS引擎,但如果使用默认的TTS引擎,则无需执行此操作。如果您正在检查TTS数据是否是使用
startActivityForResult()
安装的,则必须在实际活动中使用
onActivityResult()
。关键是,管理器可以托管
TextToSpeech
对象并负责初始化、配置和销毁它,但它仍然必须由活动触发。还有一个问题:是否有一种安全且不同的方法来检查TTS是否可用?检查设备上是否有特定的软件包(名称)还不够吗?不确定你的确切意思。包可能可用(已安装),但TTS引擎可能未初始化。例如,一些TTS应用程序在第一次运行时下载实际的语音数据。
import java.util.Locale;

import android.content.Context;
import android.content.Intent;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;

public class TTSManager
{
private TextToSpeech myTTS;
private boolean readyToSpeak = false;
private Context context;

public TTSManager(Context baseContext)
{
    this.context = baseContext;
}

public void initOrInstallTTS()
{
    myTTS = new TextToSpeech(context, new OnInitListener() 
    {               
        @Override
        public void onInit(int status) 
        {
            if (status == TextToSpeech.SUCCESS)
            {
                myTTS.setLanguage(Locale.US);
                readyToSpeak = true;
            }
            else
                installTTS();
        }
    });
}

private void installTTS()
{
    Intent installIntent = new Intent();
    installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
    context.startActivity(installIntent);
}

public void speak(String text)
{       
    if (readyToSpeak)
        myTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

}