最近在项目中需要监控通话状态。于是查阅了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"
?>
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);
}
}
}
|
监控效果如下:
来电:
电话处于响铃状态,此时可以获取来电号码
进入通话状态
挂机……
去电:
电话接通之前……
接听……
通话中……