33

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

但由于Android O broadcast limitation,我将应用更改为目标Android O,因此无法正常工作,而我正试图找出该用例的替代解决方案。

在android文档中建议的替代解决方案:Job scheduler或注册servicecontext

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

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

注册前台服务:这需要一直向用户显示通知,这将成为用户的垃圾邮件,并且24/7全天候运行会占用大量资源,从而无法实现广播的全部目的局限性。

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

在此先感谢

回答

2

由于没有适当的解决方案可以从Android O中读取PHONE_STATE,我们可以选择的最好方法是从content provider的新通话记录条目中触发一个作业。由此,在呼叫结束之后,行为被保持显示屏幕(具有几秒的延迟)。

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

3

你只有一个解决方案,使用前景的服务和注册在服务广播接收机。

+0

我们期望更好的东西,因为前台服务需要显示通知。你不觉得这会成为用户的垃圾邮件吗?而且,全天候运行服务会消耗大量资源。 – Bob

+0

没有其他解决方案。 – greywolf82

+0

+1我只想补充 - 通知并不是那么糟糕。例如,LastPass密码管理器为其后台服务24/7显示它,并且它消耗的资源非常少。另外,如果屏幕上有“脸部”,FB信使将显示通知。 –

0

对于我和我的制作应用程序,解决方案是避免将目标定位为25或更高,直到出现更好的解决方法/ api。

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

的应用定位较低的API仍然可以下载并在新的Android版本的正常安装,更新您的sdkTarget价值的唯一原因是,如果您的应用程序需要新的API使用。

0

对于ACTION_NEW_OUTGOING_CALL,似乎有broadcast exception,但对于来电(或通话结束时)不是一个。这似乎是一个错误,有一个传出,但没有一个传入。还有的是在谷歌问题跟踪提起bug report。希望他们的回答能够澄清我们应该做的事情。

如果/当错误跟踪程序更新时,我会更新此答案。