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

Wear OS设备蓝牙权限申请异常问题求助

Wear OS(Pixel智能手表)蓝牙权限申请异常问题

开发一款仅基于Wear OS设备(Pixel智能手表)、无需手机配合的室内导航应用,目前在蓝牙权限申请环节遇到问题,查阅官方文档后仍对部分权限规则是否适用于Wear OS而非仅手机端Android存在困惑。

Manifest权限配置

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

原本可能不需要全部权限,但因子集权限无法生效,遂添加所有相关权限,问题仍未解决。

Activity权限申请代码

val permissions = arrayOf(
    Manifest.permission.BLUETOOTH,
    Manifest.permission.BLUETOOTH_ADMIN,
    Manifest.permission.BLUETOOTH_ADVERTISE,
    Manifest.permission.BLUETOOTH_CONNECT,
    Manifest.permission.BLUETOOTH_SCAN,
    Manifest.permission.ACCESS_COARSE_LOCATION,
    Manifest.permission.ACCESS_FINE_LOCATION,
)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
    val permissionsLeft = ArrayList<String>()

    permissions.forEach {
        if (ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED) {
            permissionsLeft.add(it)
            Log.i("TEST", "permission missing: $it")
        }
    }
    if (permissionsLeft.isNotEmpty()) {
       
        ActivityCompat.requestPermissions(this, permissionsLeft.toTypedArray(), 1);
    }

权限表现异常情况

  • 仅首次安装运行(删除后重装)时弹出权限确认对话框,但仅需确认位置权限,无任何蓝牙权限相关提示;Logcat显示BLUETOOTH和BLUETOOTH_ADMIN已被授予。
  • 确认位置权限后,后续运行时Logcat显示仅缺少BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT、BLUETOOTH_SCAN权限,但这些权限既无法弹出申请对话框,也未出现在应用权限设置列表中。

onRequestPermissionsResult实现

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    when (requestCode) {
        REQUEST_CODE -> {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.i("TEST", "Granted")
            } else {
                Log.i("TEST", "Not Granted")
            }
        }
    }
}

上述剩余权限始终进入Not Granted分支,且无任何用户交互。

------ 更新 ------

  • 发现即使未获得BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT、BLUETOOTH_SCAN权限,仍可调用bluetoothAdapter.startDiscovery()等本应受权限限制的功能,不确定是Bug、Wear OS特例还是理解有误。
  • 如图所示,生成的权限检查逻辑会因权限未授予而阻止执行device!!.name;但为函数添加@SuppressLint("MissingPermission")注解、跳过权限检查时,功能可正常运行。

Requires permission check

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:18:09