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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:24:01