每日总结 - Android 读取SIM卡参数

时间:2021-01-17 14:49:09
  1 package com.water.activity;  
2
3 import java.util.List;
4
5 import android.app.Activity;
6 import android.os.Bundle;
7 import android.telephony.CellLocation;
8 import android.telephony.NeighboringCellInfo;
9 import android.telephony.TelephonyManager;
10 import android.util.Log;
11
12 public class MyList extends Activity {
13
14 /**
15 * android API中的TelephonyManager对象,可以取得SIM卡中的信息
16 */
17 private TelephonyManager telMgr;
18
19 @Override
20 public void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 setContentView(R.layout.main);
23
24 telMgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
25
26 if (telMgr.getSimState() == telMgr.SIM_STATE_READY) {
27 Log.i("MyList", "良好");
28 } else if (telMgr.getSimState() == telMgr.SIM_STATE_ABSENT) {
29 Log.i("MyList", "无SIM卡");
30 } else {
31 Log.i("MyList", "SIM卡被锁定或未知的状态");
32 }
33
34 Log.i("MyList", "电话状态[0 无活动/1 响铃/2 摘机]:" + getCallState());
35 Log.i("MyList", "电话方位:" + getCellLocation());
36 Log.i("MyList", "唯一的设备ID:" + getDeviceId());
37 Log.i("MyList", "设备的软件版本号:" + getDeviceSoftwareVersion());
38 Log.i("MyList", "手机号:" + getLine1Number());
39 Log.i("MyList", "附近的电话的信息:" + getNeighboringCellInfo());
40 Log.i("MyList", "获取ISO标准的国家码,即国际长途区号:" + getNetworkCountryIso());
41 Log.i("MyList", "MCC+MNC:" + getNetworkOperator());
42 Log.i("MyList", "(当前已注册的用户)的名字:" + getNetworkOperatorName());
43 Log.i("MyList", "当前使用的网络类型:" + getNetworkType());
44 Log.i("MyList", "手机类型:" + getPhoneType());
45 Log.i("MyList", "SIM卡的国家码:" + getSimCountryIso());
46 Log.i("MyList", "获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字:" + getSimOperator());
47 Log.i("MyList", "服务商名称:" + getSimOperatorName());
48 Log.i("MyList", "SIM卡的序列号:" + getSimSerialNumber());
49 Log.i("MyList", "SIM的状态信息:" + getSimState());
50 Log.i("MyList", "唯一的用户ID:" + getSubscriberId());
51 Log.i("MyList", "取得和语音邮件相关的标签,即为识别符:" + getVoiceMailAlphaTag());
52 Log.i("MyList", "获取语音邮件号码:" + getVoiceMailNumber());
53 Log.i("MyList", "ICC卡是否存在:" + hasIccCard());
54 Log.i("MyList", "是否漫游:" + isNetworkRoaming());
55 Log.i("MyList", "获取数据活动状态:" + getDataActivity());
56 Log.i("MyList", "获取数据连接状态:" + getDataState());
57
58 // telMgr.listen(PhoneStateListener listener, int events) ;
59 // 解释:
60 // IMSI是国际移动用户识别码的简称(International Mobile Subscriber Identity)
61 // IMSI共有15位,其结构如下:
62 // MCC+MNC+MIN
63 // MCC:Mobile Country Code,移动国家码,共3位,中国为460;
64 // MNC:Mobile NetworkCode,移动网络码,共2位
65 // 在中国,移动的代码为电00和02,联通的代码为01,电信的代码为03
66 // 合起来就是(也是Android手机中APN配置文件中的代码):
67 // 中国移动:46000 46002
68 // 中国联通:46001
69 // 中国电信:46003
70 // 举例,一个典型的IMSI号码为460030912121001
71 // IMEI是International Mobile Equipment Identity (国际移动设备标识)的简称
72 // IMEI由15位数字组成的”电子串号”,它与每台手机一一对应,而且该码是全世界唯一的
73 // 其组成为:
74 // 1. 前6位数(TAC)是”型号核准号码”,一般代表机型
75 // 2. 接着的2位数(FAC)是”最后装配号”,一般代表产地
76 // 3. 之后的6位数(SNR)是”串号”,一般代表生产顺序号
77 // 4. 最后1位数(SP)通常是”0″,为检验码,目前暂备用
78 }
79
80 /**
81 * 电话状态:<br/>
82 * CALL_STATE_IDLE 无任何状态时<br/>
83 * CALL_STATE_OFFHOOK 接起电话时<br/>
84 * CALL_STATE_RINGING 电话进来时
85 *
86 * @return
87 */
88 private int getCallState() {
89 return telMgr.getCallState();
90 }
91
92 /**
93 * 返回当前移动终端的位置 <br/>
94 *
95 * @return
96 */
97 private CellLocation getCellLocation() {
98 CellLocation location = telMgr.getCellLocation();
99
100 // 请求位置更新,如果更新将产生广播,接收对象为注册LISTEN_CELL_LOCATION的对象,需要的permission名称为ACCESS_COARSE_LOCATION。
101 // location.requestLocationUpdate();
102
103 return location;
104 }
105
106 /**
107 * 唯一的设备ID:<br/>
108 * 如果是GSM网络,返回IMEI;如果是CDMA网络,返回MEID<br/>
109 * 需要权限:android.permission.READ_PHONE_STATE
110 *
111 * @return null if device ID is not available.
112 */
113 private String getDeviceId() {
114 return telMgr.getDeviceId();
115 }
116
117 /**
118 * 返回移动终端的软件版本:<br/>
119 * 例如:GSM手机的IMEI/SV码。<br/>
120 *
121 * @return null if the software version is not available.
122 */
123 private String getDeviceSoftwareVersion() {
124 return telMgr.getDeviceSoftwareVersion();
125 }
126
127 /**
128 * 手机号:<br/>
129 * 对于GSM网络来说即MSISDN
130 *
131 * @return null if it is unavailable.
132 */
133 private String getLine1Number() {
134 return telMgr.getLine1Number();
135 }
136
137 /**
138 * 返回当前移动终端附近移动终端的信息:<br/>
139 * 类型:List<NeighboringCellInfo><br/>
140 * 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES
141 *
142 * @return
143 */
144 private List<NeighboringCellInfo> getNeighboringCellInfo() {
145 // List<NeighboringCellInfo> infos = telMgr.getNeighboringCellInfo();
146 // for (NeighboringCellInfo info : infos) {
147 // // 获取邻居小区号
148 // int cid = info.getCid();
149 //
150 // // 获取邻居小区LAC,LAC:
151 // // 位置区域码。为了确定移动台的位置,每个GSM/PLMN的覆盖区都被划分成许多位置区,LAC则用于标识不同的位置区。
152 // info.getLac();
153 // info.getNetworkType();
154 // info.getPsc();
155 //
156 // // 获取邻居小区信号强度
157 // info.getRssi();
158 // }
159
160 return telMgr.getNeighboringCellInfo();
161 }
162
163 /**
164 * 获取ISO标准的国家码,即国际长途区号。<br/>
165 * 注意:仅当用户已在网络注册后有效。<br/>
166 * 在CDMA网络中结果也许不可靠。<br/>
167 *
168 * @return
169 */
170 private String getNetworkCountryIso() {
171 return telMgr.getNetworkCountryIso();
172 }
173
174 /**
175 * MCC+MNC(mobile country code + mobile network code)<br/>
176 * 注意:仅当用户已在网络注册时有效。<br/>
177 * 在CDMA网络中结果也许不可靠。<br/>
178 *
179 * @return
180 */
181 private String getNetworkOperator() {
182 return telMgr.getNetworkOperator();
183 }
184
185 /**
186 * 按照字母次序的current registered operator(当前已注册的用户)的名字<br/>
187 * 注意:仅当用户已在网络注册时有效。<br/>
188 * 在CDMA网络中结果也许不可靠。
189 *
190 * @return
191 */
192 private String getNetworkOperatorName() {
193 return telMgr.getNetworkOperatorName();
194 }
195
196 /**
197 * 当前使用的网络类型:<br/>
198 * NETWORK_TYPE_UNKNOWN 网络类型未知 0<br/>
199 * NETWORK_TYPE_GPRS GPRS网络 1<br/>
200 * NETWORK_TYPE_EDGE EDGE网络 2<br/>
201 * NETWORK_TYPE_UMTS UMTS网络 3<br/>
202 * NETWORK_TYPE_HSDPA HSDPA网络 8<br/>
203 * NETWORK_TYPE_HSUPA HSUPA网络 9<br/>
204 * NETWORK_TYPE_HSPA HSPA网络 10<br/>
205 * NETWORK_TYPE_CDMA CDMA网络,IS95A 或 IS95B. 4<br/>
206 * NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5<br/>
207 * NETWORK_TYPE_EVDO_A EVDO网络, revision A. 6<br/>
208 * NETWORK_TYPE_1xRTT 1xRTT网络 7<br/>
209 * 在中国,联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EGDE,电信的2G为CDMA,电信的3G为EVDO<br/>
210 *
211 * @return
212 */
213 private int getNetworkType() {
214 return telMgr.getNetworkType();
215 }
216
217 /**
218 * 返回移动终端的类型:<br/>
219 * PHONE_TYPE_CDMA 手机制式为CDMA,电信<br/>
220 * PHONE_TYPE_GSM 手机制式为GSM,移动和联通<br/>
221 * PHONE_TYPE_NONE 手机制式未知<br/>
222 *
223 * @return
224 */
225 private int getPhoneType() {
226 return telMgr.getPhoneType();
227 }
228
229 /**
230 * 获取ISO国家码,相当于提供SIM卡的国家码。
231 *
232 * @return Returns the ISO country code equivalent for the SIM provider's
233 * country code.
234 */
235 private String getSimCountryIso() {
236 return telMgr.getSimCountryIso();
237 }
238
239 /**
240 * 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字.<br/>
241 * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).
242 *
243 * @return Returns the MCC+MNC (mobile country code + mobile network code)
244 * of the provider of the SIM. 5 or 6 decimal digits.
245 */
246 private String getSimOperator() {
247 return telMgr.getSimOperator();
248 }
249
250 /**
251 * 服务商名称:<br/>
252 * 例如:中国移动、联通<br/>
253 * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).
254 *
255 * @return
256 */
257 private String getSimOperatorName() {
258 return telMgr.getSimOperatorName();
259 }
260
261 /**
262 * SIM卡的序列号:<br/>
263 * 需要权限:READ_PHONE_STATE
264 *
265 * @return
266 */
267 private String getSimSerialNumber() {
268 return telMgr.getSimSerialNumber();
269 }
270
271 /**
272 * SIM的状态信息:<br/>
273 * SIM_STATE_UNKNOWN 未知状态 0<br/>
274 * SIM_STATE_ABSENT 没插卡 1<br/>
275 * SIM_STATE_PIN_REQUIRED 锁定状态,需要用户的PIN码解锁 2<br/>
276 * SIM_STATE_PUK_REQUIRED 锁定状态,需要用户的PUK码解锁 3<br/>
277 * SIM_STATE_NETWORK_LOCKED 锁定状态,需要网络的PIN码解锁 4<br/>
278 * SIM_STATE_READY 就绪状态 5
279 *
280 * @return
281 */
282 private int getSimState() {
283 return telMgr.getSimState();
284 }
285
286 /**
287 * 唯一的用户ID:<br/>
288 * 例如:IMSI(国际移动用户识别码) for a GSM phone.<br/>
289 * 需要权限:READ_PHONE_STATE
290 *
291 * @return
292 */
293 private String getSubscriberId() {
294 return telMgr.getSubscriberId();
295 }
296
297 /**
298 * 取得和语音邮件相关的标签,即为识别符<br/>
299 * 需要权限:READ_PHONE_STATE
300 *
301 * @return
302 */
303 private String getVoiceMailAlphaTag() {
304 return telMgr.getVoiceMailAlphaTag();
305 }
306
307 /**
308 * 获取语音邮件号码:<br/>
309 * 需要权限:READ_PHONE_STATE
310 *
311 * @return
312 */
313 private String getVoiceMailNumber() {
314 return telMgr.getVoiceMailNumber();
315 }
316
317 /**
318 * ICC卡是否存在
319 *
320 * @return
321 */
322 private boolean hasIccCard() {
323 return telMgr.hasIccCard();
324 }
325
326 /**
327 * 是否漫游:(在GSM用途下)
328 *
329 * @return
330 */
331 private boolean isNetworkRoaming() {
332 return telMgr.isNetworkRoaming();
333 }
334
335 /**
336 * 获取数据活动状态<br/>
337 * DATA_ACTIVITY_IN 数据连接状态:活动,正在接受数据<br/>
338 * DATA_ACTIVITY_OUT 数据连接状态:活动,正在发送数据<br/>
339 * DATA_ACTIVITY_INOUT 数据连接状态:活动,正在接受和发送数据<br/>
340 * DATA_ACTIVITY_NONE 数据连接状态:活动,但无数据发送和接受<br/>
341 *
342 * @return
343 */
344 private int getDataActivity() {
345 return telMgr.getDataActivity();
346 }
347
348 /**
349 * 获取数据连接状态<br/>
350 * DATA_CONNECTED 数据连接状态:已连接<br/>
351 * DATA_CONNECTING 数据连接状态:正在连接<br/>
352 * DATA_DISCONNECTED 数据连接状态:断开<br/>
353 * DATA_SUSPENDED 数据连接状态:暂停<br/>
354 *
355 * @return
356 */
357 private int getDataState() {
358 return telMgr.getDataState();
359 }
360
361 }