无法在 Wear OS Samsung Galaxy Watch 4 上请求蓝牙权限

Cannot request Bluetooth permission on Wear OS Samsung Galaxy Watch 4

我创建了一个示例 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" />

在settings/apps/permissions中没有显示相应的权限,每次权限请求都没有任何作用。顺便说一句,我的 BLE 设备(一个扬声器和一个 esp-32)也没有在 settings/Bluetooth 中显示。

如何为我的应用授予蓝牙权限或如何将 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)
        }

但是对话框windows仍然没有显示

有一些权限,如相机、蓝牙,需要先询问,然后手动提供。在您的应用中最先加载的 activity 中使用它。

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

确保进行必要的更改。

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

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

  • BLUETOOTH 是执行任何蓝牙 classic 或 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 class

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;
    }

}

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