Android приложение вылетает, когда я запускаю его на виртуальной машине API 30 Android - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь сделать что-то, что преобразует текст, который я пишу в EditText, в речь, когда я нажимаю button01. Он отлично работает на виртуальной машине с Android API 23, но вылетает и создает исключение NullPointerException, а на виртуальной машине с Android API 30 происходит сбой. Вот код:

public MainActivity() {
}

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

    editText = (EditText) findViewById(R.id.editText);
    button01 = (Button) findViewById(R.id.button01);
    final TextView textView1 = (TextView) findViewById(R.id.text1) ;
    textView1.setText("\n");

    tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if(status != ERROR) {
                // 언어를 선택한다.
                tts.setLanguage(Locale.ENGLISH);
            } else {
                textView1.setText("TTS 작업에 오류가 생기거나 지원되지 않는 언어입니다.");
                tts.speak("TTS 작업에 오류가 생기거나 지원되지 않는 언어입니다.", TextToSpeech.STOPPED, null);
            }
        }
    });

    button01.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // editText에 있는 문장을 읽는다.
            tts.speak(editText.getText().toString(), TextToSpeech.QUEUE_FLUSH, null);
        }
    });
}

@Override
protected void onDestroy() {
    super.onDestroy();
    // TTS 객체가 남아있다면 실행을 중지하고 메모리에서 제거한다.
    if(tts != null){
        tts.stop();
        tts.shutdown();
        tts = null;
    }
}

} Когда я просмотрите Logcat, он показывает это:

2020-07-09 02:10:56.036 7700-7700/com.example.myapplication2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication2, PID: 7700
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication2/com.example.myapplication2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.speech.tts.TextToSpeech.speak(java.lang.String, int, java.util.HashMap)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.speech.tts.TextToSpeech.speak(java.lang.String, int, java.util.HashMap)' on a null object reference
    at com.example.myapplication2.MainActivity$1.onInit(MainActivity.java:42)
    at android.speech.tts.TextToSpeech.dispatchOnInit(TextToSpeech.java:836)
    at android.speech.tts.TextToSpeech.initTts(TextToSpeech.java:814)
    at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:745)
    at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:724)
    at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:708)
    at com.example.myapplication2.MainActivity.onCreate(MainActivity.java:34)
    at android.app.Activity.performCreate(Activity.java:7995)
    at android.app.Activity.performCreate(Activity.java:7979)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:223) 
    at android.app.ActivityThread.main(ActivityThread.java:7656) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

1 Ответ

0 голосов
/ 08 июля 2020

Это происходит в части else в onInit вашего слушателя. Когда произошла ошибка при инициализации экземпляра TextToSpeech, onInit будет вызываться с ERROR в качестве ввода, а tts еще не инициализирован и равен null.

Это может произойти, когда ваш устройство не поддерживает преобразование текста в речь или в движке отсутствуют необходимые данные.

Не звонить на tts в случае ошибки. (Произошла ошибка при преобразовании текста в речь. Итак, как он может озвучивать ваш текст?!)

...