使用广播和监听
需加入权限:
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permissionandroid:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
注册广播:
<receiver android:name=".receiver.PhoneStateReceiver"
android:label="phoneState">
<!-- 2147483647为最大的整数,这里代表优先级最高 -->
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
处理广播代码:
package com.xxx.receiver;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
/**
* 接收电话状态改变广播
*
*/
public class PhoneStateReceiver extends BroadcastReceiver
{
/** TAG */
private static final String TAG = "PhoneStateReceiver";
/** 避免多次注册电话状态监听标记 */
private static boolean isListen = false;
/** 当前操作电话号码 */
private static String currentNumber = null;
/** 区分呼入呼出标记 */
private static boolean isOuting = false;// 是否是呼出电话
@Override
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
{
// 呼出
isOuting = true;
String phonenumber = getResultData();// 被呼叫的电话号码
// 更新电话号码
if (null != phonenumber && !"".equals(phonenumber))
{
currentNumber = phonenumber;
}
Log.i(TAG, "呼出:p=" + phonenumber + ";c=" + currentNumber);
} else
{
// 监听电话状态改变
if (!isListen)
{
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Service.TELEPHONY_SERVICE);
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
}
/**
* 电话监听
*/
static PhoneStateListener listener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
// Log.i(TAG, "Phone value. s=" + state + ";p=" + incomingNumber);
isListen = true;// 已成功添加监听
// 更新电话号码
if (null != incomingNumber && !"".equals(incomingNumber))
{
currentNumber = incomingNumber;
}
switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:
Log.i(TAG, "挂断:p=" + incomingNumber + ";c=" + currentNumber
+ ";s=" + state);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(TAG, "接听:p=" + incomingNumber + ";c=" + currentNumber
+ ";s=" + state);
// 处理事务
if (isOuting)
{
// 处理呼出事务
Log.i(TAG, ">>>正在处理呼出...");
} else
{
// 处理呼入事务
Log.i(TAG, "<<<正在处理呼入...");
}
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.i(TAG, "呼入:p=" + incomingNumber + ";c=" + currentNumber
+ ";s=" + state);
isOuting = false;
break;
}
}
};
}
xxoo
http://www.hiputto.com/post/2013-10-11/android-listen-phone-state
Android电话状态处理(区分呼入呼出)
最新推荐文章于 2023-06-29 10:43:25 发布