【问题标题】:my BroadcastReceiver can't receiver the phone state change我的 BroadcastReceiver 无法接收电话状态更改
【发布时间】:2015-11-23 15:44:29
【问题描述】:

接收者在 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替换为自己定义的自定义过滤器,并使用“sendbroadcast()”发送广播,效果很好,但无法接收手机状态广播,问题出在哪里? 谢谢

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 上。

【问题讨论】:

  • 我还添加了读取手机状态权限:

标签: android broadcastreceiver


【解决方案1】:

下面是一个例子:

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>

【讨论】:

  • 我使用了你的代码,但仍然无法调用 onReceiver(),似乎系统没有发送电话状态更改广播,我猜@Archit Goel
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多