2015-02-14 4 views
0

Я хочу начать другое мероприятие во время входящего звонка в Android. Ниже приведен код, который я нашел на веб-сайте. Код работает идеально, чтобы всплывать окно во время входящего вызова, но когда я пытаюсь запустить Activity, пропуская намерение (missintent), приложение аварийно завершает работу. Примечание. Приложение только сбой во время входящего вызова. Метод, который я называю своим пропуском, отлично работает, когда я звоню в любое другое время, кроме входящего вызова.сбой при работе при запуске Activity во время входящего вызова в android

package com.bitgriff.androidcalls; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.widget.Toast; 

/** 
* Helper class to detect incoming and outgoing calls. 
* @author Moskvichev Andrey V. 
* 
*/ 
public class CallHelper extends Activity{ 

    /** 
    * Listener to detect incoming calls. 
    */ 
    private class CallStateListener extends PhoneStateListener { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      switch (state) { 
      case TelephonyManager.CALL_STATE_RINGING: 
       // called when someone is ringing to this phone 

       Toast.makeText(ctx, 
         "Incoming: "+incomingNumber, 
         Toast.LENGTH_LONG).show(); 
       //app crashes due to following 3 lines. Above toast works perfectly 
       Intent missintent= new Intent(ctx, LEDOnOff.class); 
       missintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(missintent); 
       break; 
      } 
     } 
    } 

    /** 
    * Broadcast receiver to detect the outgoing calls. 
    */ 
    public class OutgoingReceiver extends BroadcastReceiver { 
     public OutgoingReceiver() { 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 

      Toast.makeText(ctx, 
        "Outgoing: "+number, 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

    private Context ctx; 
    private TelephonyManager tm; 
    private CallStateListener callStateListener; 

    private OutgoingReceiver outgoingReceiver; 

    public CallHelper(Context ctx) { 
     this.ctx = ctx; 

     callStateListener = new CallStateListener(); 
     outgoingReceiver = new OutgoingReceiver(); 
    } 

    /** 
    * Start calls detection. 
    */ 
    public void start() { 
     tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); 
     tm.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE); 

     IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL); 
     ctx.registerReceiver(outgoingReceiver, intentFilter); 
    } 

    /** 
    * Stop calls detection. 
    */ 
    public void stop() { 
     tm.listen(callStateListener, PhoneStateListener.LISTEN_NONE); 
     ctx.unregisterReceiver(outgoingReceiver); 
    } 

} 

следующие ошибки LogCat показаны:

02-14 14:10:10.155: D/AndroidRuntime(29294): Shutting down VM 
02-14 14:10:10.155: W/dalvikvm(29294): threadid=1: thread exiting with uncaught exception (group=0x4181eda0) 
02-14 14:10:10.165: E/AndroidRuntime(29294): FATAL EXCEPTION: main 
02-14 14:10:10.165: E/AndroidRuntime(29294): Process: com.bitgriff.androidcalls, PID: 29294 
02-14 14:10:10.165: E/AndroidRuntime(29294): java.lang.NullPointerException 
02-14 14:10:10.165: E/AndroidRuntime(29294): at android.app.Activity.startActivityForResult(Activity.java:3584) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at android.app.Activity.startActivityForResult(Activity.java:3545) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at android.app.Activity.startActivity(Activity.java:3787) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at android.app.Activity.startActivity(Activity.java:3755) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at com.bitgriff.androidcalls.CallHelper$CallStateListener.onCallStateChanged(CallHelper.java:35) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:461) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at android.os.Handler.dispatchMessage(Handler.java:102) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at android.os.Looper.loop(Looper.java:146) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at android.app.ActivityThread.main(ActivityThread.java:5653) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at java.lang.reflect.Method.invokeNative(Native Method) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at java.lang.reflect.Method.invoke(Method.java:515) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
02-14 14:10:10.165: E/AndroidRuntime(29294): at dalvik.system.NativeStart.main(Native Method) 
+0

Сложно сказать, что случилось без журналов. Используйте свой телефон в качестве эмулятора, и попробуйте, он даст вам журналы. – Psypher

+1

Я добавил выходы logcat. –

+0

'NullPointerException' сообщает вам, что вы пытаетесь разыменовать указатель, который является нулевым. Трассировка стека далее сообщает вам, что это происходит в 'CallHelper.java' в строке 35. Проверьте эту строку, чтобы узнать, какая переменная может быть нулевой. – Henry

ответ

1

Кажется, вы экземпляр класса CallHelper вручную. Поскольку он наследуется от Activity, вы никогда не должны этого делать. Рамки всегда начинаются.

Существует две возможности: либо CallHelper играет роль активности, а затем позволяет создать экземпляр рамки или нет (что, как представляется, здесь), то оно не должно наследоваться от Activity.

+1

Можете ли вы уточнить свой ответ? Я не понял. Это будет очень хорошо, если вы сможете сказать мне решение. –

+1

Спасибо. Наконец, теперь он работает правильно. CallHelper больше не распространяется на Activity. –