随意切换双卡流量,立即获取对应卡的SMIS
原生的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相关推荐
- Android双卡手机:获取主卡副卡的simid(上)方案实现
原文地址:http://blog.csdn.net/ymcl_hx/article/details/53484797 近期公司下发了新任务,需要对Android手机进行双sim卡的管控,而这个功能的关 ...
- android 双卡开发获取sim卡默认数据卡,获取sim卡信息,sim1卡,sim2卡 2G/3G/4G信号强度
1:默认数据卡 private int getDefalutDataID(){SubscriptionManager subscriptionManager = (SubscriptionManage ...
- 获取双卡手机的两个卡的IMSI
/** * 获取双卡手机的两个卡的IMSI 需要 READ_PHONE_STATE 权限 * * @param context * 上下文 * @return 下标0为一卡的IMSI,下标1为二卡的I ...
- 不能随意切换的Tab选项卡页面
不能随意切换的Tab选项卡页面 ------------------------------------- 开发工具与关键技术:Visual Studio 2015 C# 作者:林敏静 撰写时间:20 ...
- nginx实现灰度切换,流量比例和灰度策略
github代码:https://github.com/singgel/nginx-luaDemo/ 一. 需求背景 需要把旧的推荐服务逐步切换到新的推荐服务上,需要灰度切换,流量比例和灰度策略可以控 ...
- Android 双卡识别Imsi以及副卡发送短信总结
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 Android5.0系统才开始提供对双卡识别支持,提供SubscriptionManager类来完成对双卡相关设备信息的读取.在5. ...
- Android双卡识别IMSI以及副卡发送短信总结
今日科技快讯 有消息称,许多乐视员工的建行龙卡信用卡额度都被调整为1元,建设银行官方给出的理由为"涉及经济案件".甚至3年前曾服务于乐视的员工,其建行信用卡额度也被调成了1元,这位 ...
- jquery实现app开发闹钟功能_趣味闹钟APP开发,随意切换闹钟叫醒功能
智能手机端的发展使得人们获取外界信息更加高效,然而智能手机的出现也有一定的弊端,生活中很多人常常因为浏览手机信息而选择熬夜,早起自然也就成为了一种困难,而趣味闹钟APP开发或多或少可以帮助用户解决问题 ...
- android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录
此文乃是转载,原文在这里链接 SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件.因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作 ...
- Android实例]------获取sd卡图片显示出来
[Android实例] 获取sd卡图片显示出来 ON 六 02 2012 IN ANDROID代码仓库, ANDROID项目代码 BY ANDROID智能手机 | 评论 package com.fil ...
最新文章
- php能做定时关机吗,浅谈系统的定时关机
- python图形设置_python学习笔记——基本图形绘制
- rstudio python_如虎添翼:用Python与C++扩展R语言的应用场景
- 网管,待遇为何如此差劲?
- Apache Spark中实现的MapReduce设计模式
- *【CodeForces - 122D】Lucky Transformation(字符串问题,思维剪枝,优化,有坑,需注意的问题if的层次总结)
- 永远年轻,永远热泪盈眶----致所有奋斗的ACMer
- Java调用Lua脚本(热载实现)
- [LeetCode]--35. Search Insert Position
- Java函数式编程整理
- 必看!linux系统如何查看内存使用情况
- 斯坦福大学NLP课程CS224N课第一次作业第一部分
- npoi导出的excel中设置列宽
- XSS Filter Evasion Cheat Sheet
- nginx配置静态页面html,nginx 服务器配置静态网页
- 【工具使用系列】PostScript工具 GhostScript,GSview,Epstool,RedMon
- 基于android的有声听书系统
- Python---项目(简易画图软件)
- PostgreSQL数据库统计信息——analyze执行函数
- vue-router防跳墙控制