Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题

由于国内的运营商问题,双卡手机获取IMSI号问题要根据厂商API 来实现。

下面我们就来做一套完整的分析运营商获取IMSI号逻辑。

1,首先我们要判断手机的平台。

1.1,判断手机是否MTK平台

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

public static MtkDoubleInfo initMtkDoubleSim(Context mContext) {

    MtkDoubleInfo mtkDoubleInfo = new MtkDoubleInfo();

    try {

        TelephonyManager tm = (TelephonyManager) mContext

                .getSystemService(Context.TELEPHONY_SERVICE);

        Class<!--?--> c = Class.forName("com.android.internal.telephony.Phone");

        Field fields1 = c.getField("GEMINI_SIM_1");

        fields1.setAccessible(true);

        mtkDoubleInfo.setSimId_1((Integer) fields1.get(null));

        Field fields2 = c.getField("GEMINI_SIM_2");

        fields2.setAccessible(true);

        mtkDoubleInfo.setSimId_2((Integer) fields2.get(null));

        Method m = TelephonyManager.class.getDeclaredMethod(

                "getSubscriberIdGemini", int.class);

        mtkDoubleInfo.setImsi_1((String) m.invoke(tm,

                mtkDoubleInfo.getSimId_1()));

        mtkDoubleInfo.setImsi_2((String) m.invoke(tm,

                mtkDoubleInfo.getSimId_2()));

        Method m1 = TelephonyManager.class.getDeclaredMethod(

                "getDeviceIdGemini", int.class);

        mtkDoubleInfo.setImei_1((String) m1.invoke(tm,

                mtkDoubleInfo.getSimId_1()));

        mtkDoubleInfo.setImei_2((String) m1.invoke(tm,

                mtkDoubleInfo.getSimId_2()));

        Method mx = TelephonyManager.class.getDeclaredMethod(

                "getPhoneTypeGemini", int.class);

        mtkDoubleInfo.setPhoneType_1((Integer) mx.invoke(tm,

                mtkDoubleInfo.getSimId_1()));

        mtkDoubleInfo.setPhoneType_2((Integer) mx.invoke(tm,

                mtkDoubleInfo.getSimId_2()));

        if (TextUtils.isEmpty(mtkDoubleInfo.getImsi_1())

                && (!TextUtils.isEmpty(mtkDoubleInfo.getImsi_2()))) {

            mtkDoubleInfo.setDefaultImsi(mtkDoubleInfo.getImsi_2());

        }

        if (TextUtils.isEmpty(mtkDoubleInfo.getImsi_2())

                && (!TextUtils.isEmpty(mtkDoubleInfo.getImsi_1()))) {

            mtkDoubleInfo.setDefaultImsi(mtkDoubleInfo.getImsi_1());

        }

    } catch (Exception e) {

        mtkDoubleInfo.setMtkDoubleSim(false);

        return mtkDoubleInfo;

    }

    mtkDoubleInfo.setMtkDoubleSim(true);

    return mtkDoubleInfo;

}

直接判断异常。出现异常证明就不是MTK平台了。

1.2判断手机是否高通平台

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

public static GaotongDoubleInfo initQualcommDoubleSim(Context mContext) {

        GaotongDoubleInfo gaotongDoubleInfo = new GaotongDoubleInfo();

        gaotongDoubleInfo.setSimId_1(0);

        gaotongDoubleInfo.setSimId_2(1);

        try {

            Class<!--?--> cx = Class

                    .forName("android.telephony.MSimTelephonyManager");

            Object obj = mContext.getSystemService("phone_msim");

            Method md = cx.getMethod("getDeviceId", int.class);

            Method ms = cx.getMethod("getSubscriberId", int.class);

            gaotongDoubleInfo.setImei_1((String) md.invoke(obj,

                    gaotongDoubleInfo.getSimId_1()));

            gaotongDoubleInfo.setImei_2((String) md.invoke(obj,

                    gaotongDoubleInfo.getSimId_2()));

            gaotongDoubleInfo.setImsi_1((String) ms.invoke(obj,

                    gaotongDoubleInfo.getSimId_1()));

            gaotongDoubleInfo.setImsi_2((String) ms.invoke(obj,

                    gaotongDoubleInfo.getSimId_2()));

        } catch (Exception e) {

            e.printStackTrace();

            gaotongDoubleInfo.setGaotongDoubleSim(false);

            return gaotongDoubleInfo;

        }

        return gaotongDoubleInfo;

    }

一样出现异常就不是高通双卡平台了

然后我们在整理下逻辑

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/**

 * @param c

 * @return 返回平台数据

 */

public Object isDoubleSim(Context c) {

    GaotongDoubleInfo gaotongDoubleInfo = MultiSimUtility

            .initQualcommDoubleSim(c);

    MtkDoubleInfo mtkDoubleInfo = MultiSimUtility.initMtkDoubleSim(c);

    boolean isGaoTongCpu = gaotongDoubleInfo.isGaotongDoubleSim();

    boolean isMtkCpu = mtkDoubleInfo.isMtkDoubleSim();

    if (isGaoTongCpu) {

        // 高通芯片双卡

        return gaotongDoubleInfo;

    } else if (isMtkCpu) {

        // MTK芯片双卡

        return mtkDoubleInfo;

    } else {

        //普通单卡手机

        return null;

    }

}

这个时候我们基本上获取到了手机的平台和每张卡的信息。单卡手机获取信息就不贴代码了。

Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题

时间: 2024-12-11 01:22:29

Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题的相关文章

Android获取运营商信息

项目上要求做三网外放产品,将三个单网SDK自行整合成三网联合,思路大概是在OnCreate时区分运营商 设定枚举,根据取到的sim卡信息赋予枚举变量,后面三网的一些操作根据枚举进行判定 先设定运营商枚举 enum CARRIEROPERATOR { NONE(0), MM(1), UNIPAY(2), EGAME(3); private int value; private CARRIEROPERATOR(int i) { this.value=i; } public int getValue(

# Linux Whois3获取 运营商信息

Linux Whois3获取 运营商信息 APNIC是管理亚太地区IP地址分配的机构,它有着丰富准确的IP地址分配库,同时这些信息也是对外公开的,并提供了一个查询工具,下面就让我们看看如何在Linux下获得一些中国基础电信运营商(网通.电信.铁通.教育网)的IP地址分配情况: (我们平时用whois查询是知道域名或IP查信息, 这里用的是知道地理区域批量查IP及其信息) 获取安装包 APNIC ripe-dbase-client-v3.tar.gz http://ftp.apnic.net/ap

iOS获取运营商的相关信息

1.导入:CoreTelephony.framework 2.添加头文件 #import <CoreTelephony/CTTelephonyNetworkInfo.h> #import <CoreTelephony/CTCarrier.h> 3.获取网络环境 -(void)networktype{ NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"]

android获取设备全部信息

private static final String FILE_MEMORY = "/proc/meminfo"; private static final String FILE_CPU = "/proc/cpuinfo"; /** * 得到IMEI * * @return */ public static final String getIMEI(Context context) { TelephonyManager tm = (TelephonyManage

android获取周围AP信息(下)

疑问: 在上一篇中,还有一个问题未解决:WifiManager的startscan() 方法是立即返回的,也就是说这个方法会调用一个扫描wifi信号的线程,那么这个扫描什么时候结束呢?我们又该什么时候调用WifiManager的getScanResults()获取扫描结果呢? 解答: 当调用WifiManager的startscan() 方法,扫描结束后,系统会发出WifiManager.SCAN_RESULTS_AVAILABLE_ACTION广播,因此我们只需要定一个BroadcastRec

ios获取手机状态 idfa &nbsp; idfv &nbsp; 网络类型 &nbsp; 分辨率 &nbsp; 获取运营商

//idfa [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; //idfv [[[UIDevice currentDevice] identifierForVendor] UUIDString]; //网络类型 - (NSString *) getNet { UIApplication *application = [UIApplication sharedApplication]; NSArra

android获取周围AP信息

1.增加权限: 由于此应用需要获取手机的网络信息,wifi信息,因此需要在AndroidManifest.xml文件中添加相关权限,否则会报permission deny错误: 1 <uses-permission android:name="android.permission.INTERNET"/> 2 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE">

[Q]“获取AutoCAD安装信息时失败...”解决方法

“获取AutoCAD安装信息时失败...”解决方法:在“setup.exe”上右键,以管理员权限运行即可.

Android获取全部联系人信息的例子

先定义一个显示条目的xml布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_conte