Android - 监听NFC适配器状态变化

7
我正在尝试构建一个使用NFC技术的应用程序。目标是显示一个DialogFragment,其中包含一个按钮链接,可以转到设置并手动更改它,当功能启用时,禁用DialogFragment。
问题:如果用户使用下拉通知栏中的图标启用/禁用NFC,则onPause/onResume不会被调用,并完全错过条件。我确定有一个接收器可以进行注册,并实时响应适当的操作。任何想法、思路或参考都将不胜感激!
以下代码检查状态是否已启用/禁用。我也在onResume事件中适当地做出了响应。
    NfcManager manager = (NfcManager) getSystemService(Context.NFC_SERVICE);
    NfcAdapter adapter = manager.getDefaultAdapter();

    if(adapter != null && adapter.isEnabled()) {
        detector = new NfcDetector(this);
        detector.setListener(this);
        onNfcFeatureFound();
    }
    else {
        onNfcFeatureNotFound();
    }

对于其他查看此帖子的用户,下面的代码将直接进入设置页面以启用/禁用NFC:
startActivity(new Intent(android.provider.Settings.ACTION_NFC_SETTINGS));
2个回答

24

由于我不能轻易地找到答案,所以认为应该发布此答案以帮助其他面临相同问题的人。

将以下代码添加到您的活动 onCreate() 方法中:

IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
this.registerReceiver(mReceiver, filter);

在您的活动(或任何其他地方)内声明内部私有类:

在您的活动(或任何其他地方)中声明内部私有类:

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

        if (action.equals(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)) {
            final int state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE,
                                                 NfcAdapter.STATE_OFF);
            switch (state) {
            case NfcAdapter.STATE_OFF:
                break;
            case NfcAdapter.STATE_TURNING_OFF:
                break;
            case NfcAdapter.STATE_ON:
                break;
            case NfcAdapter.STATE_TURNING_ON:
                break;
            }
        }
    }
};

@Override
public void onDestroy() {
    super.onDestroy();

    // Remove the broadcast listener
    this.unregisterReceiver(mReceiver);
}

  // The following check needs to also be added to the onResume
@Override
protected void onResume() 
    super.onResume();
    // Check for available NFC Adapter
    NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);

    if(adapter != null && adapter.isEnabled()) {
        createNfcDetector();
        //NFC is available on device, but disabled
    }
    else {
        //NFC Is available and enabled
    }
}

2
但是你正在使用BluetoothAdapter.ACTION_STATE_CHANGED。 - ThomasRS
当然应该是:NfcAdapter.EXTRA_ADAPTER_STATE - Benny Mose

4
您可以使用ACTION_ADAPTER_STATE_CHANGED来接收广播消息,以便在适配器状态更改时接收通知。但是该选项仅在API 18及以上版本中提供。请参阅此文档了解详情。
对于API 18之前的版本,很遗憾我不知道如何做到这一点。
另外,android.provider.Settings.ACTION_NFC_SETTINGS可用于API级别在16及以上的设备。对于更早期的版本,NFC设置位于“无线和网络”下。请查看此博客文章底部的ensureSensorIsOn方法,了解检查API级别并重定向到正确设置面板的代码示例。

非常感谢你指导我正确的方向。目前我只为API级别18设计,这让我的工作更容易了一些。我已经将你的答案标记为正确,并将解决方案发布在下面。 - ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接