我尝试在应用程序的特定屏幕打开时以编程方式禁用 NFC,但似乎唯一的方法是使用 Intents。我正在寻找一种以编程方式来实现它的方法。 另一个解决方案是当我的屏幕位于前台时防止其他应用程序拦截 NFC 标签。
我先尝试通过NfcAdapter来处理它
val nfcAdapter = NfcAdapter.getDefaultAdapter(context)
// Enable NFC if it's supported and disabled
if (nfcAdapter != null && !nfcAdapter.isEnabled) {
nfcAdapter.enable()
}
// Disable NFC if it's enabled
if (nfcAdapter != null && nfcAdapter.isEnabled) {
nfcAdapter.disable()
}
但是方法
enable()
和 disable()
在 API 级别 29 中已被删除。
比我尝试使用全局设置
val contentResolver = context.contentResolver
// Enable NFC
Settings.Global.putInt(contentResolver, Settings.Global.NFC_ON, 1)
// Disable NFC
Settings.Global.putInt(contentResolver, Settings.Global.NFC_ON, 0)
而且
Settings.Global.NFC_ON
在 API 级别 31 中也被删除了。
除了使用 Intents 之外,我没有找到任何其他解决方案。
还有其他方法可以达到这个目的吗?
无法通过设置以编程方式禁用,您需要让用户执行此操作。
您可以静默拦截所有 NFC 交互,然后不对它们执行任何操作,这对用户来说就像 NFC 已被禁用。
我在很多活动中都这样做:-
public class MainActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback{
private NfcAdapter mNfcAdapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
}
protected void onResume() {
super.onResume();
if(mNfcAdapter!= null) {
// Request all Tag types are sent to this Activity
// With Platform sounds off, so it's silent
mNfcAdapter.enableReaderMode(this,
this,
NfcAdapter.FLAG_READER_NFC_A |
NfcAdapter.FLAG_READER_NFC_B |
NfcAdapter.FLAG_READER_NFC_F |
NfcAdapter.FLAG_READER_NFC_V |
NfcAdapter.FLAG_READER_NFC_BARCODE |
NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK |
NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS,
null);
}
}
protected void onPause() {
super.onPause();
if(mNfcAdapter!= null)
mNfcAdapter.disableReaderMode(this);
}
public void onTagDiscovered(Tag tag) {
// Do nothing when a Tag is presented
Log.v("MainActivity", "onTagDiscovered:Start");
}
}