获取SIM卡唯一标识
2016-11-03 16:24
423 查看
获取双卡IMSI 唯一标识 Android 5.0之后google提供了双卡服务,在很多场景下我们的程序需要绑定sim卡的唯一标识,由于5.0以下谷歌不支持双卡,所以只有一个获取默认主卡的方法。 方法如下: tManager.getSubscriberId(); 接下来介绍如何获取双卡的唯一标志IMSI 第一种方法: public static String getPhoneImsiNum(Context context) { int subId1 = -1; int subId2 = -1; String imsi1 = null; String imsi2 = null; try { TelephonyManager tManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //大于等于Android 5.0 L版本 Method getSubscriberId = tManager.getClass().getMethod("getSubscriberId", int.class); ContentResolver contentResolver = context.getContentResolver(); Cursor c = contentResolver.query(Uri.parse("content://telephony/siminfo"), new String[]{"_id"}, "sim_id" + " = ?", new String[]{"0"}, null); if (null != c && c.moveToFirst()) { subId1 = c.getInt(c.getColumnIndexOrThrow("_id")); Log.d("PhoneUtil", "subId1:" + subId1); c.close(); } c = contentResolver.query(Uri.parse("content://telephony/siminfo"), new String[]{"_id"}, "sim_id" + " = ?", new String[]{"1"}, null); if (null != c && c.moveToFirst()) { subId2 = c.getInt(c.getColumnIndexOrThrow("_id")); Log.d("PhoneUtil", "subId2:" + subId2); c.close(); } if (subId1 > 0) { imsi1 = (String) getSubscriberId.invoke(tManager, subId1); } if (subId2 > 0) { imsi2 = (String) getSubscriberId.invoke(tManager, subId2); } if (!TextUtils.isEmpty(imsi1) && !TextUtils.isEmpty(imsi2)) { return imsi1 + "," + imsi2; } else { if (!TextUtils.isEmpty(imsi1)) { return imsi1; } else { return imsi2; } } } else { //Android 5.0以下的api获取ismi方法 sdk < 21 return tManager.getDeviceId(); } } catch (Exception e) { e.printStackTrace(); } return null; } 通过上述方法,大部分机型都是可以获取到,但是... 有很多客制化严重的厂商,有可能把api改了或者别的原因导致获取不到.... 那就用下面的方法获取: /*** * sim_id 就是0 和 1 * 通过sim_id来获取subId 然后在根据subid 通过反射获取imsi值 sim_id 和subid在同一张表中,可以通过simid 获取subid 这样就解决问题了 之后在通过上面的方法把subid传入进去就可以了 * @return */ public int getSubId(int simid,Context context) { Uri uri = Uri.parse("content://telephony/siminfo"); Cursor cursor = null; ContentResolver contentResolver = context.getContentResolver(); try { cursor = contentResolver.query(uri, new String[]{"_id", "sim_id"}, "sim_id = ?", new String[]{String.valueOf(simid)}, null); if (null != cursor) { if (cursor.moveToFirst()) { return cursor.getInt(cursor.getColumnIndex("_id")); } } } catch (Exception e) { e.printStackTrace(); } finally { if (null != cursor) { cursor.close(); } } return -1; } 再来。。。 其实imsi并非是sim卡的唯一标识,其实在5.1.1谷歌提供了一个操作sub的类SubscriptionInfo 我们可以通过这个类获取到iccid 不用通过反射获取。。公开的api提供给你使用。。。但是必须要5.1以上的版本 代码如下: @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1) public static String getSimIccId(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { //大于等于Android 5.1.0 L版本 SubscriptionManager sub = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); List<SubscriptionInfo> info = sub.getActiveSubscriptionInfoList(); int count = sub.getActiveSubscriptionInfoCount(); if (count > 0) { if (count > 1) { String icc1 = info.get(0).getIccId(); String icc2 = info.get(1).getIccId(); return icc1 + "," + icc2; } else { for (SubscriptionInfo list : info) { String icc1 = list.getIccId(); return icc1; } } } else { Log.d("PhoneUtil", "无SIM卡"); return ""; } } else { //小于5.1.0 以下的版本 TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getSimSerialNumber(); } return ""; }
相关文章推荐
- 如何获取Android唯一标识(唯一序列号)
- 微信小程序例子——获取微信群唯一标识openGId
- ios设备唯一标识获取策略
- 如何获取设备唯一标识
- 如何获取ios设备的唯一标识
- ios设备唯一标识获取策略
- 获取IMEI设备的唯一标识以及异常提交
- IOS 关于设备唯一标识获取问题
- android手机获取唯一标识
- iOS 获取设备唯一标识
- 获取iOS设备唯一标识
- iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?
- Android获取设备唯一标识完美解决方案
- python 获取对象唯一标识
- IOS获取设备唯一标识的八种方法
- 获取iOS设备唯一标识 uuid
- ios开发——日常之 获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?
- 利用网卡地址和OpenUDID,实现获取设备唯一标识的一种方案
- android获取设备唯一标识
- WP7获取机子唯一标识的方法。