Android O:PHONE_STATE广播限制

我一直在试图做类似于truecaller的应用程序,我的应用程序应该在挂断电话后显示屏幕。 通过在manifest文件中注册android.intent.action.PHONE_STATE隐式广播来实现这一点。

但是,如果我将应用程序更改为目标Android O,则无法正常工作,因为Android O广播限制 ,我试图找出针对此用例的替代解决scheme。

在android文档中build议的替代解决scheme: Job scheduler或使用context注册service

作业调度程序:由于Job scheduler优化,接收callback会有一些延迟。 因此,如果我们的应用程序屏幕在电话后几分钟显示,并且每隔几秒查询一次新的通话logging,则会影响用户体验,从而导致电量耗尽问题。

在Java中使用上下文注册服务 :即使应用程序未处于活动状态,我也希望该行为能够正常工作。 如果系统杀死Service这将不起作用。

注册一个前台服务 :这就要求用户一直向用户显示一个通知,这个通知是用户的垃圾邮件,而且每天24小时运行一次服务会消耗大量的资源,从而破坏了广播限制的全部目的。

请build议备用解决scheme,以便用户体验保持不变。

提前致谢

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

由于没有适当的解决scheme来从Android O中读取PHONE_STATE,我们可以select的最好方法是从内容提供者处触发新的呼叫日志条目。 由此,在通话结束之后保持显示屏幕(具有几秒的延迟)的行为。

注:缺点是我们无法得到电话的状态(振铃或off_the_hook等)。 只有在新的通话logging被添加到系统数据库之后才能收到回拨。

对于我和我的生产应用程序来说,解决scheme是避免定位api 25或更高版本 ,直到出现更好的解决方法/ api。

如果您的应用目标级别为24或以下,则不会受到新的“ 隐式广播限制”的影响,即使您的应用未运行,您的应用仍然可以收听PHONE_STATE广播。

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

对于ACTION_NEW_OUTGOING_CALL似乎有一个广播例外 ,但对于来电(或通话结束时)则不是。 这似乎是一个错误,有一个传出,但没有一个传入。 谷歌问题跟踪器中存在一个错误报告 。 希望他们的回答能够澄清我们应该做的事情。

我会更新这个答案,如果/当错误跟踪器得到更新。

正如此处所述: https ://issuetracker.google.com/37273064#comment4,ACTION_PHONE_STATE_CHANGED(android.intent.action.PHONE_STATE)将被列入白名单的Android O版本。 尽pipe在将来的版本中它们可能被不同的机制所取代。