Android之TelephonyManager
在Android平台中,通过TelephonyManager可以访问与手机通讯相关的信息,比如设备信息、网络信息及SIM卡信息,同时还可以监听电话的相关状态。下面我们通过几个方面来说明Android平台中如何使用电话技术。
1、获取TelephonyManager对象
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
2、通过TelephonyManager获取设备信息
String phoneTypeStr = "未知";
int phoneType = telephonyManager.getPhoneType();
switch (phoneType){
case TelephonyManager.PHONE_TYPE_CDMA:
phoneTypeStr="CDMA";
break;
case TelephonyManager.PHONE_TYPE_GSM:
phoneTypeStr="GSM";
break;
case TelephonyManager.PHONE_TYPE_SIP:
phoneTypeStr="SIP";
break;
case TelephonyManager.PHONE_TYPE_NONE:
phoneTypeStr="None";
break;
}
addTelephoneView("电话类型",phoneTypeStr);
//GSM--IMEI CDMA--MEID
String deviceId = telephonyManager.getDeviceId();
addTelephoneView("设备编号",deviceId);
//软件版本编号
String softVersion = telephonyManager.getDeviceSoftwareVersion();
addTelephoneView("软件版本",softVersion);
//手机号码(不一定能获取到)
String phoneNumber = telephonyManager.getLine1Number();
addTelephoneView("手机号码",phoneNumber);
3、通过TelephonyManager获取网络信息
//网络信息:连接到一个网络时有效,如果是CDMA则不一定有效
//国家ISO代码
String networkCountry = telephonyManager.getNetworkCountryIso();
addTelephoneView("国家ISO代码",networkCountry);
//运营商信息
String networkOperatorId = telephonyManager.getNetworkOperator();
addTelephoneView("运营商编号",networkOperatorId);
String networkOperatorName=telephonyManager.getNetworkOperatorName();
addTelephoneView("运营商名称",networkOperatorName);
//网络连接状态
int networktype = telephonyManager.getNetworkType();
addTelephoneView("网络类型",networktype+"");
4、通过TelephonyManager获取SIM卡信息
//SIM卡的状态
int simState = telephonyManager.getSimState();
switch (simState){
case TelephonyManager.SIM_STATE_READY:
//SIM卡的ISO国家代码
String simISO = telephonyManager.getSimCountryIso();
addTelephoneView("SIM国家ISO",simISO);
//SIM卡的运营商代码
String simOperator = telephonyManager.getSimOperator();
addTelephoneView("SIM运营商编号",simOperator);
//SIM的运营商名称
String simOperatorName = telephonyManager.getSimOperatorName();
addTelephoneView("SIM运营商名称",simOperatorName);
//SIM的序列号‘
String number = telephonyManager.getSimSerialNumber();
addTelephoneView("SIM序列号",number);
break;
}
注意获取信息的时候需要添加如下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
运行结果如下:

5、通过继承PhoneStateListener,使用TelephonyManager注册后进行监听电话状态。
PhoneStateListener可以通过重写方法onCallStateChanged、onDataConnectionStateChanged、onDataActivity等方法对来电状态、数据连接状态、数据传输状态进行监听。 通过TelephonyManager.listen方法进行注册,该方法有两个参数,一个参数为PhoneStateListener,第二个参数为监听标志,决定了监听哪些状态。 PhoneStateListener的之类代码如下:
//定义电话状态监听器
private PhoneStateListener listener = new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
String msg = "未知";
switch (state){
case TelephonyManager.CALL_STATE_IDLE:
msg="电话空闲";
break;
case TelephonyManager.CALL_STATE_RINGING:
msg = incomingNumber+"来电话了,响铃中……";
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
msg = "电话中……";
break;
}
Toast.makeText(TelephonyActivity.this,msg,Toast.LENGTH_LONG).show();
} @Override
public void onDataConnectionStateChanged(int state) {
super.onDataConnectionStateChanged(state);
String msg = "未知";
switch (state){
case TelephonyManager.DATA_CONNECTED:
msg="数据已连接";
break;
case TelephonyManager.DATA_CONNECTING:
msg = "数据正在连接中……";
break;
case TelephonyManager.DATA_DISCONNECTED:
msg = "数据已关闭!";
break;
}
show.setText(msg);
} @Override
public void onDataActivity(int direction) {
super.onDataActivity(direction);
String msg = "未知";
switch (direction){
case TelephonyManager.DATA_ACTIVITY_IN:
msg = "下载";
break;
case TelephonyManager.DATA_ACTIVITY_OUT:
msg = "上传";
break;
case TelephonyManager.DATA_ACTIVITY_INOUT:
msg = "下载/上传";
break;
case TelephonyManager.DATA_ACTIVITY_NONE:
msg = "未知";
break;
}
show.setText(msg);
}
};
注册代码:
telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE
|PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
|PhoneStateListener.LISTEN_DATA_ACTIVITY);
注销代码:
telephonyManager.listen(listener,PhoneStateListener.LISTEN_NONE);
6、通过BroadcastReceiver接收广播监听电话的状态。
当拨打电话时系统会发送Intent.ACTION_NEW_OUTGOING_CALL广播,当电话状态发生变化的时候,系统会发送TelephonyManager.ACTION_PHONE_STATE_CHANGED广播,我们通过接收这两个广播来监听电话的相关状态
BroadcastReceiver的关键代码如下:
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
//去电
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
}else if(intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
//来电
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
//有来电,响铃中
//TelephonyManager.EXTRA_STATE_IDLE;
//TelephonyManager.EXTRA_STATE_OFFHOOK
String phoneNumber=
intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
//比对电话号码
if(null !=backNumber &&
null != phoneNumber &&
backNumber.endsWith(phoneNumber)){
//挂掉电话
//AIDL Android接口定义语言
//IPC
ITelephony iTelephony = getITelephony(context);
try {
iTelephony.endCall();
} catch (RemoteException e) {
e.printStackTrace();
} finally {
}
}
}else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
//
}else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
}
}
}
在清单文件中注册:
<receiver android:name=".receiver.PhoneStateChanagedReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
注意此处需要如下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
7、电话拦截,在6的基础上,完成电话拦截操作,这里需要使用到ITelephony.aidl。
首先在Android Studio的对应的Module中创建aidl目录,和java目录同级,在该目录下创建com.android.internal.telephony包和android.telephony包,然后拷贝ITelephony.aidl和NeighboringCellInfo.aidl到对应的包下,然后从新构建。通过反射拿到ITelephony对象并调用endCall方法挂断电话。
关键代码如下:
private static ITelephony getITelephony(Context context){
ITelephony iTelephony = null;
TelephonyManager telephonyManager=(TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
Class<TelephonyManager> c = TelephonyManager.class;
Method getITelephoneyMethod = null;
try {
getITelephoneyMethod = c.getDeclaredMethod("getITelephony",(Class[])null);
getITelephoneyMethod.setAccessible(true);
iTelephony = (ITelephony)getITelephoneyMethod.invoke(telephonyManager,(Object[])null);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return iTelephony;
}
出处:http://www.cnblogs.com/jerehedu/
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:

Android之TelephonyManager的更多相关文章
- Android之TelephonyManager类的方法详解
TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取 ...
- Android之TelephonyManager类的使用案例
TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取 ...
- TelephonyManager类:Android手机及Sim卡状态的获取
TelephonyManager这个类很有用,可以得到很多关于手机和Sim卡的信息. 直接上注释后的代码,请享用 package net.sunniwell.app;import android.ap ...
- android系统中使用TelephonyManager类来获取imei号和其他手机信息
在AndroidManifest.xml文件中增加<!--允许读取电话状态SIM的权限--><uses-permission android:name="android.p ...
- Android提供的系统服务之--TelephonyManager(电话管理器)
Android提供的系统服务之--TelephonyManager(电话管理器) 转载请注明出处--coder-pig TelephonyManager的作用: 用于管理手机通话状态,获取电话信息(设 ...
- Android TelephonyManager类的使用
TelephonyManager类主要提供了一系列获取手机与通讯相关的状态和信息的get方法,包含手机用户的信息.手机SIM的状态.电信网络的状态等. TelephonyManager类的对象的获取: ...
- Android来电监听和去电监听
我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开 1.监听来电去电有什么用? 2.怎么监听,来电去电监听方式一样吗? 3.实战,有什么需要特别注意地方? 监听 ...
- Android 短信广播接收相关问题
本人是Android新手,最近做了一个关于监听手机短信功能的应用,我在网上看资料了解到广播分为有序广播和无序广播,有序广播:无序广播又称普通广播,其中的利弊我也一时没搞清楚,我用的是有序广播实现的,具 ...
- Android NDK几点回调方式
一.NDK中获取android设备ID的方式 Java代码如下(获取设备ANDROID_ID): final String androidId = Secure.getString(context.g ...
随机推荐
- Chrome谷歌浏览器拓展组件的2种快速安装方法(.crx)
谷歌浏览器拓展有至少2种安装方法,现在简单的介绍下. 第一种.当然是进入谷歌官方的应用商店直接安装 这种方法简单快捷,而且官方支持度够高,唯一的缺点是大陆用户需要“FQ”. 谷歌拓展组件应用商店地址: ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Django-高级特性
分页 1.固定显示分页数目 2.点击相应分页取出对应数据 具体实现: from django.utils.safestring import mark_safe class Pagination(ob ...
- codevs 1365 浴火银河星际跳跃
1365 浴火银河星际跳跃 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 K 又在玩浴火银河了...不过这次他的目的不是跑运输 ...
- BZOJ 2843: 极地旅行社 lct splay
http://www.lydsy.com/JudgeOnline/problem.php?id=2843 https://blog.csdn.net/clove_unique/article/deta ...
- 程序逻辑问题---Writeup
原题地址:http://ctf5.shiyanbar.com/web/5/index.php 打开后是一处登陆界面 右键查看源代码 发现有一处txt文件 很明显就是程序的源代码 可以看到其中一句 $s ...
- 2018-2019-2 20162318《网络对抗技术》Exp3 免杀原理与实践
一.实验内容 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion),加壳工具),使用shellcode编程 2.通过组合应用各种技术实现恶意代码免杀(如果成 ...
- 华为S5300系列交换机V100R005SPH008热补丁
S23_33_53-V100R005SPH008.pat 附件: 链接:https://pan.baidu.com/s/1XfIQ55g5pWI9aqmM7LHUew 密码:f2mu
- Tasker to detect application running in background
We used to be told that tasker is only capable of detecting foreground application, if the app gets ...
- 关于ANDROID模拟器的一些事
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 继上一篇Android Studio VS Eclipse的文章后接着来分享AnDevCo ...