2013-02-13 158 views
0

我正在創建一個涉及短信的android應用程序,其中一個功能是在輸入時讀出每個字母。我正在使用TextToSpeechTextToSpeech拋出一個未知的異常

我有它在一個測試項目工作但將其集成到我自己,當我收到未知異常

任何人都可以看到什麼可能導致這種情況,並建議一種補救措施?我創建了一個叫做speech的類,它在另一個類中實例化,並且有一個調用方法(類似於下面的第二個例子)。任何人都可以解釋爲什麼我需要在第一個例子中擴展Activity嗎?同樣有問題的一行說「新TextToSpeech未定義」

代碼無法工作。錯誤是tts = new TextToSpeech(this, this);

public class Speech extends Activity implements TextToSpeech.OnInitListener { 

    private TextToSpeech tts; 
    private String toRead; 

    public Speech(String toRead){ 

     this.toRead = toRead; 
     tts = new TextToSpeech(this, this); 
    } 

這裏是哪裏它的工作

public class MainActivity extends Activity implements 
     TextToSpeech.OnInitListener { 
    /** Called when the activity is first created. */ 

    private TextToSpeech tts; 
    private Button btnSpeak; 
    private EditText txtText; 

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

     tts = new TextToSpeech(this, this); 

     btnSpeak = (Button) findViewById(R.id.btnSendSMS); 

     txtText = (EditText) findViewById(R.id.txtMessage); 

     // button on click event 
     btnSpeak.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View arg0) { 
       speakOut(); 
      } 

     }); 
    } 

    @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 { 
       btnSpeak.setEnabled(true); 
       speakOut(); 
      } 

     } else { 
      Log.e("TTS", "Initilization Failed!"); 
     } 

    } 

    private void speakOut() { 

     String text = txtText.getText().toString(); 

     tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); 
    } 
} 

logcat的信息

02-13 20:00:54.974: D/AndroidRuntime(11127): Shutting down VM 
02-13 20:00:54.974: W/dalvikvm(11127): threadid=1: thread exiting with uncaught exception (group=0x411cd300) 
02-13 20:00:54.979: E/AndroidRuntime(11127): FATAL EXCEPTION: main 
02-13 20:00:54.979: E/AndroidRuntime(11127): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.BT/org.BT.Text_entry}: java.lang.NullPointerException 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2024) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.app.ActivityThread.access$600(ActivityThread.java:140) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.os.Looper.loop(Looper.java:137) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.app.ActivityThread.main(ActivityThread.java:4898) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at java.lang.reflect.Method.invokeNative(Native Method) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at java.lang.reflect.Method.invoke(Method.java:511) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at dalvik.system.NativeStart.main(Native Method) 
02-13 20:00:54.979: E/AndroidRuntime(11127): Caused by: java.lang.NullPointerException 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:91) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.speech.tts.TtsEngines.getDefaultEngine(TtsEngines.java:75) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.speech.tts.TextToSpeech.getDefaultEngine(TextToSpeech.java:1235) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.speech.tts.TextToSpeech.initTts(TextToSpeech.java:595) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:553) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:527) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:512) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at org.BT.Speech.<init>(Speech.java:17) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at org.BT.Text_entry.<init>(Text_entry.java:48) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at java.lang.Class.newInstanceImpl(Native Method) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at java.lang.Class.newInstance(Class.java:1319) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.app.Instrumentation.newActivity(Instrumentation.java:1057) 
02-13 20:00:54.979: E/AndroidRuntime(11127): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2015) 
02-13 20:00:54.979: E/AndroidRuntime(11127): ... 11 more 

代碼-------------- - - - - - - - - - - - - - -編輯 - - - - - - - - - - - --------------------------------- 進一步的研究表明,這可能是因爲我試圖在Android框架之外一個Android上下文?這可能是真的 - 因爲我正在使用一個類而不是一個活動?如果是的話,我會怎樣解決這個問題?

+1

您可以粘貼堆棧跟蹤日誌嗎?這會提供一個更好的主意。 – 2013-02-13 19:47:02

+0

已發佈Logcat信息...這是你需要什麼? – user2052839 2013-02-13 20:02:46

回答

0

這就是我要做的事..

public class TextToSpeechActivity extends Activity implements TextToSpeech.OnInitListener 
{ 
private TextToSpeech mTts; 
// This code can be any value you want, its just a checksum. 
private static final int MY_DATA_CHECK_CODE = 1234; 

/** 
* Called when the activity is first created. 
*/ 
@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 speakClicked(View v) 
{ 
// grab the contents of the text box. 
EditText editText = (EditText) findViewById(R.id.inputText); 

mTts.speak(editText.getText().toString(),TextToSpeech.QUEUE_FLUSH, null); 
} 

public void onInit(int i) 
{ 

} 
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); 
} 
} 
} 

@Override 
public void onDestroy() 
{ 
if (mTts != null) 
{ 
mTts.stop(); 
mTts.shutdown(); 
} 
super.onDestroy(); 
} 
} 
+0

這不會改變屏幕?我只想把講話課作爲一個支持類,它可以在我的主類中實例化,並且只需要一個公共方法,它將執行語音指令 – user2052839 2013-02-13 20:42:45

0

這看起來對我的文字轉語音的合成(TTS)標準的例子,可以在互聯網上隨處可見,它應該爲這樣的工作沒有任何問題。 (然而,這並不意味着沒有任何設計問題的代碼這個例子。)

也許你正在使用Android的版本太舊或者說,TTS還沒有正確設置你的電話?您是否在手機上檢查了TTS的設置? (通常情況下,如果您的手機沒有正確設置TTS,此代碼應該打電話給正確的安裝頁面,但我記得看到一條消息,表明此部件有時可能會被炸出。)

您還應該檢查txtText在與findViewById()初始化後不爲空。

+0

本質上就是這樣。該版本完美工作,但它是第一個代碼片段 - 我試圖在一個標準的Java類中使用它,問題在於 – user2052839 2013-02-14 02:45:04

+0

您是在Android系統上還是在其他地方使用它? – SylvainL 2013-02-14 05:25:44

+0

它被創建爲一個android應用程序,並在android手機和仿真器上運行。標準TTS(代碼片段2)工作100%很好 - 只是將它放在標準類(代碼段1)中才會出現問題 – user2052839 2013-02-14 12:44:47