要监听android打电话和接电话,只需下面2步骤
1.第一步,写一个Receiver继承自BroadcastReceiver
1.
2. public class PhoneStatReceiver extends BroadcastReceiver{
3.
4. private static final String TAG = "PhoneStatReceiver";
5.
6. // private static MyPhoneStateListener phoneListener = new MyPhoneStateListener();
7.
8. private static boolean incomingFlag = false;
9.
10. private static String incoming_number = null;
11.
12. @Override
13. public void onReceive(Context context, Intent intent) {
14. //如果是拨打电话
15. if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
16. incomingFlag = false;
17. String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
18. Log.i(TAG, "call OUT:"+phoneNumber);
19. }else{
20. //如果是来电
21. TelephonyManager tm =
22. (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
23.
24. switch (tm.getCallState()) {
25. case TelephonyManager.CALL_STATE_RINGING:
26. incomingFlag = true;//标识当前是来电
27. incoming_number = intent.getStringExtra("incoming_number");
28. Log.i(TAG, "RINGING :"+ incoming_number);
29. break;
30. case TelephonyManager.CALL_STATE_OFFHOOK:
31. if(incomingFlag){
32. Log.i(TAG, "incoming ACCEPT :"+ incoming_number);
33. }
34. break;
35.
36. case TelephonyManager.CALL_STATE_IDLE:
37. if(incomingFlag){
38. Log.i(TAG, "incoming IDLE");
39. }
40. break;
41. }
42. }
43. }
44. }
复制代码
第二步:在AndroidManifest.xml,配置写好的Receiver,并拦截相应的BroadCastAction,
另外注意加上相应的权限。
1.
2. <receiver android:name=".filter.PhoneStatReceiver">
3. <intent-filter>
4. <action android:name="android.intent.action.PHONE_STATE"/>
5. <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
6. </intent-filter>
7. </receiver>
8.
9. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
10. <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
复制代码
对于来电状态的变化,用户可以在上面的例子代码中,加入自己想要实现的逻辑。
来电分三种状态:
CALL_STATE_RINGING:来电响铃
CALL_STATE_OFFHOOK:摘机
CALL_STATE_IDLE:挂机
去电的话,这里只监听了电话拨打出去,至于拨打出去的电话,是否被接通,看来android的一些相关文档,
好像都没有这样一个可拦截的状态变化,不知道有没有人实现过去电状态变化的监听。
如果有的话,还望提供思路!!
lz写的帖子很好,来电的状态在很多的资料中都可以看到,可以根据不同的状态进行一系列的处理。但是去电的状态到现在始终都没有获取。来电是用的是 onCallStateChanged(int state, String incomingNumber)方法,我看了源代码PhoneStateListener类中的这个方法只有那三个状态,没有其他关于去电的状态。而且也 没有其他的方法获取去电的电话状态以及电话号码。所以得到去电的状态一定不是在PhoneStateListener这个类中了,到底怎么获取去电的状态 呢?很着急呀?哪位高手指点一下呀
关于判断去电或者来电接通状态的方法在源代码中是有的~但是标记有@hide标签,也就是这个Api是隐藏的不能直接调用,我也在寻找调用这些隐藏Api的方法
已经成功了
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
{
mCallEvent = CALL_EVENT_OUTGOING;
mCallNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i(TAG, "call OUT:" + mCallNumber);
AskCallStateThread callStateThread = new AskCallStateThread(context);
callStateThread.start();
}
private class AskCallStateThread extends Thread
{
private static final String TAG = "AskCallStateThread";
public AskCallStateThread(Context aContext) {
mContext = aContext;
}
Context mContext = null;
private Timer mTimer = new Timer(true);
private TimerTask mTimerTask = new TimerTask() {
@Override
public void run() {
TelephonyManager tm =
(TelephonyManager)mContext.getSystemService(Service.TELEPHONY_SERVICE);
int nState = tm.getCallState();
Log.i(TAG, "mTelManager.getCallState = " + nState);
if (nState == TelephonyManager.CALL_STATE_IDLE)
{
while (!mTimerTask.cancel())
mTimer.cancel();
}
}
};
@Override
public void run() {
mTimer.schedule(mTimerTask, 1000, 1000);
}
}
你的代码不能区分对方是否接听,或者打不通,或者对方挂机,或者进入留言信箱
去电接通这个状态确实没有监听到,每次刚拨出去,状态就变更了,网上找了下,貌似确实没有一个好的解决方案,而且我发现很多软件只能监听GSM网络的,不知为何