Android监听来电状态

本文介绍了一个自定义的Android广播接收器PhoneCallReceiver,用于监听电话状态变化,包括来电响铃。通过注册和注销该接收器,应用程序可以在来电时执行特定操作。

转载请以链接形式标明出处:
本文出自:103style的博客

记录一下.

public class PhoneCallReceiver extends BroadcastReceiver {
    private static final String TAG = "PhoneCallReceiver ";
    private OnPhoneCallListener onPhoneCallListener;

    @Override
    public void onReceive(Context context, Intent intent) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
        int state = tm.getCallState();
        Logg.e(TAG, "state = " + state);
        if (onPhoneCallListener != null) {
            onPhoneCallListener.hasNewCall(state == TelephonyManager.CALL_STATE_RINGING);
        }
    }

    public void setOnOnPhoneCallListener(OnPhoneCallListener onPhoneCallListener) {
        this.onPhoneCallListener = onPhoneCallListener;
    }

    public interface OnPhoneCallListener {
        void hasNewCall(boolean valid);
    }
}
  • fragment or activity
/**
 * 来电响铃的监听
 */
private PhoneCallReceiver phoneCallReceiver;
/**
 * 来电响铃监听是否已注册
 */
 private boolean hasRegisterPhoneCall = false;

// Activity
//@Override
//protected void onRestart() {
//    super.onRestart();
//    registerPhoneCallReceiver(true);
//}
@Override
public void onStart() {
    super.onStart();
    registerPhoneCallReceiver(true);
}
@Override
public void onStop() {
    super.onStop();
    registerPhoneCallReceiver(false);
}
/**
 * 监听来电响铃状态
 */
public void registerPhoneCallReceiver(boolean register) {
    if (register) {
        if (phoneCallReceiver== null) {
            phoneCallReceiver= new PhoneCallReceiver();
            phoneCallReceiver.setOnOnPhoneCallListener(valid -> {
                //
            });
        }
        if (!hasRegisterPhoneCall) {
            hasRegisterPhoneCall = true;
            activity.registerReceiver(phoneCallReceiver, new IntentFilter());
        }
    } else {
        if (phoneCallReceiver!= null && hasRegisterPhoneCall) {
            hasRegisterPhoneCall = false;
            activity.unregisterReceiver(phoneCallReceiver);
        }
    }
}
  • AndroidManifest.xml
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<receiver android:name=".PhoneCallReceiver">
    <intent-filter android:priority="1000">
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>
### 实现来电监听功能 在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); ``` 上述过程描述了一个完整的来电监听解决方案框架,具体实施细节可能会依据实际需求有所调整。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值