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;
        }
    }
}

对了,电话监听是需要权限的

posted @ 2017-05-03 10:17  潇风寒月  阅读(45)  评论(0)    收藏  举报