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

Far*_*ABZ 5 android android-service telephonymanager android-permissions android-broadcast

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

为了检测我使用的拨出电话:

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
Run Code Online (Sandbox Code Playgroud)

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

根据谷歌文档(this),我们应该使用CallRedirectionServiceand CallScreeningService。但这些服务适用于 API 29+。

那么有什么方法可以检测不弃用且不使用敏感权限的传入和传出呼叫?

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

mar*_*mor 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>
Run Code Online (Sandbox Code Playgroud)

代码是这样的:

public class PhoneStateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此代码检测传入和传出,如果状态更改为空闲 =&gt; 响铃,则您知道这是来电,如果状态更改为空闲 =&gt; 摘机,您知道这是拨出呼叫 (4认同)

Far*_*ABZ 5

@marmor 答案是正确的,我只是想完成它。

为了首先读取手机状态,我们应该将权限添加到清单中:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Run Code Online (Sandbox Code Playgroud)

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

intent.extras["state"]
Run Code Online (Sandbox Code Playgroud)

extras 的结果可能是:

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

摘机 -> 如果您正在与某人通话(来电或去电)

IDLE -> 如果呼叫结束(来电或去电)

通过PHONE_STATE广播,我们不需要使用PROCESS_OUTGOING_CALLS权限或已弃用的NEW_OUTGOING_CALL操作。