我想创建一个应用程序,在 ListView 中显示来自本地数据库的数据,让您将字符串添加到数据库,然后读取选择的任何单词。出于面向对象的目的,我想要一个可重用的 TTS 对象。
目前一切都已实现,如果我在 ListView 中选择一个单词,该条目将显示为一个 toast,这意味着我有一个单词字符串。
问题:当我创建我的 TTS 对象时,我得到一个 NullPointerException。
下面的代码显示了当 ListView 中的一个条目被选中时会发生什么:
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Cursor cursor = (SQLiteCursor) list.getItemAtPosition(position);
String title = cursor.getString(1);
Toast.makeText(getApplicationContext(), "selected: " + title , Toast.LENGTH_SHORT).show();
//--> App chrashes here
AndroidTextToSpeechActivity attsa = new AndroidTextToSpeechActivity();
attsa.speakOut(title);
}
}); }
这是日志猫:
07-22 20:25:58.718: W/dalvikvm(18373): threadid=1: 线程退出未捕获异常 (group=0x40a6b1f8) 07-22 20:25:58.738: E/AndroidRuntime(18373): 致命异常: main 07-22 20:25:58.738: E/AndroidRuntime(18373): java.lang.NullPointerException 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 android.content.ContextWrapper.getPackageName(ContextWrapper.java: 127) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 android.speech.tts.TextToSpeech.(TextToSpeech.java:545) 07-22 20:25:58.738: E/AndroidRuntime(18373):在 android.speech.tts.TextToSpeech.(TextToSpeech.java:522) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 android.speech.tts.TextToSpeech.(TextToSpeech.java:507) 07- 22 20:25:58.738: E/AndroidRuntime(18373): at eu.tuts.dbexample.obj.AndroidTextToSpeechActivity.(AndroidTextToSpeechActivity.java:20) 07-22 20:25:58.738:E/AndroidRuntime(18373):在 eu.tuts.dbexample.activities.Datenbanken$1.onItemClick(Datenbanken.java:79) 07-22 20:25:58.738:E/AndroidRuntime(18373):在 android。 widget.AdapterView.performItemClick(AdapterView.java:292) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 android.widget.AbsListView.performItemClick(AbsListView.java:1060) 07-22 20:25: 58.738: E/AndroidRuntime(18373): 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:2516) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 android.widget.AbsListView$1。运行(AbsListView.java:3170) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 android.os.Handler.handleCallback(Handler.java:605) 07-22 20:25:58.738: E/ AndroidRuntime(18373): 在 android.os.Handler.dispatchMessage(Handler.java:92) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 android.os。Looper.loop(Looper.java:137) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 android.app.ActivityThread.main(ActivityThread.java:4575) 07-22 20:25:58.738: E/AndroidRuntime(18373): at java.lang.reflect.Method.invokeNative(Native Method) 07-22 20:25:58.738: E/AndroidRuntime(18373): at java.lang.reflect.Method.invoke(Method. java:511) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 dalvik.system.NativeStart.main (本机方法)E/AndroidRuntime(18373): at java.lang.reflect.Method.invokeNative(Native Method) 07-22 20:25:58.738: E/AndroidRuntime(18373): at java.lang.reflect.Method.invoke(Method. java:511) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 dalvik.system.NativeStart.main (本机方法)E/AndroidRuntime(18373): at java.lang.reflect.Method.invokeNative(Native Method) 07-22 20:25:58.738: E/AndroidRuntime(18373): at java.lang.reflect.Method.invoke(Method. java:511) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 dalvik.system.NativeStart.main (本机方法)58.738: E/AndroidRuntime(18373): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 dalvik.system.NativeStart .main(本机方法)58.738: E/AndroidRuntime(18373): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 07-22 20:25:58.738: E/AndroidRuntime(18373): 在 dalvik.system.NativeStart .main(本机方法)
这是 TTS 对象的完整源代码。抱歉发布完整的Sorcecode - 我不知道错误发生在哪里。
package eu.tuts.dbexample.obj;
import java.util.Locale;
import eu.tuts.dbexample.R;
import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class AndroidTextToSpeechActivity extends Activity implements TextToSpeech.OnInitListener {
/** Called when the activity is first created. */
private TextToSpeech tts = new TextToSpeech(this, this);
@Override
public void onDestroy() {
// Don't forget to shutdown tts!
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
}
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.US);
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "This Language is not supported");
} else {
//speakOut();
Log.d("TTS", "TTS init okay");
}
} else {
Log.e("TTS", "Initilization Failed!");
}
}
public void speakOut(String text) {
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}