27

蓝牙是我们应用程序的主要依赖项。因此,我们已经尝试实施新的 Android 12 蓝牙权限。我们唯一的资源是Android 开发人员 Android 12 中的新蓝牙权限。只是说添加权限

“android.permission.BLUETOOTH_CONNECT”

“android.permission.BLUETOOTH_SCAN”

我添加并获得了两者的运行时权限,当然还有位置(通常是 12 之前的版本))。
我的代码库没有其他变化。应该?我不知道。所以,问题是我的应用找不到 BLE 设备。我找不到原因。

你有什么建议或资源吗?

4

5 回答 5

14

100% 工作解决方案:不需要任何第三方插件

清单代码:

   <!--BLUETOOTH PERMISSION-->
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <!-- Needed only if your app looks for Bluetooth devices.
             If your app doesn't use Bluetooth scan results to derive physical
             location information, you can strongly assert that your app
             doesn't derive physical location. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <!-- Needed only if your app makes the device discoverable to Bluetooth
      devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <!-- Needed only if your app communicates with already-paired Bluetooth
           devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <!--bibo01 : hardware option-->
    <uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>

科特林代码:

 //check android12+
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                            requestMultiplePermissions.launch(arrayOf(
                                Manifest.permission.BLUETOOTH_SCAN,
                                Manifest.permission.BLUETOOTH_CONNECT))
                        }
                        else{
                            val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
                            requestBluetooth.launch(enableBtIntent)
                        }
....................................................

private var requestBluetooth = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
                if (result.resultCode == RESULT_OK) {
                    //granted
                }else{
                    //deny
                }
 }

private val requestMultiplePermissions =
                registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
                    permissions.entries.forEach {
                        Log.d("test006", "${it.key} = ${it.value}")
                    }
}

阅读更多: https ://developer.android.com/guide/topics/connectivity/bluetooth/permissions

在此处输入图像描述

于 2021-11-15T10:25:14.630 回答
6

我刚刚添加到清单中:

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

然后我像其他任何人一样向 Main Activity 请求这些权限。为了请求许可,我正在使用库

implementation 'pub.devrel:easypermissions:3.0.0'

那么你可以调用这个函数

public static final String[] BLUETOOTH_PERMISSIONS_S = { Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT} ;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
     if (!EasyPermissions.hasPermissions(this, BLUETOOTH_PERMISSIONS_S)) {
                EasyPermissions.requestPermissions(this, message, yourRequestCode,BLUETOOTH_PERMISSIONS_S);
            }
        }

并覆盖 onRequestPermissionResult

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

JetPACK 组合更新

如果您使用的是 jetpack compose,则可以这样处理:

在 rememberMultiplePermissionState 函数中创建您的权限列表

 rememberMultiplePermissionsState(
            permissions = listOf(
                Manifest.permission.BLUETOOTH_CONNECT,
                Manifest.permission.BLUETOOTH_SCAN
            )
        )

然后观察生命周期事件和恢复启动权限请求

    val lifecycleOwner = LocalLifecycleOwner.current
    DisposableEffect(key1 = lifecycleOwner,
        effect = {
            val observer = LifecycleEventObserver { _, event ->
                if(event == Lifecycle.Event.ON_START) {
                    permissionsState.launchMultiplePermissionRequest()
                }
            }
            lifecycleOwner.lifecycle.addObserver(observer)

            onDispose {
                lifecycleOwner.lifecycle.removeObserver(observer)
            }
        })

观察权限状态

permissionsState.permissions.forEach { permissionState ->
            when(permissionState.permission) {
                Manifest.permission.ACCESS_FINE_LOCATION -> {
                    when {
                        permissionState.hasPermission -> {}
                    }
                }
            }
        }
    }
于 2021-06-21T11:03:18.027 回答
1

这是一个平台错误。谷歌修复了新的 Android 12 Beta 版本中的错误。

于 2021-08-19T06:13:31.280 回答
0

我不确定他们是否宣布了有关蓝牙更改的任何内容,但如果没有其他帮助,他们最近介绍了这一点,这可能对您的用例有所帮助,除非您做更复杂的事情。

https://developer.android.com/guide/topics/connectivity/companion-device-pairing#kotlin

在较新的版本中,如果这可以满足您的所有需求,您也不再需要位置权限。

关于示例:您不能只包括以下两行:

    .setNamePattern(Pattern.compile("My device"))
    .addServiceUuid(ParcelUuid(UUID(0x123abcL, -1L)), null)

我用它来搜索设备没有任何问题,连接工作类似

于 2021-06-02T22:23:31.947 回答
0

如果您希望您的应用程序启动设备发现或操作蓝牙设置,则除了 BLUETOOTH 权限之外,您还必须声明 BLUETOOTH_ADMIN 权限。大多数应用程序仅需要此权限才能发现本地蓝牙设备。除非应用程序是根据用户请求修改蓝牙设置的“电源管理器”,否则请勿使用此权限授予的其他功能。在您的应用清单文件中声明蓝牙权限

开发者 android我们看到你必须添加

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

在您的清单文件中,但您没有添加它以发现其他设备我认为这是您的问题的资源

于 2021-05-31T09:54:21.257 回答