您的位置:首页 > 其它

获取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 "";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: