BLE扫描在Android 12+上崩溃

bkhjykvo  于 2022-12-09  发布在  Android
关注(0)|答案(2)|浏览(556)

问题所在

你好,我遇到了一个问题,我自己无法解决。我是一个实习生在Haia咨询公司,我开发使用Kotlin为Android运行平台。我无法执行BLE扫描的S21+ android手机在Android 12,无论是我的代码,或者来自Github的代码。应用程序运行,直到我按下扫描按钮,执行BLE扫描。应用程序崩溃。这在较低版本的Android上不会发生,我能够结合蓝牙低功耗使用Android 12定向版本非常重要。

2022-12-07 16:01:45.692 28797-28797 AndroidRuntime          
    com...e.ultrawidebandproofofconcept  E  FATAL EXCEPTION: main
        Process: com.example.ultrawidebandproofofconcept, PID: 28797
        java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for AttributionSource { uid = 10366, packageName = com.example.ultrawidebandproofofconcept, attributionTag = null, token = android.os.BinderProxy@ff32c8f, next = null }: GattService registerScanner
            at android.os.Parcel.createExceptionOrNull(Parcel.java:2438)
            at android.os.Parcel.createException(Parcel.java:2422)
            at android.os.Parcel.readException(Parcel.java:2405)
            at android.os.Parcel.readException(Parcel.java:2347)
            at android.bluetooth.IBluetoothGatt$Stub$Proxy.registerScanner(IBluetoothGatt.java:1886)
            at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.startRegistration(BluetoothLeScanner.java:519)
            at android.bluetooth.le.BluetoothLeScanner.startScan(BluetoothLeScanner.java:305)
            at android.bluetooth.le.BluetoothLeScanner.startScan(BluetoothLeScanner.java:161)
            at com.example.ultrawidebandproofofconcept.MainActivity.startBleScan(MainActivity.kt:96)
            at com.example.ultrawidebandproofofconcept.MainActivity.onCreate$lambda-0(MainActivity.kt:80)
            at com.example.ultrawidebandproofofconcept.MainActivity.$r8$lambda$NQsLDkI5TsYB6INH-F0JwBK_SNM(Unknown Source:0)
            at com.example.ultrawidebandproofofconcept.MainActivity$$ExternalSyntheticLambda2.onClick(Unknown Source:2)
            at android.view.View.performClick(View.java:7792)
            at android.widget.TextView.performClick(TextView.java:16112)
            at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1219)
            at android.view.View.performClickInternal(View.java:7769)
            at android.view.View.access$3800(View.java:910)
            at android.view.View$PerformClick.run(View.java:30218)
            at android.os.Handler.handleCallback(Handler.java:938)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loopOnce(Looper.java:226)
            at android.os.Looper.loop(Looper.java:313)
            at android.app.ActivityThread.main(ActivityThread.java:8751)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
                                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

向导伍紧跟着:https://punchthrough.com/android-ble-guide/
我一直遵循这一指南,直到我遇到问题,在某一点上,网页被更新,通知读者指南是最新的android 12+。我去了这个指南的github repo,克隆了android 12+分支(https://github.com/PunchThrough/ble-starter-android/tree/feature/android-12-up)。发生了与上面提到的我的项目中相同的错误。我和我的同事怀疑我的笔记本电脑或公司提供的手机有问题。如果目标版本设置为android 12+,IDE建议您添加if语句,以查看用户是否授予了您权限:IDE's suggestion to see if the user has granted the permission如果我不添加IDE生成的if语句,并在我请求用户权限后尝试执行BLE扫描,应用程序仍然崩溃。我试着把结果打印到控制台上,看看权限是否真的被授予了。我向用户询问位置权限,并询问用户是否同意我启用蓝牙。printout permissionsThe results of the printout正如你所看到的,当我检查是否为蓝牙扫描提供了权限时,我得到一个-1作为返回。我假设这是一个错误代码,因为你应该只得到true(1)或false(0)。

尝试的解决方案

我尝试过向用户请求精确定位权限和粗略定位权限,因为这是android 12和更低版本在蓝牙低能耗方面的主要区别。但是这并没有带来什么不同。由于我不使用蓝牙进行定位相关的目的,我明确声明我不会在清单文件中使用位置。这也不起作用。有人知道如何解决这个问题吗?你能运行本文档中提到的项目而不出现问题吗?有人知道线索吗?任何一点信息都有帮助!

SOFTWARE & HARDWARE SPECIFICATIONS
Run on s21+ Android phone with Android 11
Project specifications:
targetSDK: 32
MinSDK: 31
Manifest permissions:
<uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        tools:remove="android:maxSdkVersion"/>
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

项目Github存储库:https://github.com/FedorTselishchev/UWB-POC-Stackoverflow
请帮帮忙,我想再见到我的家人。

g2ieeal7

g2ieeal71#

Android 12更改似乎需要您的应用在清单文件中声明:
如果您的应用面向Android 12(API级别31)或更高版本,请在应用的清单文件中声明以下权限:
如果您的应用查找蓝牙设备(如BLE外设),请声明BLUETOOTH_SCAN权限。
来源:https://developer.android.com/guide/topics/connectivity/bluetooth/permissions

9avjhtql

9avjhtql2#

由于targetSdk为32,minimumSdk为31,因此您可能只需要声明

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission
        android:name="android.permission.BLUETOOTH_SCAN"
        android:usesPermissionFlags="neverForLocation"
        tools:targetApi="s" />

并请求运行时用户权限作为

requestMultiplePermissionLauncher.launch(arrayOf(Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT))

这将启动邻近设备的权限请求。
如果您的目标是较低的SDK版本或打算派生用户位置,则仅声明和请求位置权限。
请遵循此link以了解如何请求运行时权限。
编辑:如果您只想扫描ble设备,而不想连接,则声明并请求仅扫描权限,放弃连接权限。

相关问题