2012-02-11 47 views
0

我已經創建了一個android應用程序,它在將音頻接口添加到它之前工作良好。對於我所遵循的tts教程this link適用於Android應用的tts

教程代碼工作正常。但是當我在代碼中使用它時,我得到了Null pointer exception at tts.speak(s, TextToSpeech.QUEUE_FLUSH, null);行。請幫我解決這個問題。我相信這個問題不在字符串s中,我已經檢查過了。

public class TimerActivity extends Activity implements OnInitListener { 

    /** Called when the activity is first created. */ 

    Handler mhandler = new Handler(); 

    Button mybtn[] = new Button[12]; 

    Button select_btn, home_btn; 

    EditText et; 

    Bundle b; 

    int var = 0; 

    private int MY_DATA_CHECKCODE = 0; 

    private TextToSpeech tts; 


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

     select_btn = (Button) findViewById(R.id.ok); 
     home_btn = (Button) findViewById(R.id.home); 
     et = (EditText) findViewById(R.id.entry); 
     et.setText("", TextView.BufferType.EDITABLE); 
     b = new Bundle(); 

     for (int i = 0; i < mybtn.length; i++) { 
      String btnid = "btn" + i; 
      int resid = getResources().getIdentifier(btnid, "id", 
        getPackageName()); 
      mybtn[i] = (Button) findViewById(resid); 
     } 

     mybtn[var].requestFocus(); 
     Intent checkin = new Intent(); 
     checkin.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(checkin, MY_DATA_CHECKCODE); 

     select_btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // Perform action on click 

       Button bt; 
       bt = (Button) getCurrentFocus(); 

       if (bt.equals(mybtn[10])) { 
        String s = et.getText().toString(); 
        int l = s.length(); 

        if (l > 0) { 
         String t; 
         if (l > 1) 
          t = s.substring(0, l - 1); 
         else 
          t = ""; 

         et.setText(t, TextView.BufferType.EDITABLE); 
        } 

       } 

       else if (bt.equals(mybtn[11])) { 

        Intent in = new Intent(TimerActivity.this, Calling.class); 
        String s = et.getText().toString().trim(); 
        b.putString("number", s); 
        in.putExtras(b); 
        if (s != null && s.length() > 0) { 
         tts.speak(s, TextToSpeech.QUEUE_ADD, null); 
         startActivity(in); 
         finish(); 
        } 

        // else say enter a valid number 
       } 
       // CharSequence cs= bt.getText(); 
       // if(cs.equals(0)) 
       // et.setText("121"); 
       // else 
       // if(!(bt.equals(0))) 
       else 
        et.setText(et.getText() + "" + bt.getText(), 
          TextView.BufferType.EDITABLE); 
       // else 
       // et.setText("google",TextView.BufferType.EDITABLE); 
      } 
     }); 

     home_btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // Perform action on click 

       finish(); 
      } 
     }); 

     final Runnable mUpdateTimeTask = new Runnable() { 
      public void run() { 
       // final long start= System.currentTimeMillis(); 
       // mhandler.removeCallbacks(this); 
       // et.setText("i am the man"); 

       mybtn[var].requestFocus(); 
       String s = mybtn[var].getText().toString(); 
       s = "abcd"; 
       if (s != null && s.length() > 0) 
        tts.speak(s, TextToSpeech.QUEUE_FLUSH, null); 
       var = (var + 1) % 12; 
       // mybtn[var].requestFocus(); 

       mhandler.postDelayed(this, 2000); 

      } 
     }; 

     mhandler.postDelayed(mUpdateTimeTask, 100); 

    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == MY_DATA_CHECKCODE) { 
      if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
       // success, create the TTS instance 
       tts = new TextToSpeech(this, this); 
       tts.setLanguage(Locale.US); 
      } 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) { 
     // TODO Auto-generated method stub 

     if (status == TextToSpeech.SUCCESS) { 
      Toast.makeText(TimerActivity.this, 
        "Text-To-Speech engine is initialized", Toast.LENGTH_LONG) 
        .show(); 
     } else if (status == TextToSpeech.ERROR) { 
      Toast.makeText(TimerActivity.this, 
        "Error occurred while initializing Text-To-Speech engine", 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

} 
+0

你檢查了tts嗎?可能onActivityResult()中的初始化尚未完成,並且tts仍然爲空。 – Stefan 2012-02-11 10:33:25

+0

我在開始時使用了tts = null,並嘗試使用tts.equals(0)來檢查它是否爲null。但在檢查期間它也會返回NUll指針異常。有什麼可以解決這個問題。 – 2012-02-11 10:38:56

+0

要檢查tts是否爲空,請不要使用tts.equals(0)。首先null和0是不同的對象(和類型!),其次如果tts爲null,則不能調用equals()。使用這個表達式:tts == null 但是你的實驗表明tts是空的! – Stefan 2012-02-11 10:43:58

回答

0

在打電話之前完成(),您需要調用tts.shutdown()來告訴你的Android不使用它了。你應該可以調用onDestroy()。這樣做會在應用程序關閉後停止揚聲器。