在Android API29+中检测呼入和呼出电话

7

有很多问题涉及在Android中检测来电和去电,但是它们都过时了,而且Android也已经废弃了这些有用的功能,因此我使用这些功能而被Google Play拒绝了。

对于检测去电,我使用了:

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

同时也要监听 android.intent.action.NEW_OUTGOING_CALL 广播。

根据 Google 文档(这里),我们应该使用 CallRedirectionServiceCallScreeningService。但是这些服务只能在 API 29+ 上使用。

那么有没有一种方法可以检测呼入和呼出电话,既不过时,也不使用敏感权限?

如果有任何电话,我想关闭我的套接字连接,如果没有,则重新打开它。


1
据我所知,没有办法在没有敏感权限的情况下检测通话。最近我开发了一个应用程序,并通过 android.permission.PROCESS_OUTGOING_CALLS 权限进行了归档,但最终谷歌拒绝了我的应用程序,因为使用了更敏感的 android.permission.PROCESS_OUTGOING_CALLS 权限。他们需要充分的理由来使用这样的权限。 - M D
2个回答

8

您需要一个广播接收器来处理 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) {
        ...
    }
}

出去的电话怎么样? - FarshidABZ
4
这段代码可以检测到呼入和呼出,如果状态从空闲变为响铃,你就知道这是一个呼入电话;如果状态从空闲变为摘机,你就知道这是一个呼出电话。 - marmor

5

@marmor 的答案是正确的,我只是想补充一下。

为了读取手机状态,我们首先需要在清单文件中添加权限:

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

在接收器类中,我们可以通过读取意图(intent)来获取当前状态,如下所示:

intent.extras["state"]

extras 的结果可能是:

RINGING -> 如果您的手机正在响铃

OFFHOOK -> 如果您正在与某人通话(呼入或呼出电话)

IDLE -> 如果通话结束(呼入或呼出电话)

使用 PHONE_STATE 广播,我们无需使用 PROCESS_OUTGOING_CALLS 权限或弃用的 NEW_OUTGOING_CALL 操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接