您的位置:首页 > 移动开发 > Android开发

Android实现来电和去电的监听

2017-08-30 09:48 483 查看
写个实例实现Android中来电和去电的监听,来电可以使用PhoneStateListener对电话状态的改变进行监听,去电需要动态或者静态去注册广播接收器,对去电进行监听;

来电:

来电所对应的三种静态成员常量:

1、CALL_STATE_IDLE:空闲状态,没有任何活动。

2、CALL_STATE_OFFHOOK:摘机状态,至少有个电话活动。该活动或是拨打(dialing)或是通话,或是 on hold。

3、CALL_STATE_RINGING:来电状态,电话铃声响起的那段时间或正在通话又来新电,新来电话不得不等待的那段时间。

去电:

通过自定义广播接收器,监听手机发出的android.intent.action.NEW_OUTGOING_CALL的广播,然后在广播接收器中处理去电的相关逻辑。

实例代码实现:

public class PhoneListenService extends Service {

private static final String tag = "PhoneListenService";

// 电话管理者对象
private TelephonyManager mTelephonyManager;
// 电话状态监听者
private MyPhoneStateListener myPhoneStateListener;
// 动态监听去电的广播接收器
private InnerOutCallReceiver mInnerOutCallReceiver;

@Override
public void onCreate() {
mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
myPhoneStateListener = new MyPhoneStateListener();
mTelephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
// 动态注册广播接收器监听去电信息
mInnerOutCallReceiver = new InnerOutCallReceiver();
// 手机拨打电话时会发送:android.intent.action.NEW_OUTGOING_CALL的广播
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
registerReceiver(mInnerOutCallReceiver, intentFilter);
super.onCreate();
}

/**
* 动态注册广播接收器监听去电信息
*/
class InnerOutCallReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// 获取播出的去电号码
String outPhone = getResultData();
Log.i(tag, "outPhone:" + outPhone);
}
}

/**
* 自定义内部类对来电的电话状态进行监听
*/
class MyPhoneStateListener extends PhoneStateListener {
// 重写电话状态改变时触发的方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
Log.i(tag, "响铃:" + incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(tag, "接听");
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i(tag, "挂断");
break;
}
}
}

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onDestroy() {
// 取消来电的电话状态监听服务
if (mTelephonyManager != null && myPhoneStateListener != null) {
mTelephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}
// 取消去电的广播监听
if (mInnerOutCallReceiver != null) {
unregisterReceiver(mInnerOutCallReceiver);
}
super.onDestroy();
}
}


权限添加:

<!--读取电话的状态信息的权限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--处理拨出电话,允许程序监视,修改或放弃播出电话-->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />


另外: 这里给大家提供一个AndroidManifest.xml中权限控制的在线查询工具:

Android Manifest功能与权限描述大全

测试结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: