在 android API29+ 中检测来电和去电

Posted

技术标签:

【中文标题】在 android API29+ 中检测来电和去电【英文标题】:Detecting incoming and outgoing calls in android API29+ 【发布时间】:2020-10-20 12:53:00 【问题描述】:

关于在an​​droid中检测来电和去电有很多问题,但它们都是旧的,而且android也弃用了有用的功能,而且google play拒绝了我的应用程序,因为我正在使用它们。

用于检测我使用的拨出电话:

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

并且还收听android.intent.action.NEW_OUTGOING_CALL广播监听器。

根据谷歌文档(this),我们应该使用CallRedirectionServiceCallScreeningService。但这些服务适用于 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+ 中检测来电和去电的主要内容,如果未能解决你的问题,请参考以下文章

Android 记录来电和去电

我可以在后台观察来电和去电吗?

Android 2.1+ 暂停来电/去电,完成后恢复

如何注销来电和去电接收者?

无论如何要为Android中的来电和去电制作我的自定义用户界面吗?

如何在 Android 11 中实现 New Storage API?