Android O:PHONE_STATE广播限制

时间:2017-08-16 14:54:32

标签: android performance android-broadcast android-broadcastreceiver android-8.0-oreo

我一直在尝试做类似于truecaller应用程序的东西,我的应用程序应该在呼叫挂断后显示一个屏幕。通过在android.intent.action.PHONE_STATE文件中注册manifest隐式广播来实现此目的。

但是,如果我将应用更改为定位Android O,则无法正常工作,因为Android O broadcast limitation,并且我试图找出此用例的替代解决方案。

在Android文档中建议的替代解决方案:Job scheduler或使用service注册context

作业调度程序:由于Job scheduler优化,接收回调会有一些延迟。因此,如果我们的应用程序屏幕在电话呼叫后几分钟显示,并且每隔几秒检查一次新的呼叫记录就会导致电池耗尽问题,这将影响用户体验。

使用Java中的上下文注册服务:我希望即使应用程序处于活动状态还是活动状态,行为仍然有效。如果系统杀死Service

,这将无效

注册前台服务:这需要始终向用户显示通知,这将是用户的垃圾邮件,并且全天候运行服务会消耗大量资源,从而导致失败广播限制的全部目的。

请建议其他解决方案,以便用户体验保持不变。

提前致谢

6 个答案:

答案 0 :(得分:4)

最后,该操作已添加到“隐式广播例外”列表中,因此您可以将ACTION_PHONE_STATE_CHANGED添加到您的清单中,它会起作用:

https://developer.android.com/guide/components/broadcast-exceptions

  

ACTION_CARRIER_CONFIG_CHANGED,   TelephonyIntents.ACTION _ * _ SUBSCRIPTION_CHANGED,   “TelephonyIntents.SECRET_CODE_ACTION”,ACTION_PHONE_STATE_CHANGED,   ACTION_PHONE_ACCOUNT_REGISTERED,ACTION_PHONE_ACCOUNT_UNREGISTERED

     

OEM   电话应用可能需要接收这些广播。

答案 1 :(得分:3)

您只有一个解决方案,使用前台服务并在服务中注册广播接收器。

答案 2 :(得分:2)

由于没有适当的解决方案从Android O读取PHONE_STATE。我们可以选择的最佳替代方法是从content provider触发新呼叫日志条目的作业。通过这种方式,在呼叫结束后保持显示屏幕(延迟几秒)的行为。

注意:缺点是我们无法获得电话呼叫的状态(振铃或off_the_hook等)。只有在将新的呼叫记录添加到系统DB后才会收到回叫。

答案 3 :(得分:0)

对于我和我的制作应用,解决方案是避免使用api 25及以上,直到出现更好的解决方法/ api。

如果您的应用定位到24级或更低级别,则您不受新Implicit Broadcast Limitations的影响,即使您的应用未运行,您的应用仍然可以收听PHONE_STATE广播。

针对较低API的应用仍然可以在新Android版本上正常下载和安装,更新sdkTarget值的唯一原因是您的应用需要使用新API。

答案 4 :(得分:0)

ACTION_NEW_OUTGOING_CALL似乎有一个broadcast exception,但来电(或通话结束时)没有一个bug report。有一个传出但不是一个传入的错误似乎是一个错误。在谷歌问题跟踪器中提交了{{3}}。希望他们的回答能够澄清我们应该做些什么。

如果/当bug跟踪器更新时,我会更新此答案。

答案 5 :(得分:0)

如上所述:https://issuetracker.google.com/37273064#comment4,ACTION_PHONE_STATE_CHANGED(android.intent.action.PHONE_STATE)将列入Android O版本的白名单。虽然在将来的版本中它们可能会被替换为不同的机制。