我正在 Android 中开发一个简单的应用程序,我在 TextToSpeech 方面遇到问题。
应用程序必须使用 TextToSpeech 发音字母和数字,但有一个问题,默认情况下设备使用 PicoTTS 我希望他们被迫使用 google tts 引擎。
我怎样才能做到这一点?
我的代码:
@SuppressLint("NewApi")
public class LearnAlphabet extends Activity {
Button howto, number, alphabet;
public TextToSpeech tts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.learn_number);
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#0170a5")));
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new NumberFunction(this));
final String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();
tts = new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR){
switch (locale.toString()) {
case "it":
tts.setLanguage(new Locale("it_IT"));
break;
case "en":
tts.setLanguage(new Locale("en_US"));
break;
case "es":
tts.setLanguage(new Locale("es_ES"));
break;
case "de":
tts.setLanguage(new Locale("de_NL"));
break;
case "ru":
tts.setLanguage(new Locale("ru_RU"));
break;
default:
tts.setLanguage(new Locale("en_US"));
break;
}
}
}
});
}
对于每个字母或数字:
tts.speak(getResources().getString(R.string.a), TextToSpeech.QUEUE_FLUSH, null);
**** 编辑 ***** 如果我设置错误: tts.setEngineByPackageName(“com.google.android.tts”)
12-11 15:52:04.954: E/AndroidRuntime(12203): FATAL EXCEPTION: main
12-11 15:52:04.954: E/AndroidRuntime(12203): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.imparafacile/com.imparafacile.LearnAlphabet}: java.lang.NullPointerException
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2311)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.access$600(ActivityThread.java:149)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.os.Handler.dispatchMessage(Handler.java:99)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.os.Looper.loop(Looper.java:137)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.main(ActivityThread.java:5214)
12-11 15:52:04.954: E/AndroidRuntime(12203): at java.lang.reflect.Method.invokeNative(Native Method)
12-11 15:52:04.954: E/AndroidRuntime(12203): at java.lang.reflect.Method.invoke(Method.java:525)
12-11 15:52:04.954: E/AndroidRuntime(12203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
12-11 15:52:04.954: E/AndroidRuntime(12203): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
12-11 15:52:04.954: E/AndroidRuntime(12203): at dalvik.system.NativeStart.main(Native Method)
12-11 15:52:04.954: E/AndroidRuntime(12203): Caused by: java.lang.NullPointerException
12-11 15:52:04.954: E/AndroidRuntime(12203): at com.imparafacile.LearnAlphabet.onCreate(LearnAlphabet.java:47)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.Activity.performCreate(Activity.java:5133)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2225)
抛出 NPE 是因为调用 tts.setEngineByPackageName() 时 tts 对象为 null。
在onInit()
成功返回之前,tts不会被创建,所以你应该在
onInit()
中调用tts.setEngineByPackageName():
String googleTtsPackage = "com.google.android.tts", picoPackage = "com.svox.pico";
tts = new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR){
if(!isPackageInstalled(getPackageManager(), googleTtsPackage))
confirmDialog();
else myTTS.setEngineByPackageName(googleTtsPackage);
}
private void confirmDialog(){
AlertDialog.Builder d = new AlertDialog.Builder(LearnAlphabet.this);
d.setTitle("Install recommeded speech engine?");
d.setMessage("Your device isn't using the recommended speech engine. Do you wish to install it?");
d.setPositiveButton("Yes", new android.content.DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int arg1){
Intent installVoice = new Intent(Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installVoice);
}});
d.setNegativeButton("No, later", new android.content.DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int arg1){
if(isPackageInstalled(context.getPackageManager(), picoPackage))
myTTS.setEngineByPackageName(picoPackage);
}
});
d.show();
}
public static boolean isPackageInstalled(PackageManager pm, String packageName) {
try {
pm.getPackageInfo(packageName, 0);
} catch (NameNotFoundException e) {
return false;
}
return true;
}
如果您不希望重定向用户安装未安装的 google TTS 引擎,则可以删除confirmDialog()
我无法进行语音数据,所以我听不到我的字典,请你帮助我
P