电话打出、打进响铃、接听、挂掉处于闲置状态几个状态的监听方法,总结出两种方式。
方式一:试过以下方法,虽然大多可以监听到,但是在某些机器却无法监听到
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>
总结:建议使用方式二,使用都很简单。