我一直在尝试做类似于truecaller应用程序的东西,我的应用程序应该在呼叫挂断后显示一个屏幕。通过在android.intent.action.PHONE_STATE
文件中注册manifest
隐式广播来实现此目的。
但是,如果我将应用更改为定位Android O,则无法正常工作,因为Android O broadcast limitation,并且我试图找出此用例的替代解决方案。
在Android文档中建议的替代解决方案:Job scheduler
或使用service
注册context
。
作业调度程序:由于Job scheduler
优化,接收回调会有一些延迟。因此,如果我们的应用程序屏幕在电话呼叫后几分钟显示,并且每隔几秒检查一次新的呼叫记录就会导致电池耗尽问题,这将影响用户体验。
使用Java中的上下文注册服务:我希望即使应用程序处于活动状态还是活动状态,行为仍然有效。如果系统杀死Service
。
注册前台服务:这需要始终向用户显示通知,这将是用户的垃圾邮件,并且全天候运行服务会消耗大量资源,从而导致失败广播限制的全部目的。
请建议其他解决方案,以便用户体验保持不变。
提前致谢
答案 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版本的白名单。虽然在将来的版本中它们可能会被替换为不同的机制。