Android Studio Kotlin中Bluetooth ACTION_REQUEST_ENABLE在Android12不生效
Android 12蓝牙请求开启功能崩溃解决方案
崩溃原因
Android 12(API 31)开始,BLUETOOTH_CONNECT被归类为危险级运行时权限,仅在AndroidManifest.xml中声明无效,你点击按钮后直接调用蓝牙开启逻辑,缺少运行时权限会触发SecurityException直接崩溃,这是问题仅出现在Android 12设备上的核心原因。
修复步骤
1. 修正Manifest权限配置
替换你原有权限配置为以下内容,同时兼容高低版本系统:
<!-- Android 11及以下蓝牙扫描需要定位权限,仅开启蓝牙可按需添加 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" /> <!-- Android 12+蓝牙连接权限 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- legacy蓝牙管理权限,Android 12+无需 --> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- 声明应用使用蓝牙功能 --> <uses-feature android:name="android.hardware.bluetooth" android:required="false" />
2. 修改MainActivity代码,添加运行时权限逻辑
package com.example.piratsilnic import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothManager import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { private val REQUEST_ENABLE_BT = 1 private val REQUEST_BT_CONNECT_PERM = 2 private lateinit var bluetoothAdapter: BluetoothAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager bluetoothAdapter = bluetoothManager.adapter val sparovatButton = findViewById<Button>(R.id.sparovatButton) sparovatButton.setOnClickListener{ // 检查设备是否支持蓝牙 if (!packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) { Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_LONG).show() return@setOnClickListener } // Android 12+先申请蓝牙连接权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.BLUETOOTH_CONNECT), REQUEST_BT_CONNECT_PERM) return@setOnClickListener } } // 已有权限,处理蓝牙开启逻辑 if (!bluetoothAdapter.isEnabled) { val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT) } else { Toast.makeText(this, "蓝牙已开启", Toast.LENGTH_LONG).show() } } } // 处理权限申请结果 override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_BT_CONNECT_PERM) { if (grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED) { // 权限申请成功,触发后续逻辑 findViewById<Button>(R.id.sparovatButton).performClick() } else { Toast.makeText(this, "请授予蓝牙权限后重试", Toast.LENGTH_LONG).show() } } } // 处理蓝牙开启结果 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_ENABLE_BT) { val msg = if (resultCode == RESULT_OK) "蓝牙开启成功" else "蓝牙开启失败" Toast.makeText(this, msg, Toast.LENGTH_LONG).show() } } }
内容的提问来源于stack exchange,提问作者Matous Nehasil
相关产品推荐
相关产品推荐

