来去电归属地[02]拦截外拨电话与来电的号码

摘要

       从以上思路图可以看出来去电显示的关键要点之一为拦截来去电时电话号码,有了这个号码我们才方便开展其他的功能代码,所以获取这个号码的知识点也就成为此时关注的焦点了。那么我们怎么获取外拨时的电话号码呢?Android系统里面是通过一个OutCall的广播通知其他程序,”有人向外拨电话了!!!号码是131....”,而对于来电的话,则是通过一个系统级的服务TelephonyManager来管理跟通讯有关的活动与参数,是不是很像候老师,有什么就业的难题都找他?TelephonyManager就是这样的,比方说想获取sim卡序列号,电话的通话状态(”有电话了打进来了!!!号码是131....”,)等等,都找这个Android版的候老师!!!既然是这样的,那么这个广播与管理者就是我们掌握的要点了。

1.采用代码注册拦截OutGoingCall广播

>权限

   <!-- 外拨电话的广播拦截权限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

>代码注册广播

.外拨 [拦截一个Action为Intent.ACTION_NEW_OUTGOING_CALL的外拨广播 ]

// 创建过滤器
IntentFilter filter = new IntentFilter();
// 广播类型
filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
filter.setPriority(1000);
// 注册广播
registerReceiver(outCallReceiver, filter);

注意

代码注册的广播在不用的时候要进行移除

// 3.回调:条件 stopService 仅有一次
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("--归属地服务----onDestroy---销毁");
// 移除注册
unregisterReceiver(outCallReceiver);
}

>号码获取

// 拦截外拨的接收者
private BroadcastReceiver outCallReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 获取号码头
String number = super.getResultData();
System.out.println("---outCallReciever-onReceive  number=" + number);
}
};

2.拦截来电

>注册监听

常见的注册监听器的方式为manager.setON...Listener(); register...Listener  等 但是TelephonyManager这个监听真的不是很经典,或者说很变态!!!

// ##############TelephonyManager 通讯相关的服务 sim/通话状态 监听器拦截的
manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
// 监听通话状态
manager.listen(mPhoneStateListener, // 通话状态监听器
PhoneStateListener.LISTEN_CALL_STATE// 设置监听类型
);

注意

用完成不需要这个状态的话要进行移除操作

// 移除话状态监听
manager.listen(mPhoneStateListener, // 通话状态监听器
PhoneStateListener.LISTEN_NONE// 设置监听类型
);

>事件处理

private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
// 监听状态改变
@Override
public void onCallStateChanged(//
int state,// 状态
String incomingNumber// 来电号码
) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:// 没有电话
dismissDialog();
break;
case TelephonyManager.CALL_STATE_RINGING:// 响铃
dealNumber(incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 接听
break;
}
}
};

注意

CALL_STATE_OFFHOOK不是挂断电话而是接通电话,正在通话中学员们老是搞反了,谁叫名字取得这么让人误解!!!
发布了32 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u013621398/article/details/33418579