我的BroadcastReceiver无法接收电话状态变化

时间:2015-11-23 07:30:25

标签: android broadcastreceiver

接收器在manifest.xml中定义:

  <receiver android:name=".PhoneStateBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE"/>
            <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
        </intent-filter>
    </receiver>

和接收器非常简单:

    public class PhoneStateBroadcastReceiver extends BroadcastReceiver{
          ...
           public void onReceive(){
                 Log.d("receiver","called");
           }
    }

我将intent-filter替换为我自己定义的自定义过滤器,并使用&#34; sendbroadcast()&#34;发送广播。 ,它运作良好,但无法接收电话状态广播,问题出在哪里? 感谢

ps:

  <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

这是我的许可,测试是在两个模拟器android 6.0上。

1 个答案:

答案 0 :(得分:0)

以下是如何执行此操作的示例:

public class PhoneStatReceiver extends BroadcastReceiver{        

        private static final String TAG = "PhoneStatReceiver"; 

        private static boolean incomingFlag = false;

        private static String incoming_number = null;

        @Override
        public void onReceive(Context context, Intent intent) {
           if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){                        

           incomingFlag = false;

           String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);        

            Log.i(TAG, "call OUT:"+phoneNumber);                        

           }
           else{                        
              TelephonyManager tm =(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);                                                  

              switch (tm.getCallState()) {

                        case TelephonyManager.CALL_STATE_RINGING:

                               incomingFlag = true;

                                incoming_number = intent.getStringExtra("incoming_number");

                                Log.i(TAG, "RINGING :"+ incoming_number);

                                break;

                        case TelephonyManager.CALL_STATE_OFFHOOK:                                

                                if(incomingFlag){

                                        Log.i(TAG, "incoming ACCEPT :"+ incoming_number);

                                }

                                break;
                        case TelephonyManager.CALL_STATE_IDLE:                                

                                if(incomingFlag){

                                        Log.i(TAG, "incoming IDLE");                                

                                }

                                break;

                        } 

                }

        }

}

AndroidManifest.xml

中注册
<receiver android:name=".filter.PhoneStatReceiver">  

            <intent-filter>

                 <action android:name="android.intent.action.PHONE_STATE"/>           

                 <action android:name="android.intent.action.NEW_OUTGOING_CALL" />

            </intent-filter>

</receiver>

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>