本文介绍使用TelephonyManager来获取手机SIM卡的状态和移动网络的相关信息,主要使用了TelephonyManager.listen函数,这个函数源码如下:
public void listen(PhoneStateListener listener, int events) {
String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>";
try {
Boolean notifyNow = (getITelephony() != null);
mRegistry.listen(pkgForDebug, listener.callback, events, notifyNow);
} catch (RemoteException ex) {
// system process dead
} catch (NullPointerException ex) {
// system process dead
}
}
具体的实现不是本文的重点,这里只来了解函数的两个参数:
1)PhoneStateListenerlistener
一般根据events的值,来实现相应的回调函数接口,在回调函数里面执行我们的处理,这些接口包括:
public void onServiceStateChanged(ServiceState serviceState)
public void onMessageWaitingIndicatorChanged(boolean mwi)
public void onCallForwardingIndicatorChanged(boolean cfi)
public void onCellLocationChanged(CellLocation location)
public void onCallStateChanged(int state, String incomingNumber)
public void onDataConnectionStateChanged(int state)
public void onDataConnectionStateChanged(int state, int networkType)
public void onDataActivity(int direction)
public void onSignalStrengthsChanged(SignalStrength signalStrength)
2)intevents
Events取值如下:
public static final int LISTEN_NONE = 0; //停止监听
public static final int LISTEN_SERVICE_STATE = 0x00000001;
public static final int LISTEN_MESSAGE_WAITING_INDICATOR = 0x00000004;
public static final int LISTEN_CALL_FORWARDING_INDICATOR = 0x00000008;
public static final int LISTEN_CELL_LOCATION = 0x00000010;
public static final int LISTEN_CALL_STATE = 0x00000020;
public static final int LISTEN_DATA_CONNECTION_STATE = 0x00000040;
public static final int LISTEN_DATA_ACTIVITY = 0x00000080;
public static final int LISTEN_SIGNAL_STRENGTHS = 0x00000100;
下面就是使用了上面知识点的代码了,先看布局文件network_detector.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id="@+id/phone_type"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView android:id="@+id/network_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView android:id="@+id/sim_state"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView android:id="@+id/network_type"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
完整Java代码如下(对APIDemos的解析,有删改):
package hust.iprai.asce1885;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.widget.TextView;
public class NetworkDetector extends Activity {
//SIM卡状态常量
private static final String SIM_ABSENT = "Absent"; //手机内无SIM卡
private static final String SIM_READY = "Ready"; //SIM卡已准备好
private static final String SIM_PIN_REQUIRED = "PIN required"; //需要SIM卡的PIN解锁
private static final String SIM_PUK_REQUIRED = "PUK required"; //需要SIM卡的PUK解锁
private static final String SIM_NETWORK_LOCKED = "Network locked"; //需要Network PIN解锁
private static final String SIM_UNKNOWN = "Unknown"; //状态未知
//网络类型常量
private static final String NETWORK_CDMA = "CDMA: Either IS95A or IS95B (2G)";
private static final String NETWORK_EDGE = "EDGE (2.75G)";
private static final String NETWORK_GPRS = "GPRS (2.5G)";
private static final String NETWORK_UMTS = "UMTS (3G)";
private static final String NETWORK_EVDO_0 = "EVDO revision 0 (3G)";
private static final String NETWORK_EVDO_A = "EVDO revision A (3G - Transitional)";
private static final String NETWORK_EVDO_B = "EVDO revision B (3G - Transitional)";
private static final String NETWORK_1X_RTT = "1xRTT (2G - Transitional)";
private static final String NETWORK_HSDPA = "HSDPA (3G - Transitional)";
private static final String NETWORK_HSUPA = "HSUPA (3G - Transitional)";
private static final String NETWORK_HSPA = "HSPA (3G - Transitional)";
private static final String NETWORK_IDEN = "iDen (2G)";
private static final String NETWORK_UNKOWN = "Unknown";
//手机制式类型常量
private static final String PHONE_CDMA = "CDMA";
private static final String PHONE_GSM = "GSM";
private static final String PHONE_NONE = "No radio";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.network_detector);
//获取telephony系统服务,用于取得SIM卡和网络相关信息
final TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
//更新界面上相关网络信息
updateViews(tm);
//由于SIM卡状态和网络信息随时都可能发生变化,因此需要注册PhoneStateListener
//来实时更新界面显示的信息。这里监听两个事件:LISTEN_SERVICE_STATE和LISTEN_DATA_CONNECTION_STATE
//它们分别对应回调函数onServiceStateChanged和onDataConnectionStateChanged
tm.listen(new PhoneStateListener() {
@Override
public void onDataConnectionStateChanged(int state, int networkType) {
//数据连接状态改变可能导致网络类型的改变
updateViews(tm);
}
@Override
public void onServiceStateChanged(ServiceState serviceState) {
updateViews(tm);
}
}, PhoneStateListener.LISTEN_SERVICE_STATE
| PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
}
@Override
protected void onResume() {
super.onResume();
final TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
updateViews(tm);
}
/**
* 更新SIM卡状态和网络信息
* @param tm
*/
private final void updateViews(TelephonyManager tm) {
TextView view = null;
view = (TextView) findViewById(R.id.sim_state);
view.setText("SIM State : " + mapSimStateToName(tm.getSimState()));
view = (TextView) findViewById(R.id.network_type);
view.setText("Network Type : " + mapNetworkTypeToName(tm.getNetworkType()));
view = (TextView) findViewById(R.id.network_name);
view.setText("Network Operator : " + tm.getNetworkOperatorName());
view = (TextView) findViewById(R.id.phone_type);
view.setText("Phone Type : " + mapDeviceTypeToName(tm.getPhoneType()));
}
/**
* 将手机制式值以字符串形式返回
* @param phoneType
* @return
*/
private String mapDeviceTypeToName(int phoneType) {
switch (phoneType) {
case TelephonyManager.PHONE_TYPE_CDMA:
return PHONE_CDMA;
case TelephonyManager.PHONE_TYPE_GSM:
return PHONE_GSM;
case TelephonyManager.PHONE_TYPE_NONE:
return PHONE_NONE;
default:
//不应该走到这个分支
return null;
}
}
/**
* 将网络类型值以字符串形式返回
* @param networkType
* @return
*/
private String mapNetworkTypeToName(int networkType) {
switch (networkType) {
case TelephonyManager.NETWORK_TYPE_CDMA:
return NETWORK_CDMA;
case TelephonyManager.NETWORK_TYPE_EDGE:
return NETWORK_EDGE;
case TelephonyManager.NETWORK_TYPE_GPRS:
return NETWORK_GPRS;
case TelephonyManager.NETWORK_TYPE_UMTS:
return NETWORK_UMTS;
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return NETWORK_EVDO_0;
case TelephonyManager.NETWORK_TYPE_EVDO_A:
return NETWORK_EVDO_A;
case TelephonyManager.NETWORK_TYPE_EVDO_B:
return NETWORK_EVDO_B;
case TelephonyManager.NETWORK_TYPE_1xRTT:
return NETWORK_1X_RTT;
case TelephonyManager.NETWORK_TYPE_HSDPA:
return NETWORK_HSDPA;
case TelephonyManager.NETWORK_TYPE_HSPA:
return NETWORK_HSPA;
case TelephonyManager.NETWORK_TYPE_HSUPA:
return NETWORK_HSUPA;
case TelephonyManager.NETWORK_TYPE_IDEN:
return NETWORK_IDEN;
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return NETWORK_UNKOWN;
}
}
/**
* 将SIM卡状态值以字符串形式返回
* @param simState
* @return
*/
private static String mapSimStateToName(int simState) {
switch (simState) {
case TelephonyManager.SIM_STATE_ABSENT:
return SIM_ABSENT;
case TelephonyManager.SIM_STATE_READY:
return SIM_READY;
case TelephonyManager.SIM_STATE_PIN_REQUIRED:
return SIM_PIN_REQUIRED;
case TelephonyManager.SIM_STATE_PUK_REQUIRED:
return SIM_PUK_REQUIRED;
case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
return SIM_NETWORK_LOCKED;
case TelephonyManager.SIM_STATE_UNKNOWN:
return SIM_UNKNOWN;
default:
//不应该走到这个分支
return null;
}
}
}
程序执行结果如图所示:
分享到:
相关推荐
Android(安卓)应用开发技术 TelephonyManager闹铃管理器的使用案例源代码.rar Android(安卓)应用开发技术 TelephonyManager闹铃管理器的使用案例源代码.rar Android(安卓)应用开发技术 TelephonyManager闹铃...
获取SIM卡信息: Android:基于TelephonyManager iOS:基于CoreTelephony
NULL 博文链接:https://luckfox.iteye.com/blog/1019587
其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在应用程序中可以使用这些get方法获取相关数据。 TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法来...
核心代码:Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId();1.加入权限在manifest.xml文件中要添加 <uses android:name=”android.permission.READ_PHONE_STATE”>2.代码 代码如下:...
TelephonyManager类使用方法大全TelephonyManager类使用方法大全
本文实例讲述了Android中TelephonyManager用法。分享给大家供大家参考,具体如下: 一、概述: TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、...
如下所示: 代码如下://android关闭或开启移动网络数据(关闭后,设备不可以上网,但可以打电话和发短信) public void setMobileDataEnabled(boolean enabled) { ConnectivityManager cm = (ConnectivityManager...
JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。先来看看本文程序运行的效果图: 本文程序演示了以下功能: 1.所有来电自动接听; 2.所有来电自动挂断; 3.开启/关闭Radio...
Android 通过开启后台的服务达到监听来电和去电 源码
主要介绍了Android中TelephonyManager类的方法,以实例形式较为详细的分析了Android基于TelephonyManager类获取手机各种常用信息的相关技巧,需要的朋友可以参考下
电话管理器(TelephonyManager)
5.15 获取sim卡内信息 5.15.1 sim卡简介 5.15.2 实现原理 5.15.3 具体实现 5.16 触屏拨号 5.17 获取正在运行的程序 5.18 变换屏幕的方向 5.19 获取设备信息 5.20 小结 第6章 手机自动服务 6.1 实现短信提醒 6.2 剩余...
主要介绍了Android中TelephonyManager类的用法,以获取Android手机硬件信息为例详细分析了TelephonyManager类的使用技巧,需要的朋友可以参考下
主要介绍了Android实现监听电话呼叫状态的方法,涉及Android权限控制及电话状态监听的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
主要介绍了Android的TelephonyManager功能,可以帮助读者更好的理解Java反射机制,需要的朋友可以参考下