首页 > 解决方案 > 在 android API29+ 中检测来电和去电

问题描述

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

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

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

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

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

那么有什么方法可以检测不弃用且不使用敏感权限的来电和去电?

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

标签: androidandroid-serviceandroid-permissionsandroid-broadcasttelephonymanager

解决方案


您需要一个 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) {
        ...
    }
}

推荐阅读