2017-09-11 45 views
1

我在做一个应用程序,使当手机收到电话事情发生,所以很多搜索后,我发现我可以用一个BroadcastReceiverService所以我创建了一个Service称为PhoneStateServiceAndroid - 为什么应用程序崩溃时服务收到来电并且应用程序已关闭?

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.telephony.TelephonyManager; 
import android.widget.Toast; 

public class PhoneStateService extends Service { 

    private static BroadcastReceiver broadcastReceiver; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     registerBroadcastReceiver(); 
    } 

    @Override 
    public void onDestroy() { 
     unregisterReceiver(broadcastReceiver); 
     broadcastReceiver = null; 
    } 

    private void registerBroadcastReceiver() { 
     broadcastReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE); 
       if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){ 
        new PhoneStateHandler().onIncomingCallStarted(context); 
       } 
      } 
     }; 
     IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(broadcastReceiver, filter); 
    } 
} 

这是用于开始PhoneStateService(内侧MainActivity)的代码:从所述Manifest文件

if(PermissionChecker.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PermissionChecker.PERMISSION_GRANTED) { 
     startService(new Intent(getApplicationContext(), PhoneStateService.class)); 
    } 

部分:

<service android:name=".Service.PhoneStateService" /> 

当手机接到电话并且应用程序正在运行(它仍然没有销毁)时,一切正常,但关闭应用程序后,手机接到应用程序崩溃后给我的消息应用已停止工作。

请告诉我是什么问题,我没有找到答案。

编辑:

例外:

09-11 10:26:30.598 29461-29461/? E/AndroidRuntime: FATAL EXCEPTION: main 
               Process: com.multiplies.multiring, PID: 29461 
               java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.SCREEN_OFF flg=0x50000010 } in [email protected] 
                at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:891) 
                at android.os.Handler.handleCallback(Handler.java:739) 
                at android.os.Handler.dispatchMessage(Handler.java:95) 
                at android.os.Looper.loop(Looper.java:148) 
                at android.app.ActivityThread.main(ActivityThread.java:5417) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
                at com.multiplies.multiring.Service.PhoneStateService$1.onReceive(PhoneStateService.java:36) 
                at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:881) 
                at android.os.Handler.handleCallback(Handler.java:739)  
                at android.os.Handler.dispatchMessage(Handler.java:95)  
                at android.os.Looper.loop(Looper.java:148)  
                at android.app.ActivityThread.main(ActivityThread.java:5417)  
                at java.lang.reflect.Method.invoke(Native Method)  
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

编辑:

我做了什么,有人说:

String stateStr = intent.getExtras() != null ? intent.getExtras().getString(TelephonyManager.EXTRA_STATE) : ""; 

把不能解决的问题。 我认为它不会工作,因为如果intent.getExtras()是返回null,则if statement不会因为它返回null工作,它是想TelephonyManager.EXTRA_STATE_RINGING

if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){ 
       new PhoneStateHandler().onIncomingCallStarted(context); 
} 

,但感谢你的帮助。

HUGE EDIT:所述Manifest

部分:

<service android:name=".PhoneState.PhoneStateService" /> 
    <receiver android:name=".PhoneState.PhoneStateBroadcast"> 
    <intent-filter> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter> 
    </receiver> 

PhoneStateBroadcast

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.TelephonyManager; 
import android.util.Log; 

public class PhoneStateBroadcast extends BroadcastReceiver { 

    Context context; 

    public void onReceive(Context context, Intent intent) { 
     this.context = context; 

     try { 

      TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE); 

      switch (telephonyManager.getCallState()) { 

       case TelephonyManager.CALL_STATE_RINGING: 
        context.startService(new Intent(context, PhoneStateService.class)); 
        break; 
      } 


     } catch (Exception e) { 
      Log.e("Phone Receive Error", " " + e); 
     } 

    } 
} 

PhoneStateService

import android.app.IntentService; 
import android.content.Intent; 

public class PhoneStateService extends IntentService { 

    public PhoneStateService(String name) { 
     super(name); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     new PhoneStateHandler().onIncomingCallStarted(getApplicationContext()); 
    } 
} 

此编辑后我仍然崩溃。

+0

分享堆栈跟踪 –

+0

我编辑的问题 –

+0

@AzzamAlsharafi看起来像u有NLE在intent.getExtras()的getString(TelephonyManager。 EXTRA_STATE)检查。 ** intent.getExtras()**为空 – Raghavendra

回答

2

由于某种原因,额外的东西都是空的。您正在做intent.getExtras().XXX,但intent.getExtras()返回null,调用.XXX会引发错误。

更改

String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE); 

String stateStr = intent.getExtras() != null ? intent.getExtras().getString(TelephonyManager.EXTRA_STATE) : ""; 

将阻止发生崩溃,但你可能想看看是什么原因,为什么你期望的额外的,但没有任何的意图。

+0

谢谢,但这意味着,由于某种原因,当应用程序关闭它的返回null,这意味着该服务目前不能工作,如果应用程序关闭,所以如果知道任何东西都可以是有用的,请告诉我。并再次感谢你。 –

+0

您可能想要先尝试一下,也许广播接收器会针对不同的呼叫状态多次调用,并且上述操作会在成功处理您正在查找的某个状态时忽略某些状态。 – Frank

1

而不是运行一个服务所有的时间,使它成为一个BroadcastReciever,它在每次改变呼叫状态时被触发(长时间运行服务不是一个好习惯),因此通过使用Broadcast receiver,你的服务会在你想要的时候运行。

public class PhoneStateService extends BroadcastReceiver{ 

     public void onReceive(Context context, Intent intent) { 
      mContext = context; 

       try { 

        TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE); 
        String deviceId=tm.getDeviceId(); 

        switch (tm.getCallState()) { 

         case TelephonyManager.CALL_STATE_RINGING: // incoming call 

        //do something on Incoming call event 

          break; 

         case TelephonyManager.CALL_STATE_IDLE: //call Ends 

          //do something on Idle phone state i.e set your logic if an incoming call is complete then this block would execute. 


        } 


       } catch (Exception e) { 
        Log.e("Phone Receive Error", " " + e); 
       } 

     } 


    } 

那么这broadcastReciever添加到您的清单下的应用程序标签

<receiver android:name="orbitsys.com.prospect_call.CallerState"> 
       <intent-filter> 
        <action android:name="android.intent.action.PHONE_STATE" /> 
       </intent-filter>