我正在建立一个网络监控程序。在这里,我已经成功地实现了所有的事情,如跟踪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卡运营商名称?
我搜索了很多,看到很多问题都没有答案,如 这个.
我能够在双卡手机中获得两个SIM卡的subId,但我有相位问题,不知道哪个SIM卡在使用互联网。
许多其他应用程序能够做到这一点,如Mubble。
任何一个人可以为我提供一个解决方案吗?
当api等级达到22级后,你就可以使用了。隐蔽系统api android.telephony.SubscriptionManager#getDefaultDataSubId
通过反射来获取当前活跃的数据模拟订阅指数。
在api等级24级之后,有一个公共系统api。android.telephony.SubscriptionManager#getDefaultDataSubscriptionId
以获取当前活跃的数据模拟订阅指数。
然后,您可以创建一个 android.telephony.TelephonyManager
或 android.telephony.SubscriptionManager#getActiveSubscriptionInfo
从订阅指数中获取SIM卡运营商信息。
以下是获取双卡手机数据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;
}