You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何关闭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

火山引擎 最新活动