Android 监听来电状态

一、需要权限

注意:
1、两个权限都需要动态申请
2、测试手机是 Android14,运行正常,其他的版本没测试

  • Manifest.permission.READ_PHONE_STATE(没有此权限会崩溃)
  • Manifest.permission.READ_CALL_LOG (没有此权限回调方法不会触发,如下)
   TelephonyManager.CALL_STATE_IDLE -> Log.e("监听来电", "手机状态:空闲状态") //这个倒是会触发,在注册的时候
   TelephonyManager.CALL_STATE_RINGING -> Log.e("监听来电", "手机状态:来电话状态") //不会触发
   TelephonyManager.CALL_STATE_OFFHOOK -> Log.e("监听来电", "手机状态:接电话状态") //不会触发

二、完整代码

   val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
       // Android 12 及以上
       val listener = MyCallStateListener()
       telephonyManager.registerTelephonyCallback(mainExecutor, listener)
   } else {
       val listener = MyPhoneStateListener()
   }
    @RequiresApi(Build.VERSION_CODES.S)
    private inner class MyCallStateListener : TelephonyCallback(),
        TelephonyCallback.CallStateListener {
        override fun onCallStateChanged(state: Int) {
            when (state) {
                TelephonyManager.CALL_STATE_IDLE -> Log.e("监听来电", "手机状态:空闲状态")
                TelephonyManager.CALL_STATE_RINGING -> Log.e("监听来电", "手机状态:来电话状态")
                TelephonyManager.CALL_STATE_OFFHOOK -> Log.e("监听来电", "手机状态:接电话状态")
            }
        }
    }

    private inner class MyPhoneStateListener : PhoneStateListener() {
        override fun onCallStateChanged(state: Int, phoneNumber: String?) {
            when (state) {
                TelephonyManager.CALL_STATE_IDLE -> Log.e("监听来电", "手机状态:空闲状态")
                TelephonyManager.CALL_STATE_RINGING -> Log.e("监听来电", "手机状态:来电话状态")
                TelephonyManager.CALL_STATE_OFFHOOK -> Log.e("监听来电", "手机状态:接电话状态")
            }
            super.onCallStateChanged(state, phoneNumber)
        }
    }

参考

Android 12以上TelephonyManager TelephonyCallback onCallStateChanged 方法不会被调用

不同版本Android通话状态监听

### 实现来电监听功能 在Android应用程序中实现来电监听功能涉及多个方面的工作,包括但不限于权限声明、广播接收器的创建以及动态或静态注册。 #### 权限设置 为了能够监听电话状态的变化,在`AndroidManifest.xml`文件内需申请读取通话记录和监听电话状态的相关权限。自Android 6.0 (API level 23)起,除了要在清单文件里声明这些敏感权限外,还需向用户提供运行时请求以获取授权[^1]: ```xml <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 如果目标SDK版本>=29,则还需要此权限 --> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> ``` 对于高版本的目标平台(如 Android 10 及以上),可能还会涉及到其他额外的要求或者限制措施。 #### 创建广播接收器 接下来定义一个继承自 `BroadcastReceiver` 的类来处理来电事件的通知。当有新的呼叫到来时,该接收者会被激活并执行相应的逻辑操作。下面是一个简单的例子说明如何构建这样一个组件[^2]: ```java public class CallStateReceiver extends BroadcastReceiver { private static final String TAG = "CallStateReceiver"; @Override public void onReceive(Context context, Intent intent) { TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); int state = tm.getCallState(); switch(state){ case TelephonyManager.CALL_STATE_IDLE: Log.d(TAG,"IDEL"); break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.d(TAG,"OFFHOOK"); break; case TelephonyManager.CALL_STATE_RINGING: String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); Log.d(TAG,"RINGING:" +incomingNumber ); break; } } } ``` 这段代码展示了如何捕获不同类型的电话状态变化,并打印日志信息作为响应动作的一部分。 #### 注册与注销广播接收器 最后一步是在适当的地方完成广播接收者的注册工作。这可以通过两种方式之一来进行——要么将其配置到应用包内的XML资源文件(`AndroidManifest.xml`)中以便于启动即生效;要么采用编程的方式在特定场景下调用相应的方法进行临时性的订阅/退订服务[^3][^4]. 如果选择后者的话,可以在某个Activity生命周期方法内部调用如下所示的一段Java语句片段: ```java // 假设当前上下文为activity实例本身 IntentFilter filter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL); filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); registerReceiver(new CallStateReceiver(), filter); // 动态注册广播接受者 // 当不再需要监听的时候记得及时解除绑定 unregisterReceiver(callStateReceiverInstance); ``` 上述过程描述了一个完整的来电监听解决方案框架,具体实施细节可能会依据实际需求有所调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值