如何知道双 SIM 安卓手机中哪个 SIM 卡正在消耗移动数据?

     2023-02-23     135

关键词:

【中文标题】如何知道双 SIM 安卓手机中哪个 SIM 卡正在消耗移动数据?【英文标题】:How to know which SIM is consuming mobile data in dual SIM android phone? 【发布时间】:2017-08-08 17:17:58 【问题描述】:

我正在构建一个网络监视器应用程序。在这里,我已经成功实现了所有功能,例如跟踪 Wifi 或移动数据的数据使用情况,但我想知道哪个 SIM 连接到互联网并使用移动数据。

使用下面的代码,我可以知道我的双卡手机是否连接到 Wifi 或移动数据。

public static String isInternetConnected (Context ctx) 
    ConnectivityManager connectivityMgr = (ConnectivityManager) ctx
            .getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo wifi = connectivityMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    NetworkInfo mobile = connectivityMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    // Check if wifi or mobile network is available or not. If any of them is
    // available or connected then it will return true, otherwise false;
    if (wifi != null) 
        if (wifi.isConnected()) 
            return "wifi";
        
    
    if (mobile != null) 
        if (mobile.isConnected()) 
            return "mobile";
        
    
    return "none";

如何获取双卡安卓手机中消耗移动数据的 SIM 索引或 SIM 运营商名称?

我搜索了很多,我看到很多问题都发布在 SO 中,但没有答案,例如 this。

我能够在双 SIM 卡手机中获取两个 SIM 卡的子 ID,但我正在逐步解决问题,以了解哪个 SIM 卡正在使用互联网。

许多其他应用程序都能够像 Mubble 一样做到这一点。

谁能给我一个解决方案?

【问题讨论】:

【参考方案1】:

api level 22之后,可以通过反射使用hidden system apiandroid.telephony.SubscriptionManager#getDefaultDataSubId获取当前活跃数据sim订阅索引。

api level 24之后,有公共系统apiandroid.telephony.SubscriptionManager#getDefaultDataSubscriptionId获取当前活跃数据sim订阅索引。

然后,您可以从订阅索引中创建android.telephony.TelephonyManagerandroid.telephony.SubscriptionManager#getActiveSubscriptionInfo 以获取sim 运营商信息。

这里有一个简单的解决方案来获取双卡手机的数据卡运营商。

    public static String getDataSimOperator(Context context) 
        if (context == null) 
            return null;
        

        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (tm != null) 
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) 
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) 
                    int dataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
                    TelephonyManager dataSimManager = tm.createForSubscriptionId(dataSubId);
                    return dataSimManager.getSimOperator();
                 else 
                    String operator = getDataSimOperatorBeforeN(context);
                    if (operator != null) 
                        return operator;
                     else 
                        return tm.getSimOperator();
                    
                
             else 
                return tm.getSimOperator();
            
        
        return null;
    

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
    private static String getDataSimOperatorBeforeN(Context context) 
        if (context == null) 
            return null;
        

        int dataSubId = -1;
        try 
            Method getDefaultDataSubId = SubscriptionManager.class.getDeclaredMethod("getDefaultDataSubId");
            if (getDefaultDataSubId != null) 
                getDefaultDataSubId.setAccessible(true);
                dataSubId = (int) getDefaultDataSubId.invoke(null);
            
         catch (Exception e) 
            e.printStackTrace();
        
        if (dataSubId != -1) 
            SubscriptionManager sm = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
            if (sm != null && ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE)
                    == PackageManager.PERMISSION_GRANTED) 
                SubscriptionInfo si = sm.getActiveSubscriptionInfo(dataSubId);
                if (si != null) 
                    // format keep the same with android.telephony.TelephonyManager#getSimOperator
                    // MCC + MNC format
                    return String.valueOf(si.getMcc()) + si.getMnc();
                
            
        
        return null;
    

【讨论】:

Android USSD 哪个 sim 卡收到 ussd 消息或哪个 sim 插槽收到 ussd 消息(双卡手机)

...】:我可以捕获传入的ussd消息,但是如果是双卡手机,如何比较传入的ussd消息?如果我收到uss 查看详情

如何在双卡手机中仅获取一张 SIM 卡的短信?

】如何在双卡手机中仅获取一张SIM卡的短信?【英文标题】:HowtofetchSMSofonlyoneSIMindualSIMphone?【发布时间】:2019-10-2915:31:42【问题描述】:我正在使用Android上的SMS功能。我已成功从手机中获取所有短信,我想按SIM1和SIM2过滤这些... 查看详情

如何查看双卡手机的本机号码?

安卓手机查看方法:1。打开手机后,选择手机的设置图标进入。2.点击进入设置后,选择“无线和网络”设置选项。3.点击进入后,选择页面中的“双卡管理”选项。4.点击进入后,就可以看到手机卡的本机号码。苹果手机查看... 查看详情

在 iOS 中使用 PhoneGap 检测 SIM 卡更改

...序,该应用程序需要使用SIM或MSISDN来实现某些功能。我想知道是否有任何方法可以获取SIM卡的某些信息,例如它的ID,如果不是手机号码,或者我是否可以知道或确认SIM卡是否已更换。【问题讨论】:【参考方 查看详情

双卡双待有一张卡不显示手机号正常么

...择使用SIM卡1或者SIM卡2,按照以下步骤进行操作:一、将手机设置为双卡双待的模式。1.找到手机中的设置; 2.点击设置,最上方有一个SIM卡管理,点击进入; 3.进入后会看到有一个(默认数据),这就是用来选择那个卡... 查看详情

苹果手机显示无sim卡怎么回事?

1.检查环境中的手机信号是否被屏蔽或微弱;2.看手机是否开启了“飞行模式”;3.重启手机,按住电源键直到弹出“关机”和“重启”图标,然后点击“重启”图标按钮。4.再次插入SIM卡;5.如果是SIM卡问题,需要更换新的SIM卡... 查看详情

sim卡交换攻击是如何运作的?

 SIM卡交换攻击是如何运作的?你能做些什么来保护自己?自2017年以来,媒体一直在报道SIM卡交换攻击。此类攻击通常针对银行交易,但也会针对加密货币社区,社交媒体和电子邮件帐户。通过ENISA报告——打... 查看详情

手机显示无sim卡是怎么回事手机显示无sim卡原因

如果您使用的是华为手机,若手机上方状态栏出现不识别SIM卡图标,说明您的SIM卡无法识别,请按照如下方法排除是否SIM卡问题:1.请重启手机尝试建议您重启手机,让手机重新读取“SIM卡”后尝试。2.请观察SIM卡外观是否良好... 查看详情

如何向安卓手机批量导入通讯录

苹果怎么导入通讯录?我们在换新手机的时候,总会面临数据转移的问题,但有些小伙伴对此并不熟悉,因此今天小编总结了几个方法,都是十分简单且好用的,下面就来学习下吧。方法一:直接借助SIM卡导入手机会换新的,但... 查看详情

苹果手机sim卡插上显示无sim卡

参考技术A苹果手机插卡显示无服务方法。工具/原料:iPhoneSE2、ios14.4、本地设置14.41、首先打开苹果手机自带的设置APP,滑动界面,点击进入“通用”选项。2、在通用界面中,滑动到最下方,可以看到“还原”的选项,点击它。... 查看详情

android判断sim卡属于哪个移动运营商

第一种方法:获取手机的IMSI码,并判断是中国移动\中国联通\中国电信TelephonyManagertelManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);/**获取SIM卡的IMSI码*SIM卡唯一标识:IMSI国际移动用户识别码(IMSI:InternationalMobileSubscri... 查看详情

sim卡已关闭怎么打开

sim卡已关闭怎么打开若使用的是vivo手机,SIM卡显示关闭,可以尝试以下方法:1、进入设置--双卡与移动网络/移动网络--SIM卡信息与设置--选择SIM卡进入,将SIM卡关闭后再打开;2、将SIM卡取下后再重新插入,后重启手机;3、进入... 查看详情

手机imei码与sim(专业人士请进来)

...察觉的情况下)向事先设定好的手机号码发送短信,即可知道手机当前使用的新号码。如智能手机被盗,通过这样的功能可以让你知道手机目前使用的号码,但大部分国家公共安全机关并不会因一部手机而采用定位抓捕行动,因... 查看详情

手机at指令如何使用?

参考技术AAT+CNUM是向SIM卡查询本机号码的。但是你必须先把这个号码写到SIM卡里面。因为无论移动或者联通的SIM卡,买给用户的时候都没有把本机号码写到SIM卡内。一旦你把本机号码写到了SIM卡内,无论你把这张SIM卡插到那台手... 查看详情

如何在android开发中获取sim卡信息

android获取sim卡运营商信息TelephonyManagertm=(TelephonyManager)Context.getSystemService(Context.TELEPHONY_SERVICE);TelephonyManager的使用TelephonyManager提供设备上获取通讯服务信息的入口,应用程序使用这个类的方法来获取电话的服务商或者状态。程序... 查看详情

如何在双sim卡移动编程的情况下获得两个sim的cid和lac?(代码片段)

...ID,MCC,MNC。我可以使用SubscriptionManager获取MCC,MNC。但是如何才能获得两张SIM卡的LAC和MCC?答案试试这种方式创建一个pojo让我们说OperatordataclassOperator(varope 查看详情

sim卡询问是如何开启的?(代码片段)

...net/aaa111/article/details/49590037本篇解决两个问题*SIM卡询问是如何开启的?*通话中再添加通话为何不会再次弹出SIM卡询问框PS:只考虑SIM卡账户的情况,不考虑有其他账户(sip等)的情况。SIM卡询问是如何开启的?S... 查看详情

SIM 卡 GlobalPlatform 密钥在字段中的使用

...tform(GP)密钥(ENC、MAC、KEK、...)是否有任何用途?只要我知道(KID/KIC/KIK)可以通过OTARFM 查看详情