在 android API29+ 中检测来电和去电
Posted
技术标签:
【中文标题】在 android API29+ 中检测来电和去电【英文标题】:Detecting incoming and outgoing calls in android API29+ 【发布时间】:2020-10-20 12:53:00 【问题描述】:关于在android中检测来电和去电有很多问题,但它们都是旧的,而且android也弃用了有用的功能,而且google play拒绝了我的应用程序,因为我正在使用它们。
用于检测我使用的拨出电话:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
并且还收听android.intent.action.NEW_OUTGOING_CALL
广播监听器。
根据谷歌文档(this),我们应该使用CallRedirectionService
和CallScreeningService
。但这些服务适用于 API 29+。
那么有什么方法可以检测不弃用且不使用敏感权限的来电和去电?
如果有任何调用,我想关闭我的套接字连接,如果没有,我想重新打开它。
【问题讨论】:
就我而言,我认为没有办法检测没有敏感权限的呼叫。我最近开发了应用程序,并通过android.permission.PROCESS_OUTGOING_CALLS
权限归档了相同的应用程序,但最后由于使用了android.permission.PROCESS_OUTGOING_CALLS
更敏感的权限,谷歌拒绝了我的应用程序。他们希望有充分的理由使用此类许可。
【参考方案1】:
您需要 ACTION_PHONE_STATE_CHANGED
的 BroadcastReceiver
每当电话状态从空闲、振铃、摘机时,这将呼叫您收到的电话,因此从以前的值和您可以检测到的新值是否是来电/去电。
所需的权限是"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)
...
【讨论】:
外出通话怎么样? 这段代码检测呼入和呼出,如果状态改变空闲=>响铃你知道这是一个来电,如果状态改变空闲=>摘机你知道这是一个呼出【参考方案2】:@marmor 答案是正确的,我只是想完成它。
首先要读取手机状态,我们应该将权限添加到清单中:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
在接收器类中,我们可以通过读取意图来获取当前状态,如下所示:
intent.extras["state"]
额外的结果可能是:
RINGING -> 如果您的手机正在响铃
摘机 -> 如果您正在与某人通话(来电或去电)
IDLE -> 如果通话结束(来电或去电)
使用PHONE_STATE
广播,我们不需要使用PROCESS_OUTGOING_CALLS
权限或已弃用的NEW_OUTGOING_CALL
操作。
【讨论】:
以上是关于在 android API29+ 中检测来电和去电的主要内容,如果未能解决你的问题,请参考以下文章