Android 9.0 飛行模式下禁用NFC 功能實現以及問題解決(二)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章