关注我,更多程序猿的日常信息等你哦
Android 9.0 飞行模式下禁用NFC 功能实现以及问题解决
按照之前的方案修改代码以后,发现会有俩个问题,之前方案可以看我上面链接。
1、因为只有preference才会调用NfcAirplaneModeObserver,所以只有我们打开NFC界面时,我们的代码才会生效。也就是说,虽然我们打开飞行模式再关闭飞行模式,NFC会恢复原来状态,其实真实情况是在这个过程中NFC压根没有关闭也没有打开,我们的代码没有执行。
2、如果一直在NFC界面,关闭飞行模式前NFC是关闭的,开关一次飞行模式,NFC会打开。
WiFi和BlueTooth都是支持开启飞行模式时关闭功能,退出飞行模式时恢复WiFi和BlueTooth的原有状态。但是因为Google原来就不支持开启飞行模式时禁用NFC,所以也没有相关代码,只能我们自己实现。
下面看代码实现:
通过 NFC_DISABLED_AIRPLANE_ON 来标注NFC是原本就关闭还是因为打开飞行模式关闭的,然后在飞行模式开关时直接执行NFC的开关,这样就不需要进入NFC界面才能控制NFC状态了。
/frameworks/base/core/java/android/net/ConnectivityManager.java
private NfcAdapter mAdapter;
static final int NFC_DISABLED = 0;
static final int NFC_ENABLED = 1;
private static final int NFC_DISABLED_AIRPLANE_ON = 2;
private int mPersistNFCState = NFC_DISABLED;
@RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL)
public void setAirplaneMode(boolean enable) {
try {
mService.setAirplaneMode(enable);
if (!enable) {
if (mPersistNFCState == NFC_DISABLED_AIRPLANE_ON) {
getAdapter().enable();
}
} else {
if (getAdapter().isEnabled()) {
mPersistNFCState = NFC_DISABLED_AIRPLANE_ON;
getAdapter().disable();
} else {
mPersistNFCState = NFC_DISABLED;
getAdapter().disable();
}
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
private NfcAdapter getAdapter() {
if (mAdapter == null) {
try {
mAdapter = NfcAdapter.getNfcAdapter(mContext);
} catch (UnsupportedOperationException e) {
mAdapter = null;
}
}
return mAdapter;
}