Android之电话状态的监听(来电和去电)

实现手机电话状态的监听,主要依靠两个类:TelephoneManger和PhoneStateListener。
TelephonseManger提供了取得手机基本服务的信息的一种方式。因此应用程序可以使用TelephonyManager来探测手机基本服务的情况。应用程序可以注册listener来监听电话状态的改变。我们不能对TelephonyManager进行实例化,只能通过获取服务的形式:
Context.getSystemService(Context.TELEPHONY_SERVICE);
注意:对手机的某些信息进行读取是需要一定许可(permission)的。
 
主要静态成员常量:(它们对应PhoneStateListener.LISTEN_CALL_STATE所监听到的内容)
int CALL_STATE_IDLE   空闲状态,没有任何活动。
int CALL_STATE_OFFHOOK  摘机状态,至少有个电话活动。该活动或是拨打(dialing)或是通话,或是 on hold。并且没有电话是ringing or waiting
int CALL_STATE_RINGING  来电状态,电话铃声响起的那段时间或正在通话又来新电,新来电话不得不等待的那段时间。
 
手机通话状态在广播中的对应值
 
EXTRA_STATE_IDLE 它在手机通话状态改变的广播中,用于表示CALL_STATE_IDLE状态
EXTRA_STATE_OFFHOOK 它在手机通话状态改变的广播中,用于表示CALL_STATE_OFFHOOK状态
EXTRA_STATE_RINGING 它在手机通话状态改变的广播中,用于表示CALL_STATE_RINGING状态
ACTION_PHONE_STATE_CHANGED 在广播中用ACTION_PHONE_STATE_CHANGED这个Action来标示通话状态改变的广播(intent)。
注:需要许可READ_PHONE_STATE。
String EXTRA_INCOMING_NUMBER 
在手机通话状态改变的广播,用于从extra取来电号码。
String EXTRA_STATE  在通话状态改变的广播,用于从extra取来通话状态。
 
主要成员函数
public int getCallState() 取得手机的通话状态。
public CellLocation getCellLocation () 返回手机当前所处的位置。如果当前定位服务不可用,则返回null
注:需要许可(Permission)ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION.
public int getDataActivity () 返回当前数据连接活动状态的情况。
public int getDataState () 返回当前数据连接状态的情况。
public String getDeviceId ()
返回手机的设备ID。比如对于GSM的手机来说是IMEI码,对于CDMA的手机来说MEID码或ESN码。如果读取失败,则返回null。
 
如何实现电话状态的监听呢?
 
Android在电话状态改变是会发送action为android.intent.action.PHONE_STATE的广播,而拨打电话时会发送action为android.intent.action.NEW_OUTGOING_CALL的广播,但是我看了下开发文档,暂时没发现有来电时的广播。通过自定义广播接收器,接受上述两个广播便可。
 
Java代码:

package com.pocketdigi.phonelistener;import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;public class PhoneReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("action"+intent.getAction());//如果是去电if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);Log.d(TAG, "call OUT:" + phoneNumber); }else{//查了下android文档,貌似没有专门用于接收来电的action,所以,非去电即来电.//如果我们想要监听电话的拨打状况,需要这么几步 :* 第一:获取电话服务管理器TelephonyManager manager = this.getSystemService(TELEPHONY_SERVICE);* 第二:通过TelephonyManager注册我们要监听的电话状态改变事件。manager.listen(new MyPhoneStateListener(),* PhoneStateListener.LISTEN_CALL_STATE);这里的PhoneStateListener.LISTEN_CALL_STATE就是我们想要* 监听的状态改变事件,初次之外,还有很多其他事件哦。* 第三步:通过extends PhoneStateListener来定制自己的规则。将其对象传递给第二步作为参数。* 第四步:这一步很重要,那就是给应用添加权限。android.permission.READ_PHONE_STATETelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//设置一个监听器}}PhoneStateListener listener=new PhoneStateListener(){@Overridepublic void onCallStateChanged(int state, String incomingNumber) {//注意,方法必须写在super方法后面,否则incomingNumber无法获取到值。super.onCallStateChanged(state, incomingNumber);switch(state){case TelephonyManager.CALL_STATE_IDLE:System.out.println("挂断");break;case TelephonyManager.CALL_STATE_OFFHOOK:System.out.println("接听");break;case TelephonyManager.CALL_STATE_RINGING:System.out.println("响铃:来电号码"+incomingNumber);//输出来电号码break;}}};
}


要在AndroidManifest.xml注册广播接收器:
<receiver android:name=".PhoneReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.PHONE_STATE"/>  
    <action android:name="android.intent.action.NEW_OUTGOING_CALL" />  
        </intent-filter>  
       </receiver>  
 <receiver android:name=".PhoneReceiver"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE"/> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver>

还要添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>  
   <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Only the original thread that created a view hierarchy can touch its views.

/*********************************************************************************** Only the original thread that created a view hierarchy can touch its views.* 说明&#xff1a;* 自定义view的时候出现这个错误&#xff0c;是用错了方法。* * …

史上最让数学家无奈的规定!背后真相让人不敢相信,可是没有人能证明对错.........

全世界只有3.14 % 的人关注了爆炸吧知识负负得正怎么证明&#xff1f;放假了&#xff0c;8岁表妹又来我家打算好好学习。今天聊着聊着&#xff0c;超模君差点被她给绕进去。她&#xff1a;“老师说负负得正&#xff0c;所以&#xff0c;所以所有的负数乘以负数都是正数&#xf…

paip.C#.NET JSON解析总结

paip.C#.NET JSON解析总结 作者Attilax &#xff0c; EMAIL:1466519819qq.com 近日做跑号器,需要解析JSON {"code":799,"data":{"backUrl":""},"message":"\u767b\u9646\u6210\u529f"} 查了下资料,有原生API…

网络编程资源

高性能 Socket 组件 HP-Socket v3.2.1-RC1 发布 http://bbs.csdn.net/topics/390763397 The C10K problem 高性能服务器设计 http://www.cnblogs.com/fll/archive/2008/05/17/1201540.html http://blog.sina.com.cn/s/blog_4aec22920100itkf.html 这周看了Dan Kegel那篇"…

计算机试题dddd,数据库系统概论试题及答案dddd_Image_Marked.pdf

数据库系统概论试题及答案dddd_Image_Marked数据库系统概论复习资料&#xff1a;第一章&#xff1a;一选择题&#xff1a;1&#xff0e;在数据管理技术的发展过程中&#xff0c;经历了人工管理阶段、文件系统阶段和数据库系统阶段。在这几个阶段中&#xff0c;数据独立性最高的…

Android之AudioManager(音频管理器)详解

AudioManager简介&#xff1a; AudioManager类提供了访问音量和振铃器mode控制。使用Context.getSystemService&#xff08;Context.AUDIO_SERVICE&#xff09;来得到这个类的一个实例。 公有方法&#xff1a; Public Methods int abandonAudioFocus(AudioManager.OnAudioFo…

Asp.NetCore3.1开源项目升级为.Net6.0

概述自从.Net6.0出来后&#xff0c;一直想之前开发的项目升级.Net6.0&#xff0c;有时想想毕竟中间还跨了个5.0版本&#xff0c;升级起来不知道坑大不大&#xff0c;最近抽时间对升级的方案做了些研究&#xff0c;然后将代码升级为.Net6.0。本质上来说我个人不太喜欢.Net6.0去掉…

ios开发备忘录三

为什么80%的码农都做不了架构师&#xff1f;>>> 在配置第三方库EGORefreshTableHeaderView的时候&#xff08;其实就只是一个头文件和一个源文件&#xff0c;还算不上库&#xff09;&#xff0c;可以从头文件发现 #import <QuartzCore/QuartzCore.h> 所以必…

Android之Eclipse下面如何看Android源代码

在看代码的时候,会经常用到 ctrl鼠标左键 去看自己写的类,有时候点到java的类或者android的类就无法打开,显示no class found之类的东西, 1.拿Button举例,ctrl加鼠标左键,然后显示了no class found之后,这时候会发现整个页面只有一个按钮可以点击,就是change attach source,如果…

项目管理 计算机仿真,分析计算机仿真技术在工程项目施工管理中的运用.pdf

第 33 卷 第 1 期(上) 赤 峰 学 院 学 报( 自 然 科 学 版 ) Vol. 33 No.12017 年 1 月 Journal of Chifeng University (Natural Science Edition) Jan. 2017分析计算机仿真技术在工程项目施工管理中的运用林振文(厦 门软件职业技 术学院 &#xff0c; 福 建 厦 门 361024 )摘…

C# 企业微信消息推送对接,实现天气预报推送

准备工作需要获取的东西1. 企业Id,2.应用secret 和 应用ID获取企业id注册完成后&#xff0c;在我的企业》企业信息》最下面企业id获取应用secret 和 应用ID发送微信消息class WeCom{public static string weComCId "ww2b b0bf8";//企业Id①public static string we…

通信协议——HTTP、TCP、UDP

TCP HTTP UDP:都是通信协议&#xff0c;也就是通信时所遵守的规则&#xff0c;只有双方按照这个规则“说话”&#xff0c;对方才能理解或为之服务。TCP HTTP UDP三者的关系:TCP/IP是个协议组&#xff0c;可分为四个层次&#xff1a;网络接口层、网络层、传输层和应用层…

++i 与 i++

i 与 i都能实现自增,它们的区别在哪? i:先自增,然后返回引用. i:先进行一个本地备份(可以理解为定义一个临时变量),自增,然后返回临时变量的引用. 理论上来讲,i操作会快于i,但由于现代编译器做了优化.所以,i与i在性能上的并无差别.转载于:https://www.cnblogs.com/heavenyes/p…

Visual Studio 远程调试正在运行的进程

使用场景当项目在测试环境上有bug&#xff0c;需要运行代码调试一下&#xff0c;这时就需要在测试环境上安装一个调试工具&#xff0c;然后在本地运行代码&#xff0c;远程链接到测试环境服务器来调试代码&#xff1b;&#xff08;假期鸽了这末长的时间&#xff09;方式一&…

直男约会能有多奇葩​?

1 六根烟来了七位领导怎么办&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 和36号鞋垫一样大的毛肚&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 直男约会能有多奇葩&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 高情商v…

Android之如何解决adb server is out of date,killing...ADB server didn't ACK

今天&#xff0c;久未出现的著名的“adb server is out of date. killing”又发生了&#xff0c;在此&#xff0c;将解决方法记下&#xff0c;以便日后查看。 1. 错误信息&#xff1a; C:\Users\lizy>adb devices adb devicesadb server is out of date. killing... ADB …

计算机如何实现共享接入,局域网内电脑实现共享设置方法

不同局域网内电脑怎么实现互访实现文件或打印机共享设置?下面由学习啦小编给你做出详细的实现共享设置方法介绍!希望对你有帮助!局域网内电脑实现共享设置方法&#xff1a;一、使用一条网线将两个路由器连接&#xff0c;网线插在路由器的LAN口上;二、两个路由器要设置两个不同…

python的内建函数详解

python内建函数最近一直在学习python&#xff0c;在网上看到和学习了关于python内建函数的一些分类和个内建函数的作用&#xff0c;下面是一些关于python内建函数的罗列&#xff0c;初学者的了解&#xff0c;分类可能不准确&#xff0c;一起交流。一、数学运算类abs(x)求绝对值…

【另类见解】一致性哈希就能解决分库分表问题了?

“开局一问&#xff1a;分库分表行为中&#xff0c;一致性哈希到底用处大不大&#xff1f;装B脑图现在是大数据的时代&#xff0c;其中一个体现就是数据量非常庞大。当然大数据的概念绝非是数据量就可以定义的&#xff0c;我自己给大数据下的定义是&#xff1a;无处不在的大量数…