双卡android手机SIM卡信息探索 ,获取手机 SIM卡数量和SIM卡id

废话不多,直接上干货==>

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

发布了3 篇原创文章 · 获赞 0 · 访问量 145

猜你喜欢

转载自blog.csdn.net/qq_35501560/article/details/103635510