【问题标题】:Cannot request Bluetooth permission on Wear OS Samsung Galaxy Watch 4无法在 Wear OS Samsung Galaxy Watch 4 上请求蓝牙权限
【发布时间】:2021-12-27 12:57:01
【问题描述】:

我创建了一个示例 Wear OS 应用,它应该可以发现 BLE 设备,但我的代码需要蓝牙权限。当我将这些行放在清单中时:

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

相应的权限不会显示在设置/应用程序/权限中,并且每个权限请求都不执行任何操作。顺便说一句,我的 BLE 设备(扬声器和 esp-32)也没有显示在设置/蓝牙中。

如何为我的应用授予蓝牙权限,或者如何将 BLE 设备连接到我的手表?

更新: 我试过这些:

        if (checkSelfPermission(Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(arrayOf<String>(Manifest.permission.BLUETOOTH), 1001)
        }

        if (checkSelfPermission(Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(arrayOf<String>(Manifest.permission.BLUETOOTH_CONNECT), 1001)
        }

        if (checkSelfPermission(Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(arrayOf<String>(Manifest.permission.BLUETOOTH_SCAN), 1001)
        }

        if (checkSelfPermission(Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(arrayOf<String>(Manifest.permission.BLUETOOTH_ADMIN), 1001)
        }

但对话框窗口仍然不显示

【问题讨论】:

    标签: android bluetooth-lowenergy android-permissions wear-os samsung-galaxy-watch-4


    【解决方案1】:

    根据documentation,您需要基于目标Android API 版本的特定权限。

    如果您的应用面向 Android 11(API 级别 30) 或更低版本,请在应用的清单文件中声明以下权限:

    • 蓝牙是执行任何蓝牙经典或 BLE 通信所必需的,例如请求连接、接受连接和传输数据。

    • ACCESS_FINE_LOCATION 是必要的,因为在 Android 11 及更低版本上,蓝牙扫描可能会用于收集有关用户位置的信息。

    如果您的应用面向 Android 9(API 级别 28)或更低版本,您可以声明 ACCESS_COARSE_LOCATION 权限而不是 ACCESS_FINE_LOCATION 权限。

    为了执行扫描以发现 BLE 设备,应用必须向用户明确要求 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限,也可以在 AndroidManifest.xml 中声明。

    在我的项目(WearOS API 版本 28)中,我在 MainActivity 类的 onCreate 函数中使用了这段代码

    if (ContextCompat.checkSelfPermission(
                this, Manifest.permission.ACCESS_FINE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED 
        ) {
            ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
                    1);
        }
    

    我重写了 onRequestPermissionsResult 函数

     public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        switch (requestCode) {
            case 1:
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 &&
                        grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    
                    Logger.d("MainActivity","Permission approved");
                }  else {
                    Logger.d("MainActivity","Error getting permission");
                }
                return;
        }
    
    }
    

    这对我有用,希望对你有帮助

    【讨论】:

      【解决方案2】:

      有一些权限,如摄像头、蓝牙,需要先询问,然后手动提供。在您的应用中首先加载的 Activity 中使用它。

      if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                  requestPermissions(arrayOf<String>(Manifest.permission.CAMERA), 1001);
              }             //ask camera permissions
      

      确保进行必要的更改。

      【讨论】:

      • 这个穿戴应用请求蓝牙权限github.com/garanj/wearwind/blob/…
      • @mordor619 我已经用这个修改了我的代码(参见 upd 描述),但它没有帮助
      • @Yuri Schimke,谢谢,蓝牙似乎也需要位置权限,我会仔细检查,如果有解决方案,我会在这里发布答案。
      • @andrew 尝试为每个权限赋予不同的值,例如 1001、1002 等等。
      猜你喜欢
      • 2022-10-23
      • 2020-01-27
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多