目前我有用于收听呼叫状态事件的广播接收器。我已在AndroidManifest.xml
注册了广播接收器,如下所示。
<receiver android:name=".api.PhoneCallReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
当应用程序启动时,此广播接收器已注册为侦听状态事件,并且根据CALL_STATE
我正在管理我的应用程序。
直到手机重启才能正常工作。
手机重启后,此广播接收器停止工作。我知道我必须注册接收器来监听系统的BOOT_COMPLETED
事件。
我所做的如下所示:
<receiver android:name=".api.PhoneCallReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
我还获得了获取BOOT_COMPLETED
系统事件的权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
但不知怎的,它不起作用。我正在考虑制作只接听BOOT_COMPLETED
事件的新广播接收器,但问题是
所以我的问题是,如果有任何来电,我该如何启动这个电话呼叫监听器广播接收器?
如何从其他广播接收器注册广播接收器
我是否必须将现有的广播接收器代码移至服务中,以便我可以从Boot Receiver启动服务?
任何帮助将不胜感激。
答案 0 :(得分:3)
欢迎任何其他答案。
我已经通过创建新的广播接收器和onReceive()
方法解决了这个问题,当电话重新启动时,我会调用广播接收器,然后我动态注册READ_PHONE_STATE
广播接收器,这也是明显的注册接收器。
以下是代码:
<强>的AndroidManifest.xml:强>
<receiver android:name=".api.ServiceStarter">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<强>广播接收器:强>
public class ServiceStarter extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.PHONE_STATE");
PhoneCallReceiver receiver = new PhoneCallReceiver();
context.getApplicationContext().registerReceiver(receiver, filter);
}
}
您必须使用以下应用程序上下文注册接收器:
context.getApplicationContext().registerReceiver(receiver, filter);
而不是
context.registerReceiver(receiver, filter);
否则您将获得以下异常:
java.lang.RuntimeException:无法启动接收器 com.ecosmob.contactpro.api.ServiceStarter: android.content.ReceiverCallNotAllowedException:BroadcastReceiver 组件不允许注册接收意图
我希望它可以帮助别人!