在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的更多相关文章

  1. Android之TelephonyManager类的方法详解

    TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取 ...

  2. Android之TelephonyManager类的使用案例

    TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取 ...

  3. TelephonyManager类:Android手机及Sim卡状态的获取

    TelephonyManager这个类很有用,可以得到很多关于手机和Sim卡的信息. 直接上注释后的代码,请享用 package net.sunniwell.app;import android.ap ...

  4. android系统中使用TelephonyManager类来获取imei号和其他手机信息

    在AndroidManifest.xml文件中增加<!--允许读取电话状态SIM的权限--><uses-permission android:name="android.p ...

  5. Android提供的系统服务之--TelephonyManager(电话管理器)

    Android提供的系统服务之--TelephonyManager(电话管理器) 转载请注明出处--coder-pig TelephonyManager的作用: 用于管理手机通话状态,获取电话信息(设 ...

  6. Android TelephonyManager类的使用

    TelephonyManager类主要提供了一系列获取手机与通讯相关的状态和信息的get方法,包含手机用户的信息.手机SIM的状态.电信网络的状态等. TelephonyManager类的对象的获取: ...

  7. Android来电监听和去电监听

    我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开 1.监听来电去电有什么用? 2.怎么监听,来电去电监听方式一样吗? 3.实战,有什么需要特别注意地方? 监听 ...

  8. Android 短信广播接收相关问题

    本人是Android新手,最近做了一个关于监听手机短信功能的应用,我在网上看资料了解到广播分为有序广播和无序广播,有序广播:无序广播又称普通广播,其中的利弊我也一时没搞清楚,我用的是有序广播实现的,具 ...

  9. Android NDK几点回调方式

    一.NDK中获取android设备ID的方式 Java代码如下(获取设备ANDROID_ID): final String androidId = Secure.getString(context.g ...

随机推荐

  1. Chrome谷歌浏览器拓展组件的2种快速安装方法(.crx)

    谷歌浏览器拓展有至少2种安装方法,现在简单的介绍下. 第一种.当然是进入谷歌官方的应用商店直接安装 这种方法简单快捷,而且官方支持度够高,唯一的缺点是大陆用户需要“FQ”. 谷歌拓展组件应用商店地址: ...

  2. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  3. Django-高级特性

    分页 1.固定显示分页数目 2.点击相应分页取出对应数据 具体实现: from django.utils.safestring import mark_safe class Pagination(ob ...

  4. codevs 1365 浴火银河星际跳跃

    1365 浴火银河星际跳跃 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 K 又在玩浴火银河了...不过这次他的目的不是跑运输 ...

  5. BZOJ 2843: 极地旅行社 lct splay

    http://www.lydsy.com/JudgeOnline/problem.php?id=2843 https://blog.csdn.net/clove_unique/article/deta ...

  6. 程序逻辑问题---Writeup

    原题地址:http://ctf5.shiyanbar.com/web/5/index.php 打开后是一处登陆界面 右键查看源代码 发现有一处txt文件 很明显就是程序的源代码 可以看到其中一句 $s ...

  7. 2018-2019-2 20162318《网络对抗技术》Exp3 免杀原理与实践

    一.实验内容 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion),加壳工具),使用shellcode编程 2.通过组合应用各种技术实现恶意代码免杀(如果成 ...

  8. 华为S5300系列交换机V100R005SPH008热补丁

    S23_33_53-V100R005SPH008.pat 附件: 链接:https://pan.baidu.com/s/1XfIQ55g5pWI9aqmM7LHUew  密码:f2mu

  9. 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 ...

  10. 关于ANDROID模拟器的一些事

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 继上一篇Android Studio VS Eclipse的文章后接着来分享AnDevCo ...