Android 电话状态的监听
电话状态的监听
需求:有时候需要监听用户的通话状态,以提供更优质的用户体验.所以这里简单说一下电话状态的监听.
分析:电话的打入,可能我们的应用没有任何activity在界面上,但是我们又需要做一些事情,所以我们需要用到Service.在Service中去监听电话的状态.然后做相应的事情.
public class AddressService extends Service {
private TelephonyManager mTm;
private static final String TAG = "AddressService";
/**
* 监听电话的监听器
*/
private MyPhoneStateListener mPhoneStateListener;
@Override
public void onCreate() {
//第一次开启服务之后,就需要去管理Toast的显示
//电话状态的监听(服务开启的时候,需要去做监听,关闭的时候电话状态就不需要监听了)
//1, 电话管理者对象
mTm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
//2, 监听电话状态
mPhoneStateListener = new MyPhoneStateListener();
mTm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onDestroy() {
//取消对电话状态的监听 如果不取消监听的话,则即使停止了Service,还是在监听着的
if (mTm != null && mPhoneStateListener != null) {
mTm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}
super.onDestroy();
}
/**
* 电话状态的监听
* 监听器类,用于监视设备上特定电话状态的变化,包括服务状态,信号强度,消息等待指示符(语音信箱)等。
* 覆盖您希望接收更新的状态的方法,
* 并将您的PhoneStateListener对象与按位或LISTEN_标志一起传递给TelephonyManager.listen()。
* 请注意,对某些电话信息的访问权限受到保护。 您的应用程序将不会收到受保护信息的更新,
* 除非它的清单文件中声明了相应的权限。 在适用权限的情况下,它们会在相应的LISTEN_标志中注明。
*/
class MyPhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
//无任何状态时 空闲状态
LogUtil.d(TAG, "空闲状态");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//接起电话时 摘机
LogUtil.d(TAG, "摘机状态");
break;
case TelephonyManager.CALL_STATE_RINGING:
//电话进来时 响铃
LogUtil.d(TAG, "响铃状态");
break;
}
}
}
对了,电话监听是需要权限的

浙公网安备 33010602011771号