文档章节

android对于来去电广播对于电话状态监听

sky玦
 sky玦
发布于 2014/09/28 20:19
字数 675
阅读 511
收藏 0

通常用于监听来去电的广播就是注册过滤两个action,分别为android.intent.action.PHONE_STATE和android.intent.action.NEW_OUTGOING_CALL。                    android.intent.action.NEW_OUTGOING_CALL这条广播用于检测本机电话播出的action,android.intent.action.PHONE_STATE检测手机电话状态的。当然我们注册的broadcast在手机电话状态每次发生改变时就会执行一次onReceiver方法,android.intent.action.PHONE_STATE会随手记状态改变而发出多次action,android.intent.action.NEW_OUTGOING_CALL只会在手机拨号时发出,即一次。经过测试,系统在拨号的时候会发出两个Intent,第一个intent的action为android.intent.action.NEW_OUTGOING_CALL,表示当前是拨号状态,第二个intent的actionandroid.intent.action.PHONE_STATE是发出电话状态改变的,我们可以用。

    手机在电话中共有三种状态:CALL_STATE_RINGING(响铃)、CALL_STATE_OFFHOOK(接听)、CALL_STATE_IDLE(摘机,闲置、挂断)。可以通过TelephonyManager的getCallState()获取手机状态。

    在去电时,广播会接到两个action,其中判断是播出的action的intent只会发出一次,判断手机状态的intent会发出多次,其中在去电时手机是没有响铃状态的。需要注意二点的是:第一个state是摘机CALL_STATE_IDLE,需要处理掉这个state;二,获取拨出号码的可以在android.intent.action.NEW_OUTGOING_CALL的intent中通过intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)获得。

    在来电时,是不会发出android.intent.action.NEW_OUTGOING_CALL这条action。android.intent.action.PHONE_STATE的三种状态都会出现。要注意在CALL_STATE_OFFHOOK中incommingNum为空。

    根据特点,可以根据是否发出a这条ndroid.intent.action.NEW_OUTGOING_CALL action判断是来电或去电,也可以根据是否出现CALL_STATE_RINGING来判断是来电/去电。

    话不多说,上代码:

public class PhoneStatReceiver extends BroadcastReceiver{

private static final String TAG = "PhoneStatReceiver";  

private static boolean incomingFlag = false;  

private static String incoming_number = null;  

@Override  

public void onReceive(Context context, Intent intent) {  

//如果是拨打电话  

if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){                          

incomingFlag = false;  //false表示去电

String incoming_number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);  //获取去电号码        

Log.i(TAG, "去电  call OUT:"+incoming_number);                          

}else{   //电话状态                       

TelephonyManager tm =   

(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);             

switch (tm.getCallState()) {  

case TelephonyManager.CALL_STATE_RINGING:  

incomingFlag = true;//标识当前是来电,去电无此状态值

incoming_number = intent.getStringExtra("incoming_number");  

Log.i(TAG, "RINGING :"+ incoming_number);  

break;  

case TelephonyManager.CALL_STATE_OFFHOOK:                                  

if(incomingFlag){  

Log.i(TAG, "incoming ACCEPT :"+ incoming_number);  

} else{

//在此状态下是获取不到号码的,因此去电号码在上面获取

Log.i(TAG, "to number :"+incoming_number);

break;  

case TelephonyManager.CALL_STATE_IDLE: 

//切记在来电时,android.intent.action.PHONE_STATE获取的状态是CALL_STATE_IDLE摘机状态,考虑某个flag取出掉此state

if(incomingFlag){  

Log.i(TAG, "incoming IDLE");                                  

}  else{

Log.i(TAG, "to number :"+incoming_number);

}

break;  

}   

}  

}

}


最后要做的是配置权限和注册广播:

两条权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" ></uses-permission>

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >

    </uses-permission>

注册广播:

 <receiver android:name="com.example.demophonestate.PhoneStatReceiver" >

            <intent-filter>

                <action android:name="android.intent.action.PHONE_STATE" />

                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />

            </intent-filter>

        </receiver>

这就可以处理电话各种状态下的事情啦


    

© 著作权归作者所有

共有 人打赏支持
sky玦
粉丝 0
博文 1
码字总数 675
作品 0
阜阳
程序员
私信 提问
android 电话状态监听(来电和去电)实现代码

从事android开发的朋友们可能电话状态监听不是很擅长,接下来将详细介绍电话状态监听功能的实现步骤,需要了解的朋友可以参考下。 实现手机电话状态的监听,主要依靠两个类:TelephoneManger...

天王盖地虎626
01/11
0
0
android 2.1 监听电话状态并自动接听来电

一、开发环境 Elispse5.5,JDK1.6,Aadroid 2.1 二、开发中使用到的重点技术点: 距离感应(SENSOR_SERVICE ),音讯管理(AUDIO_SERVICE ), 电话状态监听 (TELEPHONY _ SERVICE ), java反射启动...

长平狐
2012/08/14
273
0
android 2.1 监听电话状态并自动接听来电

一、开发环境 Elispse5.5,JDK1.6,Aadroid 2.1 二、开发中使用到的重点技术点: 距离感应(SENSOR_SERVICE ),音讯管理(AUDIO_SERVICE ), 电话状态监听 (TELEPHONY _ SERVICE ), java反射启动...

长平狐
2012/08/21
181
0
android 2.1 监听电话状态并自动接听来电

一、开发环境 Elispse5.5,JDK1.6,Aadroid 2.1 二、开发中使用到的重点技术点: 距离感应(SENSOR_SERVICE ),音讯管理(AUDIO_SERVICE ), 电话状态监听 (TELEPHONY _ SERVICE ), java反射启动...

长平狐
2012/08/09
465
0
Android6.0 源码修改之屏蔽系统短信功能和来电功能

一、屏蔽系统短信功能 1、屏蔽所有短信 android 4.2 短信发送流程分析可参考这篇 戳这 源码位置 vendormediatekproprietarypackagesappsMmssrccomandroidmmstransactionSmsReceiverService....

cczheng
2018/10/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在React工程中使用JavaScript Barcode SDK创建Web条形码应用

基于WebAssembly构建的Dynamsoft JavaScript Barcode SDK让Web开发者能够创建适用于浏览器的高性能条码应用。这篇文章分享下如何使用React快速创建一个简单的Web条形码扫描应用。 下载 Node...

yushulx
29分钟前
1
0
java lambda笔记

c#中的lambda表达式简直不要太爽,但是感觉java的lambda和c#比有待继续提高。 先搞个筛选List集合的东西,我们先搞个集合玩玩。 List<Person> person = new ArrayList<Person>();Person p...

朝如青丝暮成雪
29分钟前
0
0
最严新规发布 网络短视频平台该如何降低违规风险?

1月9日中国网络视听节目服务协会对外正式发布了多项规范,对版权视频保护及违规内容,都进行了更加详细的标准制定,整体政策更加严格。 规范规定,网络短视频平台应当履行版权保护责任,不得...

阿里云官方博客
37分钟前
1
0
深入解读阿里云数据库POLARDB核心功能物理复制技术

日志是数据库的重要组成部份,按顺序以增量的方式记录了数据库上所有的操作,日志模块的设计对于数据库的可靠性、稳定性和性能都非常重要。 可靠性方面,在有一个数据文件的基础全量备份后,...

zhaowei121
43分钟前
1
0
CentOS 非root 用户 使用sudo 命令免密码

1. 使用su/su - 命令进入root权限下; 2. 给/etc/sudoers文件添加写权限 chmod u+w /etc/sudoers 3.找到“root ALL=(ALL) ALL ”,在后面添加:"dba ALL=(ALL) NOPASSWD: ALL" 4.保存退出,并......

驛路梨花醉美
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部