您的位置:首页 > 移动开发 > Android开发

android监听电话状态问题

2012-09-21 16:00 375 查看
有时候我们开发软件的时候,需要拿到手机当前是否在通话状态,以做相应的处理。这时候就必然要去检测当前是否正在通话中。

先说说我们一般的做法:

1,在AndroidManifest.xml文件中,添加相应的权限和注册相应的广播接收。如下:

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CALL_PRIVILEGED" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<!-- 拨打电话 -->
<receiver android:name=".broadcast.PhoneStatReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>

2,然后我们写个广播接收类去接收系统消息并做相应处理。如下:

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
Log.e("hg", "呼出……OUTING");
}
if (intent.getAction().equals("android.intent.action.PHONE_STATE")) {
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Service.TELEPHONY_SERVICE);
switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
Log.e("hg", "电话状态……RINGING");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.e("hg", "电话状态……OFFHOOK");
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.e("hg", "电话状态……IDLE");
break;
}
}
}

3,将程序跑起来。看打印我们就能看到的调用顺序(当然了,我们也可以将上面的接收用两个类分开。这里我只是举个例子而已)

A:拨打15221XXXX好友,没接通前立马挂电话。State执行顺序:OFFHOOK---->IDLE

B:拨打15221XXXX好友,等着对方接通电话后。State执行顺序:OFFHOOK---->IDLE

C:好友打进来,自己不接,也不主动挂断。State执行顺序:RINGING---->IDLE

D:好友打进来,自己主动挂断或者好友主动挂断。State执行顺序:RINGING---->IDLE

E:好友打进来,我接。State执行顺序:RINGING---->OFFHOOK---->IDLE

本来,这是android系统应用层供我们去使用的一些应用接口,使用起来也很爽。但是前几日,我往手机上装了个软件:LBE安全大师。发现上面的事件调用就不是那么回事儿了。气死我了。后来我反编译大致看了一下它的代码,它用反射机制把FrameWork层的很多函数重写了。比如endCall()方法等。更可气的是,这种类似软件市面上很多,而且装机量也很大。这让我们这些小开发者无路可走。

下面说说装了LBE安全大师后,电话状态的执行顺序

A:拨打15221XXXX好友,没接通前立马挂电话。State执行顺序:IDLE---->IDLE

B:拨打15221XXXX好友,等着对方接通电话后。State执行顺序:IDLE---->IDLE

C:好友打进来,自己不接,也不主动挂断。State执行顺序:IDLE---->IDLE

D:好友打进来,自己主动挂断或者好友主动挂断。State执行顺序:IDLE---->IDLE

E:好友打进来,我接。State执行顺序:IDLE---->IDLE---->IDLE

吼吼,他NN个熊。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: