关于android来去电监控的一点总结

最近在项目中需要监控通话状态。于是查阅了TelephonyManager相关的API。实现通话状态的监控主要有2种途径:1、注册一个listener来捕获通话中的各种状态(Applications can also register a listener to receive notification of telephony state changes)。2、注册一个监听打电话的广播。

第一种方式貌似只能在activity或Services自身运行的时候才能执行(说法不准确或不当的欢迎拍砖指正)。而第二种则又分两种情况:一、静态注册的广播,在程序退出的情况下,任然能够监听。二、动态注册的广播只能在程序执行的时候进行监控,退出了则失效。

下面主要说说怎样通过系统广播来实现(在这里只说说静态注册,动态注册请查阅API)。

manifest.xml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</ pre >
<? xml version = "1.0" encoding = "utf-8" ?>
< manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "pignut.net"
android:versionCode = "1"
android:versionName = "1.0" >
< uses-sdk android:minSdkVersion = "8" />
< uses-permission android:name = "android.permission.READ_PHONE_STATE" ></ uses-permission >
< uses-permission android:name = "android.permission.PROCESS_OUTGOING_CALLS" ></ uses-permission >
 
< application android:icon = "@drawable/icon" android:label = "@string/app_name" >
< activity android:name = ".Mytest"
android:label = "@string/app_name" >
< intent-filter >
< action android:name = "android.intent.action.MAIN" />
< category android:name = "android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >
< activity android:name = "Check_call" ></ activity >
< receiver android:name = ".InterceptCall" >
< intent-filter >
< action android:name = "android.intent.action.NEW_OUTGOING_CALL" />
</ intent-filter >
< intent-filter >
< action android:name = "android.intent.action.PHONE_STATE" />
</ intent-filter >
</ receiver >
</ application >
</ manifest >
< pre >

因为我的项目中需要获取来去电号码,所以在这里监听了 拨打电话中的两个动作:NEW_OUTGOING_CALL和PHONE_STATE,当然这需要声明相应的权限,否则报错。

注册好了之后就可以实现BroadcastReceiver中的onReceive方法。在该方法中你就可以获取所需的数据啦。在这里有必要说明的是BroadcastReceiver的生命周期是很短暂的。任何耗时的异步操作不能在onReceive中执行。因为在返回结果之前,系统已经释放了BroadcastReceiver进程。例如:你不能在BroadcastReceiver里显示一个dialog或绑定一个service。如果实现要在这里给出提示可以使用NotificationManager。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package pignut.net;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
 
public class InterceptCall extends BroadcastReceiver {
 
  @Override
  public void onReceive(Context context, Intent intent) {
 
  System.out.println( "-----监控到啦-----" );
 
  System.out.println( "去电号码" +intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER));
  System.out.println( "当前action" +intent.getAction());
 
  System.out.println( "通话状态" +intent.getStringExtra(TelephonyManager.EXTRA_STATE));
  System.out.println( "来电号码" +intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));
 
  if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)){
  Intent in = new Intent(context, Check_call. class );
  in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  context.startActivity(in);
  }
 
  }
 
}

监控效果如下:

来电:

来电一

来电一

电话处于响铃状态,此时可以获取来电号码

来电二

来电二

进入通话状态

来电三

来电三

挂机……

去电:

去电一

去电一

电话接通之前……

去电二

去电二

接听……

去电三

去电三

通话中……

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值