Android O : PHONE_STATE 广播限制
Android O : PHONE_STATE broadcast limitation
我一直在尝试做一些类似于 truecaller 应用程序的事情,我的应用程序应该在挂断电话后显示一个屏幕。通过在 manifest
文件中注册 android.intent.action.PHONE_STATE
隐式广播来实现这一点。
但是,如果我将应用程序更改为目标 Android O,它就无法工作,因为 Android O broadcast limitation,我正在尝试找出这个用例的替代解决方案。
android 文档中建议的替代解决方案:Job scheduler
或使用 context
.
注册一个 service
作业调度程序: 由于 Job scheduler
优化,接收回调会有一些延迟。因此,如果我们的应用程序屏幕在 phone 呼叫后几分钟显示,并且每隔几秒轮询一次以检查新的呼叫日志会导致电池耗尽问题,这将影响用户体验。
在 Java 中使用上下文注册服务:我希望即使应用程序未处于活动状态或活动状态,该行为也能正常工作。如果系统杀死 Service
.
,这将不起作用
注册前台服务:这需要一直向用户显示通知,这将向用户发送垃圾邮件,并且运行服务 24 /7 消耗大量资源,这违背了广播限制的全部目的。
请提出替代解决方案,以便用户体验保持不变。
提前致谢
你只有一个解决方案,使用前台服务并在服务中注册广播接收器。
因为没有合适的解决方案来从 Android O 读取 PHONE_STATE。我们可以寻求的最佳替代方案是在 [=10= 的新呼叫日志条目上触发作业].这样,通话结束后显示屏幕(延迟几秒)的行为得以保持。
注意:缺点是我们无法获取 phone 呼叫的状态(振铃或 off_the_hook 等)。只有在新的通话记录被添加到系统数据库后才会收到回叫。
对我和我的生产应用程序来说,解决方案是 避免针对 api 25 岁及以上 ,直到出现更好的 workaround/api。
如果您的应用面向 24 级或以下,您将不受新 Implicit Broadcast Limitations 的影响,并且您的应用仍然可以收听 PHONE_STATE 广播,即使您的应用不是 运行.
针对较低 API 的应用仍然可以在新的 Android 版本上正常下载和安装,更新 sdkTarget 值的唯一原因是您的应用需要使用新的 API。
google 问题跟踪器中似乎有一个 broadcast exception for ACTION_NEW_OUTGOING_CALL
but not one for incoming call (or when call ends). It seems like a bug to have one for outgoing but not one for incoming. There's been a bug report 归档。希望他们的回答能阐明我们应该做什么。
我会更新这个答案if/when错误跟踪器得到更新。
如此处所述:https://issuetracker.google.com/37273064#comment4、ACTION_PHONE_STATE_CHANGED (android.intent.action.PHONE_STATE) 将被列入 Android O 版本的白名单。尽管在未来的版本中它们可能会被不同的机制所取代。
最终,该操作被添加到“隐式广播异常”列表中,因此您可以将 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
telephony apps may need to receive these broadcasts.
我一直在尝试做一些类似于 truecaller 应用程序的事情,我的应用程序应该在挂断电话后显示一个屏幕。通过在 manifest
文件中注册 android.intent.action.PHONE_STATE
隐式广播来实现这一点。
但是,如果我将应用程序更改为目标 Android O,它就无法工作,因为 Android O broadcast limitation,我正在尝试找出这个用例的替代解决方案。
android 文档中建议的替代解决方案:Job scheduler
或使用 context
.
service
作业调度程序: 由于 Job scheduler
优化,接收回调会有一些延迟。因此,如果我们的应用程序屏幕在 phone 呼叫后几分钟显示,并且每隔几秒轮询一次以检查新的呼叫日志会导致电池耗尽问题,这将影响用户体验。
在 Java 中使用上下文注册服务:我希望即使应用程序未处于活动状态或活动状态,该行为也能正常工作。如果系统杀死 Service
.
注册前台服务:这需要一直向用户显示通知,这将向用户发送垃圾邮件,并且运行服务 24 /7 消耗大量资源,这违背了广播限制的全部目的。
请提出替代解决方案,以便用户体验保持不变。
提前致谢
你只有一个解决方案,使用前台服务并在服务中注册广播接收器。
因为没有合适的解决方案来从 Android O 读取 PHONE_STATE。我们可以寻求的最佳替代方案是在 [=10= 的新呼叫日志条目上触发作业].这样,通话结束后显示屏幕(延迟几秒)的行为得以保持。
注意:缺点是我们无法获取 phone 呼叫的状态(振铃或 off_the_hook 等)。只有在新的通话记录被添加到系统数据库后才会收到回叫。
对我和我的生产应用程序来说,解决方案是 避免针对 api 25 岁及以上 ,直到出现更好的 workaround/api。
如果您的应用面向 24 级或以下,您将不受新 Implicit Broadcast Limitations 的影响,并且您的应用仍然可以收听 PHONE_STATE 广播,即使您的应用不是 运行.
针对较低 API 的应用仍然可以在新的 Android 版本上正常下载和安装,更新 sdkTarget 值的唯一原因是您的应用需要使用新的 API。
google 问题跟踪器中似乎有一个 broadcast exception for ACTION_NEW_OUTGOING_CALL
but not one for incoming call (or when call ends). It seems like a bug to have one for outgoing but not one for incoming. There's been a bug report 归档。希望他们的回答能阐明我们应该做什么。
我会更新这个答案if/when错误跟踪器得到更新。
如此处所述:https://issuetracker.google.com/37273064#comment4、ACTION_PHONE_STATE_CHANGED (android.intent.action.PHONE_STATE) 将被列入 Android O 版本的白名单。尽管在未来的版本中它们可能会被不同的机制所取代。
最终,该操作被添加到“隐式广播异常”列表中,因此您可以将 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 telephony apps may need to receive these broadcasts.