Reputation: 11
Is there anyway to check mobile data is active from sim 1 or sim 2 in Android programmatically??
Also i want to get the carrier provider in which the data is active.
Eq : sim 1 : carrier 1 Sim 2 : carrier 2
If data is active on sim 2 It should return the carrier 2 name.
Upvotes: 1
Views: 2984
Reputation: 12167
Here is a simple solution to get current active data sim operator for dual sim environment. It works after api level 22.
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;
}
Upvotes: 0
Reputation: 331
my way (Android >= 22)
int getDefaultDataSubscriptionId(final SubscriptionManager subscriptionManager) {
if (android.os.Build.VERSION.SDK_INT >= 24) {
int nDataSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
if (nDataSubscriptionId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
return (nDataSubscriptionId);
}
}
try {
Class<?> subscriptionClass = Class.forName(subscriptionManager.getClass().getName());
try {
Method getDefaultDataSubscriptionId = subscriptionClass.getMethod("getDefaultDataSubId");
try {
return ((int) getDefaultDataSubscriptionId.invoke(subscriptionManager));
}
catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
}
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
return (SubscriptionManager.INVALID_SUBSCRIPTION_ID);
}
@TargetApi(22)
public String getUIText22(final TelephonyManager telephonyManager) {
SubscriptionManager subscriptionManager = (SubscriptionManager) getContext().getApplicationContext().getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
int nDataSubscriptionId = getDefaultDataSubscriptionId(subscriptionManager);
if (nDataSubscriptionId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
SubscriptionInfo si = subscriptionManager.getActiveSubscriptionInfo(nDataSubscriptionId);
if (si != null) {
return (si.getCarrierName().toString());
}
}
}
Upvotes: 2