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;
}