废话不多,直接上干货==>
1 以下所有方法都需要在AndroidManifest.xml声明权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
声明权限后,请确认在手机应用权限界面设备信息一栏已经勾选上。
2 原生api获取sim卡id,只能获取单卡
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String id = telephonyManager.getSubscriberId();
3 获取sim卡数量
SubscriptionManager mSubscriptionManager = SubscriptionManager.from(this);
int simNumberCard = mSubscriptionManager.getActiveSubscriptionInfoCount();//获取当前sim卡数量
3.5 打印SIM卡信息:
SubscriptionManager mSubscriptionManager = SubscriptionManager.from(this);
List<SubscriptionInfo> mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
for (SubscriptionInfo info : mSubInfoList) {
Log.i("log",info.toString());
}
小米6插上双卡输出日志:
{id=1, iccId=898611150[****] simSlotIndex=0 displayName=中国电信 carrierName=中国电信 nameSource=0 iconTint=-16746133 dataRoaming=0 iconBitmap=android.graphics.Bitmap@b482d41 mcc 460 mnc 11}
{id=4, iccId=898601188[****] simSlotIndex=1 displayName=中国联通 carrierName=中国联通 nameSource=0 iconTint=-16746133 dataRoaming=0 iconBitmap=android.graphics.Bitmap@ccb42e6 mcc 460 mnc 9}
其中simSlotIndex = 0 是主卡,1是副卡
这种方法可以获取SIM卡数量和运营商,但是不能获取sim卡id。
4 获取sim卡id
public HashSet<String> getSecondImsi(Context context) {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Class<?> telephonyclass = telephonyManager.getClass();
Method method = null;
boolean param = true;
try {
method = telephonyclass.getDeclaredMethod("getSubscriberId",int.class);
}catch (NoSuchMethodException e){
try {
method = telephonyclass.getDeclaredMethod("getSubscriberId",long.class);
param = false;
}catch (NoSuchMethodException e2) {
}
}
Object object = null;
HashSet<String> buildSet = new HashSet<>();
if (param){
for(int i = 0;i < 9;i++) {
try {
object = method.invoke(telephonyManager,i);
if (object != null){
buildSet.add(object.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return buildSet;
}
在小米6和华为荣耀10手机上测试通过,可以返回两个sim卡的id。
2020-1-1 add:
- 发现在出国或出境的情况下,getSubscriberId值会变化,这种情况下就不能作为唯一值。可以用iccid作为唯一值(ICCID:集成电路卡识别码,相当于手机号码的身份证)
5 获取ICCID:
goog提供的方法
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getSimSerialNumber();
双卡获取参考3
SubscriptionManager mSubscriptionManager = SubscriptionManager.from(this);
List<SubscriptionInfo> mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
for (SubscriptionInfo info : mSubInfoList) {
Log.i("log",info.getIccId());
}
参考:
https://blog.csdn.net/ymcl_hx/article/details/53484797
https://blog.csdn.net/u010429219/article/details/75112800