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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值