You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin中检测蓝牙设备连接并修复Toast不显示问题?

蓝牙设备连接Toast无响应的修复方案

你的代码主要问题在于权限未动态申请以及部分细节优化,以下是具体修改点:

1. 动态申请BLUETOOTH_CONNECT权限

Android 12(API 31)及以上版本中,BLUETOOTH_CONNECT属于危险权限,仅在Manifest中声明无法让应用接收蓝牙设备连接的广播,必须在运行时主动申请。

2. 优化广播接收器的上下文使用

在onReceive方法中使用传入的Context参数创建Toast,避免使用baseContext可能引发的内存泄漏或上下文失效问题。

3. 注销广播接收器

动态注册的广播接收器必须在Activity销毁时注销,防止内存泄漏。


修改后的MainActivity.kt代码

import android.Manifest
import android.bluetooth.BluetoothDevice
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    private lateinit var bluetoothBroadcastReceiver: BroadcastReceiver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 针对Android 12+动态申请蓝牙连接权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            requestPermissions(arrayOf(Manifest.permission.BLUETOOTH_CONNECT), 100)
        }

        bluetoothBroadcastReceiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                val action = intent?.action ?: return

                when (action) {
                    BluetoothDevice.ACTION_ACL_CONNECTED -> {
                        Toast.makeText(context, "设备已连接", Toast.LENGTH_SHORT).show()
                    }
                    BluetoothDevice.ACTION_ACL_DISCONNECTED -> {
                        Toast.makeText(context, "设备已断开连接", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }

        val filter = IntentFilter().apply {
            addAction(BluetoothDevice.ACTION_ACL_CONNECTED)
            addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED)
        }
        registerReceiver(bluetoothBroadcastReceiver, filter)
    }

    override fun onDestroy() {
        super.onDestroy()
        // 注销广播接收器,避免内存泄漏
        unregisterReceiver(bluetoothBroadcastReceiver)
    }

    // 处理权限申请结果
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == 100) {
            if (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "需授予蓝牙连接权限才能接收连接通知", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

AndroidManifest.xml说明

你当前的权限声明无需修改,但要注意:

  • 对于Android 12以下版本,BLUETOOTH和BLUETOOTH_ADMIN权限已足够
  • Android 12+必须同时声明并动态申请BLUETOOTH_CONNECT权限

另外需要注意:ACTION_ACL_CONNECTED这类蓝牙设备连接广播属于隐式广播,Android 8.0+不允许静态注册,所以你当前动态注册的方式是正确的,无需改为静态注册。

内容的提问来源于stack exchange,提问作者user18560558

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:40:28