Android 获取ICCID,IMEI
权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Android 6.0 以上需要动态申请
获取ICCID方法
一:TelephonyManager
在Android Q之前 可用,
在android Q(10)上不可用,尝试降低targetSdkVersion至28,同样在华为手机上无法获取IMEI和ICCID,其他手机待测
public static String getSimSerialNumber(Context context) {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);
boolean allow = ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED;
Log.d("ALLOW","-----"+allow);
//IMEI
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Log.d("Phone Imei","==="+telephonyManager.getImei());
} else {
Log.d("Phone Imei","==="+telephonyManager.getDeviceId());
}
//ICCID
Log.d("Phone SimSerial","==="+telephonyManager.getSimSerialNumber());
return telephonyManager.getSimSerialNumber();
}
二: SubscriptionInfo
在android Q(10)上可以获取ICCID,在华为手机上无法获取Number,也无法通过反射获取IMEI
public static String getSimSerialNumberAll(Context context) {
boolean allow = ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED;
if (!allow) {
return "Need READ_PHONE_STATE permission";
}
List<SubscriptionInfo> sis;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
SubscriptionManager sm = SubscriptionManager.from(context);
int count = sm.getActiveSubscriptionInfoCount();//当前实际插卡数量
int max = sm.getActiveSubscriptionInfoCountMax();//当前卡槽数量
Log.d("card number=", String.valueOf(count));
Log.d("card slot num", String.valueOf(max));
sis = sm.getActiveSubscriptionInfoList();
for (SubscriptionInfo subInfo : sis) {
Log.d("iccId",subInfo.getIccId()); //ICC ID
Log.d("Number",subInfo.getNumber());
}
return Arrays.toString(sis.toArray());
}else {
return "version < 22";
}
}
TelephonyManager tm = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);
try {
Method method = tm.getClass().getMethod("getImei");
String imei = (String) method.invoke(tm);
Log.d("sim卡IMEI:","==="+imei);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
详细:唯一标识符最佳做法
参考:
https://blog.youkuaiyun.com/qq_43278826/article/details/95216504