如何知道双 SIM 安卓手机中哪个 SIM 卡正在消耗移动数据?
Posted
技术标签:
【中文标题】如何知道双 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.TelephonyManager
或android.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;
【讨论】:
以上是关于如何知道双 SIM 安卓手机中哪个 SIM 卡正在消耗移动数据?的主要内容,如果未能解决你的问题,请参考以下文章