原生的Android是不支持双卡双待功能的,所以Android sdk没有提供API,直到在Android6.0+上增加了相关的API,但是国内的android的情况嘛,大家都懂得,有6.0和没6.0没啥区别, 因为基本各大厂商都已经更改底层系统了;

所以小编费了九牛二虎之力,依然没有在网上找到对应的解决办法,那怎么办????分析源码吧,呵呵!现解决办法,希望对小伙伴没有帮助!

直接上代码:

主要有下面三个方法:

1:先判断当前手机是否打开本地流量

2:再判断当前哪张卡走流量,然后获取对应卡的卡槽

3:再根据对应的卡槽获取subid  然后获取IMSI

//1: 判断数据流量开关是否打开public static boolean isMobileEnabled(Context context) {    try {        Method getMobileDataEnabledMethod =                ConnectivityManager.class.getDeclaredMethod("getMobileDataEnabled");        getMobileDataEnabledMethod.setAccessible(true);        ConnectivityManager connectivityManager =                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        boolean b = (boolean) getMobileDataEnabledMethod.invoke(connectivityManager);        ;        return b;    } catch (NoSuchMethodException e) {        e.printStackTrace();    } catch (IllegalAccessException e) {        e.printStackTrace();    } catch (InvocationTargetException e) {        e.printStackTrace();    }    return true;}
//2:TODO 判断当前那张卡 是走流量的    @SuppressLint("MissingPermission")    public static Integer getDefaultDataSubId(Context context) {        Integer id = -1;        try {            SubscriptionManager sm = null;            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {                sm = SubscriptionManager.from(context.getApplicationContext());                Method getSubId = sm.getClass().getMethod("getDefaultDataSubId");                if (getSubId != null) {                    id = (int) getSubId.invoke(sm);                }            }        } catch (NoSuchMethodException e) {            try {                SubscriptionManager sm = null;                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {                    sm = SubscriptionManager.from(context.getApplicationContext());                    Method getSubId = sm.getClass().getMethod("getDefaultDataSubscrptionId");                    if (getSubId != null) {                        id = (int) getSubId.invoke(sm);                    }                }            } catch (NoSuchMethodException e1) {//                try {                    SubscriptionManager sm = null;                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {                        sm = SubscriptionManager.from(context.getApplicationContext());                        Method getSubId = sm.getClass().getMethod("getDefaultDataPhoneId");//            Method getSubId = Class.forName("android.telephony.SubscriptionManager").getDeclaredMethod("getSubId", new Class[]{Integer.TYPE});                        if (getSubId != null) {                            id = (int) getSubId.invoke(sm);                            Log.v("GetPhoneInfoHelper", (int) getSubId.invoke(sm) + "");                        }                    }                } catch (NoSuchMethodException e2) {                    e.printStackTrace();                } catch (IllegalAccessException e2) {                    e.printStackTrace();                } catch (InvocationTargetException e2) {                    e.printStackTrace();                }            } catch (IllegalAccessException e1) {                e.printStackTrace();            } catch (InvocationTargetException e1) {                e.printStackTrace();            }        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (InvocationTargetException e) {            e.printStackTrace();        }        return id;

    }
//3:TODO  获取双卡双待  卡序列号public static String getSubscriberId(Context context, TelephonyManager telephony,int simSlotIndex) {    Class<?> telephonyClass;   String  rtResult = null;    try {        telephonyClass = Class.forName(telephony.getClass().getName());        Method method = telephonyClass.getMethod("getSubscriberId", new Class[]{int.class});        rtResult = (String) method.invoke(telephony,simSlotIndex);    } catch (Exception e) {        e.printStackTrace();    }   return rtResult;}

代码调用:
String IMSI =  ReflectionGetCard.getSubscriberId(context,tm,ReflectionGetCard.getDefaultDataSubId(context)); 注意:我调用没有判断 当前 是否打开本地流量 ,因为我只需要获取对应卡的网络状态等;这个ReflectionGetCard类是上面方法的封装类;亲测:红米、oppoR11S、华为荣耀8是正常的获取的;PS:在华为荣耀8上 上面调用代码需要更改一下:
String IMSI = tm.getSubscriberId();

String str = ReflectionGetCard.getSubscriberId(context,tm,ReflectionGetCard.getDefaultDataSubId(context));否则 华为荣亚8 会卡死,不知道什么愿意?有知道的小伙伴或者大神给解答下!谢谢!欢迎随时交流:847638676(同微信)

转载于:https://www.cnblogs.com/yi-snow-W/p/10944033.html

随意切换双卡流量,立即获取对应卡的SMIS相关推荐

  1. Android双卡手机:获取主卡副卡的simid(上)方案实现

    原文地址:http://blog.csdn.net/ymcl_hx/article/details/53484797 近期公司下发了新任务,需要对Android手机进行双sim卡的管控,而这个功能的关 ...

  2. android 双卡开发获取sim卡默认数据卡,获取sim卡信息,sim1卡,sim2卡 2G/3G/4G信号强度

    1:默认数据卡 private int getDefalutDataID(){SubscriptionManager subscriptionManager = (SubscriptionManage ...

  3. 获取双卡手机的两个卡的IMSI

    /** * 获取双卡手机的两个卡的IMSI 需要 READ_PHONE_STATE 权限 * * @param context * 上下文 * @return 下标0为一卡的IMSI,下标1为二卡的I ...

  4. 不能随意切换的Tab选项卡页面

    不能随意切换的Tab选项卡页面 ------------------------------------- 开发工具与关键技术:Visual Studio 2015 C# 作者:林敏静 撰写时间:20 ...

  5. nginx实现灰度切换,流量比例和灰度策略

    github代码:https://github.com/singgel/nginx-luaDemo/ 一. 需求背景 需要把旧的推荐服务逐步切换到新的推荐服务上,需要灰度切换,流量比例和灰度策略可以控 ...

  6. Android 双卡识别Imsi以及副卡发送短信总结

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 Android5.0系统才开始提供对双卡识别支持,提供SubscriptionManager类来完成对双卡相关设备信息的读取.在5. ...

  7. Android双卡识别IMSI以及副卡发送短信总结

    今日科技快讯 有消息称,许多乐视员工的建行龙卡信用卡额度都被调整为1元,建设银行官方给出的理由为"涉及经济案件".甚至3年前曾服务于乐视的员工,其建行信用卡额度也被调成了1元,这位 ...

  8. jquery实现app开发闹钟功能_趣味闹钟APP开发,随意切换闹钟叫醒功能

    智能手机端的发展使得人们获取外界信息更加高效,然而智能手机的出现也有一定的弊端,生活中很多人常常因为浏览手机信息而选择熬夜,早起自然也就成为了一种困难,而趣味闹钟APP开发或多或少可以帮助用户解决问题 ...

  9. android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录

    此文乃是转载,原文在这里链接 SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件.因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作 ...

  10. Android实例]------获取sd卡图片显示出来

    [Android实例] 获取sd卡图片显示出来 ON 六 02 2012 IN ANDROID代码仓库, ANDROID项目代码 BY ANDROID智能手机 | 评论 package com.fil ...

最新文章

  1. php能做定时关机吗,浅谈系统的定时关机
  2. python图形设置_python学习笔记——基本图形绘制
  3. rstudio python_如虎添翼:用Python与C++扩展R语言的应用场景
  4. 网管,待遇为何如此差劲?
  5. Apache Spark中实现的MapReduce设计模式
  6. *【CodeForces - 122D】Lucky Transformation(字符串问题,思维剪枝,优化,有坑,需注意的问题if的层次总结)
  7. 永远年轻,永远热泪盈眶----致所有奋斗的ACMer
  8. Java调用Lua脚本(热载实现)
  9. [LeetCode]--35. Search Insert Position
  10. Java函数式编程整理
  11. 必看!linux系统如何查看内存使用情况
  12. 斯坦福大学NLP课程CS224N课第一次作业第一部分
  13. npoi导出的excel中设置列宽
  14. XSS Filter Evasion Cheat Sheet
  15. nginx配置静态页面html,nginx 服务器配置静态网页
  16. 【工具使用系列】PostScript工具 GhostScript,GSview,Epstool,RedMon
  17. 基于android的有声听书系统
  18. Python---项目(简易画图软件)
  19. PostgreSQL数据库统计信息——analyze执行函数
  20. vue-router防跳墙控制

热门文章

  1. 四位共阳极数码管显示函数_DS1302,四位共阳极数码管显示时钟,可调时间
  2. Type-C笔记本电脑全功能TCPC接口方案
  3. gnss_伽利略gnss消息认证过程
  4. 科普丨“垃圾”DNA?转座子在植物抗旱中的逆袭之路
  5. 微信小程序-扫码点餐系统设计
  6. 比较好的PHP开源项目
  7. Arduino 使用 LCD1602 显示屏IIC驱动
  8. c语言程序设计对称数,对称数 问题
  9. UWP 动画系列之模仿网易云音乐动画
  10. 软件测试周刊(第30期):专注 力量 敏捷 协作