gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:58:54 24 4
gpt4 key购买 nike

我正在构建一个网络监视器应用程序。在这里,我已成功实现了所有功能,例如跟踪 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";
}

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

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

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

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

任何人都可以为我提供解决方案吗?

最佳答案

在 api 级别 22 之后,您可以使用 hidden system api android.telephony.SubscriptionManager#getDefaultDataSubId通过反射获取当前 Activity 数据 sim 订阅索引。

api级别24之后,有公共(public)系统apiandroid.telephony.SubscriptionManager#getDefaultDataSubscriptionId获取当前 Activity 数据 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 - 如何知道双 SIM 安卓手机中哪个 SIM 卡正在消耗移动数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42852602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com