2016-12-09 5 views
0

Die MicrohonePopUp-Methode wird in MainActivity funktionieren, aber ich möchte, dass es von einer anderen Klasse (MediaButtonIntentReceiver) funktioniert. Das Problem ist mit startActivityForResult (intent, REQUEST_CODE); - aber ich weiß nicht, wie ich es lösen soll.android.app.ActivityThread.getApplicationThread() 'auf einem Nullobjekt Referenz

in der Klasse MainActivity

public void microphonePopUp(){ 
     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
       RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Voice your answer"); 
     startActivityForResult(intent, REQUEST_CODE); 
    } 

in der Klasse MediaButtonIntentReceiver

public class MediaButtonIntentReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
      KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
      if (KeyEvent.KEYCODE_HEADSETHOOK == event.getKeyCode()) { 
       MainActivity test = new MainActivity(); 
       test.microphonePopUp(); 
      } 
     } 
    } 
} 

12-09 11: 20: 19.556 bis 19.556 14,803/com.timtennyson.priceaddition E/Android Runtime: FATALE AUSNAHME: Haupt Prozess: com.timtennyson.priceaddition, PID: 19556 java.lang.RuntimeException: nicht zu sta rt Empfänger com.timtennyson.priceaddition.MediaButtonIntentReceiver: java.lang.NullPointerException: Versuch 'android.app.ActivityThread $ ApplicationThread android.app.ActivityThread.getApplicationThread()' auf ein Null-Objekt Referenz virtuelle Methode aufzurufen bei android.app.ActivityThread.handleReceiver (ActivityThread.java:3641) bei android.app.ActivityThread.access $ 2000 (ActivityThread.java:221) um android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1876) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Loope r.loop (Looper.java:158) bei android.app.ActivityThread.main (ActivityThread.java:7224) bei java.lang.reflect.Method.invoke (native Methode) um com.android.internal. os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1230) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120) verursacht durch: java.lang.NullPointerException: Versuch virtuellen Methode aufzurufen 'android.app.ActivityThread $ ApplicationThread android.app.ActivityThread.getApplicationThread()' auf einem Nullobjekt Referenz bei android.app.Activity.startActivityForResult (Activity.java:4283) bei android.app.Activity.startActivityForResult (Activity.java:4230) bei android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:842) bei com.timtennyson.priceaddition.MainActivity.microphonePopUp (MainActivity.java:103) bei com.timtennyson.priceaddition.MediaButtonIntentReceiver.onReceive (MediaButtonIntentReceiver.java:27) bei android.app.ActivityThread.handleReceiver (ActivityThread.java:3634) bei android.app.ActivityThread.access $ 2000 (ActivityThread.java:221) bei android.app.A ctivityThread $ H.handleMessage (ActivityThread.java:1876) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:158) bei android.app. ActivityThread.main (ActivityThread.java:7224) bei java.lang.reflect.Method.aufrufen (native Methode)

Antwort

1

NIE eine Instanz einer Aktivität, eine Dienstleistung oder Anbieter selbst erstellen.

Wenn Ihr Ziel ist es für ACTION_MEDIA_BUTTON Sendungen zu hören, während MainActivity sichtbar ist:

  • Verschieben MediaButtonIntentReceiver innerhalb einer geschachtelten Klasse zu sein von MainActivity

  • Befreien Sie sich von test von onReceive(), und nur Anruf microphonePopUp() (was ich nehme, ist eine Methode auf MainActivity)

  • Registrieren MediaButtonIntentReceiverregisterReceiver() in onStart() von MainActivity verwenden und verwenden unregisterReceiver() in onStop()

Wenn Ihr Ziel ACTION_MEDIA_BUTTON Sendungen an anderen Punkten in der Zeit zu hören ist — von Ihrem Empfänger im Manifest — Registrierung während Sie tun können, dass , Sie können microphonePopUp() nicht von diesem Empfänger verwenden.

+0

Wenn MediaButtonIntentReveiver kein Verfahren in MainActivity verwenden kann, gibt es eine Möglichkeit, eine Fahne von MediaButtonIntentReceiver zu MainActivity für MainActivity setzen die Methode MicrophonePopUp zu benutzen? – timmyt123

+0

@ timmyt123: Wenn es Ihr Ziel ist, auf 'ACTION_MEDIA_BUTTON'-Broadcasts zu hören, während 'MainActivity' sichtbar ist, können Sie gerne einen Event-Bus (z. B.' LocalBroadcastManager') verwenden, damit der Empfänger der Aktivität mitteilt, etwas zu tun. Sie müssten jedoch 'registerReceiver()'/'unregisterReceiver()' verwenden. Wenn Ihr Ziel es ist, zu anderen Zeiten ACTION_MEDIA_BUTTON-Sendungen zu hören, gibt es möglicherweise keine MainActivity-Instanz, mit der Sie arbeiten können. – CommonsWare

+0

Ich habe eine Taste, um den MikrofonPopUp zu verwenden, aber ich möchte auch, dass die Media-Taste auch das MikrofonPopUp auslösen kann. Ja, ich habe einen Empfänger in OnResume() registrieren und Empfänger in OnPause() aufheben. – timmyt123

-1

Ich konfrontiert das gleiche Problem. Ich denke es liegt an Multithreading. Aber ich habe es irgendwie gelöst. Erweitern Sie die ASyncTask-Klasse. Sie müssen dafür eine doInBackground-Methode überschreiben. Gib einfach null zurück. Dein Problem wird gelöst. Die Dokumentation für AsyncTask Klasse ist unter dem genannten Link: https://developer.android.com/reference/android/os/AsyncTask.html

+0

Willkommen bei StackOverflow!Können Sie ein Codebeispiel oder einen Link zur Dokumentation in Ihre Antwort einfügen? –

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/17159632) –

Verwandte Themen