Lenovo K8 Note升级Android Oreo后无法接收ACTION_NEW_OUTGOING_CALL广播
解决Android Oreo下ACTION_NEW_OUTGOING_CALL广播接收器失效的问题
兄弟,你踩中了Android 8.0(API 26)引入的隐式广播限制坑!从Oreo开始,系统一刀切禁止了大部分隐式广播的静态注册接收器,ACTION_NEW_OUTGOING_CALL正好在受限名单里,而ACTION_PHONE_STATE_CHANGED是少数例外,所以你的接收器能正常抓电话状态变化,却收不到呼出电话的广播。
给你整理好修复步骤,照着来就行:
先清掉清单里的静态注册
把你之前在Manifest里写的针对ACTION_NEW_OUTGOING_CALL的接收器注册删掉或者注释掉,比如这段:<!-- 这个静态注册在Oreo及以上彻底失效,留着没用 --> <!-- <receiver android:name=".YourOutgoingCallReceiver"> <intent-filter> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver> -->改用动态注册接收器
找个合适的地方(比如你应用的主Activity,或者前台Service里)动态注册接收器,这样才能在Oreo及以上系统正常收到广播。举个Activity里的例子:private YourOutgoingCallReceiver outgoingReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 实例化你的接收器 outgoingReceiver = new YourOutgoingCallReceiver(); // 配置意图过滤器,指定要监听的广播 IntentFilter callFilter = new IntentFilter(); callFilter.addAction(Intent.ACTION_NEW_OUTGOING_CALL); // 注册接收器 registerReceiver(outgoingReceiver, callFilter); } @Override protected void onDestroy() { super.onDestroy(); // 一定要记得注销!不然会内存泄漏 if (outgoingReceiver != null) { unregisterReceiver(outgoingReceiver); } }最后再确认权限没问题
虽然你说已经申请了权限,但还是再核对下Manifest里的声明,别写错了:<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />提醒下:这个权限是正常权限,从Android 6.0开始不需要动态申请,清单声明就够了,所以只要拼写正确就没问题。
另外要注意:动态注册的接收器只有在注册它的组件(比如上面的Activity)活着的时候才能干活。如果你的应用需要后台也监听呼出电话,就得结合前台Service来保持注册状态——不过后台搞事情要遵守Android的后台规则,别被系统一键杀了哈。
内容的提问来源于stack exchange,提问作者Orange
相关产品推荐
相关产品推荐

