【问题标题】:Android - Listening to NFC Adapter State ChangedAndroid - 监听 NFC 适配器状态已更改
【发布时间】:2013-09-11 15:18:23
【问题描述】:

我正在尝试构建一个使用 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));

【问题讨论】:

    标签: android broadcastreceiver nfc


    【解决方案1】:

    我想我应该将答案发布给寻找相同问题的其他人,因为我无法轻易找到。

    将以下代码添加到您的活动 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
        }
    }
    

    【讨论】:

    • 但是您使用的是 BluetoothAdapter.ACTION_STATE_CHANGED
    • 那当然应该是:NfcAdapter.EXTRA_ADAPTER_STATE
    【解决方案2】:

    当适配器的状态发生变化时,您可以使用ACTION_ADAPTER_STATE_CHANGED 接收广播消息,但该选项仅在 API 18 及更高版本中可用。有关文档,请参阅 this

    不幸的是,在 18 岁之前,我不知道有什么方法可以做到这一点。

    另外,顺便说一句,android.provider.Settings.ACTION_NFC_SETTINGS 将适用于 API 级别 16 及更高级别。对于之前的版本,NFC 设置位于“无线设置”下。查看this blog post 底部的ensureSensorIsOn 方法,以获取检查API 级别并重定向到正确设置窗格的代码示例。

    【讨论】:

    • 非常感谢您朝着正确的方向前进。我目前只为 API 级别 18 进行设计,所以我的工作更容易一些。我已将您的答案标记为正确,我将在下面发布解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 2011-07-16
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多