要监听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网络的,不知为何

更多相关文章

  1. Android 4.0.3 源码编译中添加外部jar包和外部so到apk的方法
  2. Button代码小写,运行时大写
  3. :activity状态的保存和保持
  4. Android中两种设置全屏的方法
  5. android 365手机秘书源代码
  6. 如何去掉状态栏和内容视图之间的黑色阴影线
  7. android studio调试c/c++代码
  8. android实现字体闪烁动画的方法

随机推荐

  1. 通过数据库接口获取到的中文数据是问号怎
  2. 尽管在清单文件中指定了权限,但是ACCESS_F
  3. Android快速开发框架andbase
  4. Android开发一些实用的类、方法及接口(新
  5. Android 监听各个Acitivity的生命周期
  6. viewpager 分页请求数据库并展示
  7. 现在做Android开发比较好?还是Android测试
  8. 在填充ListView时更改ImageView源
  9. 更改Edittext光标的颜色与粗细
  10. 安卓,如何让两个按钮相邻,宽度相同