电话状态的监听

电话打出、打进响铃、接听、挂掉处于闲置状态几个状态的监听方法,总结出两种方式。

方式一:试过以下方法,虽然大多可以监听到,但是在某些机器却无法监听到

private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			if (state == TelephonyManager.CALL_STATE_RINGING) {  // 响铃

			} else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {  //  接听

			} else if (state == TelephonyManager.CALL_STATE_IDLE) {  // 空闲

			}
		}
	};
TelephonyManager tmgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tmgr.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);

方式二:改用监听广播方式,目前还没遇到监听不到的情况

package com.dway.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;

public class PhoneReceiver extends BroadcastReceiver {

	private OnPhoneListener mListener;

	@Override
	public void onReceive(Context context, Intent intent) {
		if(intent != null) {
			String action = intent.getAction();
			if(action == null){
				return;
			}
			if(action.equals(Intent.ACTION_NEW_OUTGOING_CALL)){
				if(mListener != null){
					mListener.onPhoneOutCall();
				}
			}else if(action.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
				if(mListener != null){
					TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
					mListener.onPhoneStateChange(manager.getCallState());
				}
			}
		}
	}
	
	/**
	 * 监听器
	 */
	public interface OnPhoneListener {
		/**
		 * 去电
		 */
		void onPhoneOutCall();
		/**
		 * 来电状态
		 * @param state
         */
		void onPhoneStateChange(int state);
	}
	
	/**
	 * 设置监听
	 * @param listener
	 */
	public void setOnPhoneListener(OnPhoneListener listener) {
		mListener = listener;
	}



}
package com.dway.receiver;

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.TelephonyManager;


public class PhoneReceiverHelper {

	private Context mContext;
	private PhoneReceiver mReceiver;

	public PhoneReceiverHelper(Context context){
		mContext = context;
		mReceiver = new PhoneReceiver();
	}

	public void setOnListener(PhoneReceiver.OnPhoneListener listener){
		if(mReceiver != null){
			mReceiver.setOnPhoneListener(listener);
		}
	}

	public void register() {
		IntentFilter filter = new IntentFilter();
		filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);//去电监听
		filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);//来电状态监听
		mContext.registerReceiver(mReceiver, filter);
	}

	public void unregister() {
		if(mContext != null && mReceiver != null){
			mContext.unregisterReceiver(mReceiver);
			mReceiver = null;
		}
	}


    /**
     * 获取电话状态
     * @return
     * {@link TelephonyManager#CALL_STATE_RINGING}响铃,
     * {@link TelephonyManager#CALL_STATE_OFFHOOK}接听电话中,
     * {@link TelephonyManager#CALL_STATE_IDLE}空闲状态
     */
	public static int getCallState(Context context){
        TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return manager.getCallState();
    }

}

监听和注销广播:

//电话监听
mPhoneReceiverHelper = new PhoneReceiverHelper(getContext());
mPhoneReceiverHelper.setOnListener(mOnPhoneListener);
mPhoneReceiverHelper.register();
//注销广播
if(mPhoneReceiverHelper != null){
            mPhoneReceiverHelper.unregister();
            mPhoneReceiverHelper = null;
        }

另外,需要注意的是,还需要添加权限,如果是Android M或以上的,还需要动态申请权限

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>

总结:建议使用方式二,使用都很简单。

猜你喜欢

转载自blog.csdn.net/lin_dianwei/article/details/81564281
今日推荐