public static int dataSubId(Context context) {
int dataSubId = 0;
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
dataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
} else {
dataSubId = getDataSubId(context);
}
} catch (Exception e) {
e.printStackTrace();
}
return dataSubId;
}
private static int getDataSubId(Context context) {
int defaultDataSlotId = getDefaultDataSlotId(context);
try {
Object obj = Class.forName("android.telephony.SubscriptionManager").getDeclaredMethod("getSubId", int.class)
.invoke(null, defaultDataSlotId);
if (obj != null) {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
return (int) (((long[]) obj)[0]);
}
return ((int[]) obj)[0];
}
} catch (Exception e) {
e.printStackTrace();
}
return defaultDataSlotId;
}
private static int getDefaultDataSlotId(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
SubscriptionManager subscriptionManager = SubscriptionManager.from(context.getApplicationContext());
if (subscriptionManager != null) {
try {
if (AppSysMgr.checkPermission(context, Manifest.permission.READ_PHONE_STATE)) {
Class<?> subClass = Class.forName(subscriptionManager.getClass().getName());
Method getSubID = subClass.getMethod("getDefaultDataSubscriptionInfo");
SubscriptionInfo subInfo = (SubscriptionInfo) getSubID.invoke(subscriptionManager);
if (subInfo != null) {
return subInfo.getSimSlotIndex();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
try {
Class cls = Class.forName("android.telephony.SubscriptionManager");
Method getSubId;
try {
getSubId = cls.getDeclaredMethod("getDefaultDataSubId");
} catch (NoSuchMethodException e) {
getSubId = cls.getDeclaredMethod("getDefaultDataSubscriptionId");
}
int subId = (int) getSubId.invoke(null);
int slotId;
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
Method getSlotId = cls.getDeclaredMethod("getSlotId", long.class);
slotId = (int) getSlotId.invoke(null, (long) subId);
} else {
Method getSlotId = cls.getDeclaredMethod("getSlotId", int.class);
slotId = (int) getSlotId.invoke(null, subId);
}
return slotId;
} catch (Exception e) {
e.printStackTrace();
}
}
return -1;
}