如何在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
相关产品推荐
相关产品推荐

