2012-04-08 8 views
6

Tôi đang tạo một ứng dụng trên TextToSpeech. Nhưng khi tôi cố gắng chạy, nó ném ngoại lệ trên dòng sau.TextToSpeech hiển thị Null Pointer Exception?

tts.speak(ruleOne, TextToSpeech.QUEUE_ADD, null); 

Here is my full code for reference
Xin vui lòng cho tôi bất kỳ gợi ý. Tôi không hiểu sai mã của mình. khi tôi biên dịch mã của tôi tất cả các giá trị vượt qua một cách chính xác nhưng khi nó nhảy trên tts đối tượng nó nhấn con trỏ ngoại lệ null. là bất kỳ cú pháp là sai? phương thức nào gọi đầu tiên onCreate() hoặc onActivityResult? Cảm ơn bạn đã Advance

Đây là nội dung của Logcat.

04-10 13:58:34.082: WARN/System.err(19352): java.lang.NullPointerException 
04-10 13:58:34.082: WARN/System.err(19352):  at com.example.examguide.ExamRulesActivity.onCreate(ExamRulesActivity.java:60) 
04-10 13:58:34.082: WARN/System.err(19352):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-10 13:58:34.092: WARN/System.err(19352):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
04-10 13:58:34.092: WARN/System.err(19352):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
04-10 13:58:34.092: WARN/System.err(19352):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
04-10 13:58:34.092: WARN/System.err(19352):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
04-10 13:58:34.092: WARN/System.err(19352):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-10 13:58:34.092: WARN/System.err(19352):  at android.os.Looper.loop(Looper.java:123) 
04-10 13:58:34.092: WARN/System.err(19352):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-10 13:58:34.102: WARN/System.err(19352):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-10 13:58:34.102: WARN/System.err(19352):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-10 13:58:34.102: WARN/System.err(19352):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-10 13:58:34.102: WARN/System.err(19352):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-10 13:58:34.102: WARN/System.err(19352):  at dalvik.system.NativeStart.main(Native Method) 
+0

Vui lòng đăng toàn bộ dấu vết. –

+0

@LukasKnuth tại đây tôi thêm Logcat –

Trả lời

9

ghi

tts = new TextToSpeech(this, this); 

trong phương pháp nếu vòng lặp trong onCreate() của bạn.

2

Không phải là onCreate chạy trước onActivityResult?

Vì vậy, đối tượng tts của bạn sẽ không có giá trị. Thêm mã để kiểm tra tts là bắt buộc trước khi bạn gọi tts.speak

+0

cảm ơn ..... Cách giải quyết vấn đề này? –

+0

xin đề nghị thay đổi trong mã số của tôi –

+0

làm như Dhruvisha nói –

3

Như Dhruvishaandy boot đề nghị, các NullPointerException là rõ ràng bởi vì onCreate được thực hiện trước khi onActivityResult. Đề xuất của tôi là đưa tất cả mã của bạn sử dụng tts vào quy trình sau khi kiểm tra. Đây là tôi đề nghị mã:

@Override 
    public void onCreate(Bundle me) 
    { 
     super.onCreate(me); 
     setContentView(R.layout.examrules); 
       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 
       tts = new TextToSpeech(this, this); 
       this.speak(); 
      } 
      else { 
       // missing data, install it 
       Intent installIntent = new Intent(); 
       installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 

       //tts.isLanguageAvailable(Locale.INDIA_HINDI); 
       startActivity(installIntent); 

      } 
     } 

    } 

    @Override 
    public void onInit(int status) 
    {   
     if (status == TextToSpeech.SUCCESS) 
     { 
      // tts.setLanguage(Locale.US); 

      Locale loc = new Locale ("IN", "en"); 
      tts.setLanguage(loc); 
      Toast.makeText(ExamRulesActivity.this, 
        "Text-To-Speech engine is initialized", Toast.LENGTH_LONG).show(); 
     } 
     else if (status == TextToSpeech.ERROR) 
     { 
      Toast.makeText(ExamRulesActivity.this, 
        "Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show(); 
     } 
    } 

    public void speak() { 
     int isVoiceEnabled=bundle.getInt("isVoiceEnabled"); 
     setResult(RESULT_OK, intent);  
     if(isVoiceEnabled==1) 
     { 
      String ruleOne="hi."; 
      String ruleTwo= "How are you"; 
      String ruleThree= "will you meet e=me?"; 
      String ruleFour= " No,Ok"; 
        if (ruleOne!=null && ruleOne.length()>0) 
      { 
      tts.speak(ruleOne, TextToSpeech.QUEUE_ADD, null); 
      tts.speak(ruleTwo, TextToSpeech.QUEUE_ADD, null); 
       tts.speak(ruleThree, TextToSpeech.QUEUE_ADD, null); 
      tts.speak(ruleFour, TextToSpeech.QUEUE_ADD, null); 

       }  
     } 
    } 

} 
0

Bạn chỉ cần copy dòng này

Intent checkIntent = new Intent(); 
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); 

Và Viết sau đó ngay sau khi bạn đã viết setContentView()

Đó Bởi vì trước khi làm bất cứ điều gì với đối tượng TextToSpeach Bạn cần kiểm tra xem dữ liệu có được cài đặt hay không.

Vì vậy, sai lầm trong mã là bạn đã viết mọi thứ mới trong đó example bạn đã viết nó trước cuộc gọi intent.