该业务是属于跨进程的数据获取
所需权限
<!-- 打电话权限 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
<!-- 监听电话权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 处理呼出电话权限,用于修改呼出的电话号码 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
1、建一个新的包,包名为
com.android.internal.telephony
在该包内创建一个接口类
interface ITelephony{
boolean endCall();
void answerRingingCall();
}
创建 aidl 接口
ITelephony.aidl
2、Rebuilde项目
配置成功后,在 gen 目录下会有一个包名为com.android.internal.telephony的包 里面有一个 ITelephony.java类 自动生成的
3、在需要挂断电话功能的类添加一个方法 在需要调用该方法的位置时,需要传入一个TelephoneManager对象
原理:通过反射获取aidl代理接口的对象 ITelephony
TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
4、写一个内部类继承自PhoneStateListener
class MyPhoneStateListener extends PhoneStateListener {
/**
* * 电话状态改变监听
*
*/
@Override
public void onCallStateChanged(int state, // 状态常量
String incomingNumber) {
Log.i("info", "额incomingNumber" + incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
// 空闲
Log.i("info", "CALL_STATE_IDLE" + "空闲状态");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
// 接听
Log.i("info", "CALL_STATE_OFFHOOK" + "接听状态");
break;
case TelephonyManager.CALL_STATE_RINGING:
// 振铃
TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
ITelephony iTelephony;
try {
iTelephony = getITelephony(manager);
if (iTelephony != null) {
if (incomingNumber.equals("123")) {
//如果号码为123
try {
iTelephony.endCall();
Log.i("info", "已挂断" + " 号码为:" + incomingNumber);
} catch (RemoteException e) {
e.printStackTrace();
}
}
} else {
Log.i("info", "CALL_STATE_RINGING" + "振铃状态" + "ITelephonyManager为空");
}
} catch (Exception e1) {
e1.printStackTrace();
}
break;
}
}
6、在Activity生命周期开始时onCreate时 进行广播注册即可
// 开启电话监听状态
TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 调用listener的监听方法、监听电话状态的方法
listener = new MyPhoneStateListener();
manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
// 注册广播接收器
receiver = new MyPhoneReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
registerReceiver(receiver, filter);