android - 在 android API29+ 中检测来电和去电
问题描述
关于在 android 中检测来电和去电有很多问题,但它们都是旧的,而且 android 也弃用了有用的功能,而且 google play 拒绝了我的应用程序,因为我正在使用它们。
为了检测我使用的拨出电话:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
并且还收听android.intent.action.NEW_OUTGOING_CALL
广播听众。
根据谷歌文档(this),我们应该使用CallRedirectionService
and CallScreeningService
。但这些服务适用于 API 29+。
那么有什么方法可以检测不弃用且不使用敏感权限的来电和去电?
如果有任何呼叫,我想关闭我的套接字连接,如果没有,我想重新打开它。
解决方案
您需要一个 BroadcastReceiver ,ACTION_PHONE_STATE_CHANGED
只要电话状态从空闲、响铃、摘机更改为您的接收者,您就可以调用之前的值和新值,您可以检测这是否是传入/传出呼叫。
所需的许可是"android.permission.READ_PHONE_STATE"
但是,如果您还想EXTRA_INCOMING_NUMBER
在该广播中接收 ,则需要另一个权限:"android.permission.READ_CALL_LOG"
这是清单的接收器定义:
<receiver android:name="PhoneStateReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
代码是这样的:
public class PhoneStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
...
}
}
推荐阅读
- asp.net-core-mvc - 将锚标记助手路由到特定控制器
- c# - 实体框架“已经有一个打开的 DataReader 与此命令关联,必须先关闭”
- python - 网页抓取输出 []
- reactjs - 如何在我的 expo 应用程序中读取最居中的二维码?
- ruby-on-rails - 使用 https 发布请求发送音频文件(法拉第)
- prisma - deleteMany({}) 的架构突变
- java - 使用 JProfiler 分析 CPU 负载
- android - 文本字段竞争条件?onValueChange 在输入时多次添加初始值(随机) - Jetpack Compose
- c# - Swagger 参考服务复制类而不是使用现有的类
- java - AssertJ 如何通过元素值比较两个列表?