我正在尝试构建一个使用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));
答案 0 :(得分:15)
以为我应该为寻找同样问题的其他人发布答案,因为我无法轻易找到答案。
将以下代码添加到您的活动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
PackageManager pm = getPackageManager();
NfcManager manager = (NfcManager) getSystemService(Context.NFC_SERVICE);
NfcAdapter adapter = manager.getDefaultAdapter();
if(adapter != null && adapter.isEnabled()) {
createNfcDetector();
onNfcFeatureFound();
}
else {
onNfcFeatureNotFound();
}
}
答案 1 :(得分:4)
当适配器的状态发生变化时,您可以使用ACTION_ADAPTER_STATE_CHANGED
接收广播消息,但该选项仅在API 18及更高版本中可用。有关文档,请参阅this。
在18岁之前,我不知道有什么方法可以做到这一点。
此外,另外,android.provider.Settings.ACTION_NFC_SETTINGS
将适用于API级别16及更高级别。对于先前版本,NFC设置处于“无线设置”下。请查看this blog post底部的ensureSensorIsOn
方法,以获取检查API级别并重定向到正确设置窗格的代码示例。