Android 12 新的蓝牙权限

Posted

技术标签:

【中文标题】Android 12 新的蓝牙权限【英文标题】:Android 12 New Bluetooth Permissions 【发布时间】:2021-08-15 18:17:33 【问题描述】:

蓝牙是我们应用程序的主要依赖项。因此,我们已经尝试实施新的 android 12 蓝牙权限。我们唯一的资源是Android developers New Bluetooth permissions in Android 12。只是说添加权限

“android.permission.BLUETOOTH_CONNECT”

“android.permission.BLUETOOTH_SCAN”

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

您有什么建议或资源吗?

【问题讨论】:

在 Android 12 或 pre 12 上也找不到 BLE 设备? 我也在尝试添加这些权限,但它们在 android studio 中不存在......我只看到旧的(BLUETOOTH、BLUETOOTH_ADMIN、BLUETOOTH_ADMIN_PRIVILEGED)。我将 targetSdkVersion 设置为“S”,将 compileSdkVersion 设置为“android-S”,将 buildToolsVersion 设置为“3.0.0-rc5”。有什么想法吗? 我可以看到。我的设置是这样的:compileSdkVersion "android-S" buildToolsVersion "30.0.3" targetSdkVersion 31 【参考方案1】:

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"/>

Kotlin 代码:

 //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

【讨论】:

【参考方案2】:

我刚刚添加到清单中:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

来自developer android 我们看到你必须添加

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

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

【讨论】:

感谢您的回答 Barney,很抱歉之前没有提及,但 BLUETOOTH_ADMIN 已添加。它也不适用。【参考方案5】:

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

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

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

关于示例:您可以不包括这两行:

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

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

【讨论】:

以上是关于Android 12 新的蓝牙权限的主要内容,如果未能解决你的问题,请参考以下文章

一起Talk Android吧(第三百九十回:关于Android版本12适配蓝牙权限的问题)

Android 12 蓝牙适配

Android 12 蓝牙适配

Android 12 蓝牙适配 Java版

Android 12 蓝牙适配 Java版

Android 12 附近设备权限使应用程序崩溃