Как определить, какой оператор (Sim1 или Sim2) предоставляет мобильные данные в устройстве?
Я смог определить, использует ли мое устройство Wi-Fi или данные для мобильных устройств. Теперь я застрял в определении оператора SIM, который предоставляет мобильные данные в случае устройства с двумя SIM-картами.
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if(ni.getDetailedState().toString().toLowerCase().equals("connected")){
tv.setText(" Typename: "+ni.getTypeName());
tv.append("\n Detailed state: "+ni.getDetailedState()+"\n Extra Info: "+ni.getExtraInfo()+"\n Type: "+ni.getType()+"\n Reason :"+ni.getReason()
+"\n SubType Name :"+ni.getSubtypeName()+"\n SubType :"+ni.getSubtype()+"\n State :"+ni.getState());
if(!ni.getTypeName().toString().toLowerCase().equals("wifi")){
tv.append("\n Carrier:"+carrierName);
}
}
}
Приведенный выше код идентифицирует между WIFI и Data. Но если устройство использует мобильные данные и если это устройство с двумя SIM-картами, как я могу определить, какая из SIM-карт предоставляет мобильные данные?enter code here
1 ответ
Для API >= 21
Из Settings.Global
int sim = -1;
SubscriptionManager sm = (SubscriptionManager)context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
if (sm != null) {
try {
int id = Settings.Global.getInt(context.getContentResolver(), "multi_sim_data_call");
SubscriptionInfo si = sm.getActiveSubscriptionInfo(id);
if (si != null)
sim = si.getSimSlotIndex();
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
}
или используя отражение
int sim = -1;
SubscriptionManager sm = (SubscriptionManager)context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
if (sm != null) {
try {
Method mGetDefaultDataSubId = getMethod(sm.getClass(), "getDefaultDataSubscriptionId", 0);
if (mGetDefaultDataSubId != null) {
int id = (int) mGetDefaultDataSubId.invoke(sm);
SubscriptionInfo si = sm.getActiveSubscriptionInfo(id);
if (si != null)
sim = si.getSimSlotIndex();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static Method getMethod (Class c, String name, int params) {
Method[] cm = c.getDeclaredMethods();
for (Method m : cm) {
if (m.getName().equalsIgnoreCase(name)) {
m.setAccessible(true);
int length = m.getParameterTypes().length;
if (length == params)
return m;
}
}
return null;
}