如何关闭Android API 16及以上版本的NFC提示音?
如何在Android API 16及以上版本关闭NFC提示音?
嘿,我来帮你搞定这个NFC提示音的问题!在API 16+的Android设备上,有两种靠谱的方法可以关闭系统默认的NFC检测提示音,下面结合你的代码给你一步步说明:
方法一:直接调用NFC适配器的静音方法(最简单)
从API 16开始,NfcAdapter提供了disableSound()方法,专门用来关闭NFC检测时的系统提示音。你只需要在初始化NFC适配器后调用这个方法就行。
修改你代码里的onCreate方法,加上这一行:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_traveller_read_tag); context = this; tvNFCContent = findViewById(R.id.nfc_contents); nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { // Stop here, we definitely need NFC Toast.makeText(this, "This device doesn't support NFC.", Toast.LENGTH_LONG).show(); finish(); } // 新增:关闭NFC提示音 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { nfcAdapter.disableSound(); } readFromIntent(getIntent()); pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); tagDetected.addCategory(Intent.CATEGORY_DEFAULT); writeTagFilters = new IntentFilter[]{tagDetected}; findViewById(R.id.menu).setVisibility(View.GONE); }
注意:部分定制ROM可能会忽略这个系统方法,如果这种方法不生效,可以试试第二种。
方法二:拦截NFC广播,阻止系统处理
系统的NFC提示音是在系统接收到ACTION_TAG_DISCOVERED等广播时触发的。我们可以注册一个高优先级的广播接收器,拦截这些广播并终止传递,这样系统就不会播放提示音了。
步骤1:添加广播接收器
在你的Activity里定义一个广播接收器,并重写onReceive方法:
private BroadcastReceiver nfcSilenceReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { // 终止广播传递,阻止系统处理 abortBroadcast(); // 继续处理你的NFC逻辑 readFromIntent(intent); } } };
步骤2:动态注册广播接收器
在onCreate里注册这个接收器,设置最高优先级:
@Override protected void onCreate(Bundle savedInstanceState) { // ... 你的原有代码 ... // 注册高优先级NFC广播接收器 IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); filter.addAction(NfcAdapter.ACTION_TECH_DISCOVERED); filter.addAction(NfcAdapter.ACTION_NDEF_DISCOVERED); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); registerReceiver(nfcSilenceReceiver, filter); // ... 你的原有代码 ... }
步骤3:注销广播接收器
记得在Activity销毁时注销,避免内存泄漏:
@Override protected void onDestroy() { super.onDestroy(); if (nfcSilenceReceiver != null) { unregisterReceiver(nfcSilenceReceiver); } }
注意事项
- 如果你用了第二种方法,建议移除原有
pendingIntent相关的NFC注册逻辑,避免重复处理NFC事件。 - 不同厂商的ROM可能对NFC行为有定制,如果一种方法不生效,可以尝试两种结合使用。
内容的提问来源于stack exchange,提问作者amir houshmand




