背景
应用内不指定subId获取数据状态可能会错误,因为可能拿到voice的能力,而非data。
代码逻辑
1、通过TelephonyManager的isDataEnabled()没有指定subId时,调用内部方法isDataEnabledForReason,传入getId()参数以指定subid,然后会执行到SubscriptionManager的getDefaultDataSubscriptionId()以获取默认值,
/*** Returns whether mobile data is enabled or not per user setting. There are other factors* that could disable mobile data, but they are not considered here.** If this object has been created with {@link #createForSubscriptionId}, applies to the given* subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()}** <p>Requires one of the following permissions:* {@link android.Manifest.permission#ACCESS_NETWORK_STATE},* {@link android.Manifest.permission#MODIFY_PHONE_STATE}, or* {@link android.Manifest.permission#READ_BASIC_PHONE_STATE* READ_BASIC_PHONE_STATE} or that the calling app has carrier* privileges (see {@link #hasCarrierPrivileges}).** <p>Note that this does not take into account any data restrictions that may be present on the* calling app. Such restrictions may be inspected with* {@link ConnectivityManager#getRestrictBackgroundStatus}.** @return true if mobile data is enabled.*/
@RequiresPermission(anyOf = {android.Manifest.permission.ACCESS_NETWORK_STATE,android.Manifest.permission.MODIFY_PHONE_STATE,android.Manifest.permission.READ_PHONE_STATE,android.Manifest.permission.READ_BASIC_PHONE_STATE})
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_DATA)
public boolean isDataEnabled() {try {return isDataEnabledForReason(DATA_ENABLED_REASON_USER);} catch (IllegalStateException ise) {// TODO(b/176163590): Remove this catch once TelephonyManager is booting safely.Log.e(TAG, "Error calling #isDataEnabled, returning default (false).", ise);return false;}
}
2、根据SubscriptionManager逻辑,会查询获取DefaultSubId的值,最终用的是SubscriptionController数据
/*** Returns the system's default data subscription id.** On a voice only device or on error, will return INVALID_SUBSCRIPTION_ID.** @return the default data subscription Id.*/
public static int getDefaultDataSubscriptionId() {return sDefaultDataSubIdCache.query(null);
}
3、SubscriptionController的逻辑,未指定subid时拿到的会是voice的 能力
使用方法和说明
在Android中,TelephonyManager类的isDataEnabled()方法用于检查移动数据连接是否启用。而subId(Subscription ID)是用于标识不同SIM卡的唯一ID。
Note:isDataEnable()可不传入参数,即默认的subId(使用getDefaultDataSubscriptionId()方法获取),也可以指定subId(如下代码示例)。
- 在多卡手机中,可以通过TelephonyManager的getSubId()方法获取当前活动的SIM卡的SubId,
- 然后可使用TelephonyManager.isDataEnabled()方法检查指定的subId对应的SIM卡的移动数据链接是否启用
代码示例:
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(context.TELEPHONY_SERVICE);int subId = 1; //要检查的SIM的subIdif(mTelephonyManager.isDataEnabled(subId)) {//移动数据已启用
} else {//移动数据未启用
}
代码链接参考:
- TelephonyManager.isDataEnable()
- SubscriptionManager.getDefaultDataSubscriptionId()
- SubscriptionController.getDefaultSubId()