8

TextToSpeechで1つのアプリケーションを作成しています。しかし、実行しようとすると、次の行で例外がスローされます。

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

これが参考のための私の完全なコードです
。ヒントを教えてください。コードのどこが悪いのかわかりません。コードをコンパイルすると、すべての値が正しく渡されますが、ttsオブジェクトの上にジャンプすると、nullポインター例外が発生します。構文が間違っていますか?最初にonCreate()またはonActivityResultを呼び出すメソッドはどれですか?前もって感謝します

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)
4

4 に答える 4

10

書きます

tts = new TextToSpeech(this, this);

onCreate()メソッドのifループで。

于 2012-04-10T10:06:14.737 に答える
3

Dhruvishaとandybootが示唆しいるように、NullPointerExceptionは、のonCreate前に実行されるため明らかonActivityResultです。tts私の提案は、チェック後に使用するすべてのコードをプロシージャに持ち込むことです。これが私の提案コードです:

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

              }       
        }
    }

}
于 2012-04-13T03:07:06.440 に答える
2

onCreateはonActivityResultの前に実行されませんか?

したがって、ttsオブジェクトはnullになります。tts.speakを呼び出す前に、ttsがnullでないことを確認するためのコードを追加します

于 2012-04-08T10:44:47.097 に答える
0

この行をコピーする必要があります

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

そして、あなたが書いた直後に書いてくださいsetContentView()

これは、オブジェクトで何かを行う前にTextToSpeach、データがインストールされているかどうかを確認する必要があるためです。

したがって、コードの間違いは、呼び出しexampleの前に書いたという点で、すべて新しいものを書いたことです。intent

于 2012-04-13T12:53:53.590 に答える