Need android.permission.BLUETOOTH_CONNECT permission

2,590
2021-11-17 16:00:00.429 28595-28595/com.X.XX.XXX E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.X.XX.XXX, PID: 28595
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.X.XX.XXX/com.X.XX.XXX.XXXXActivity}: java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission for AttributionSource { uid = 10149, packageName = com.X.XX.XXX, attributionTag = null, token = android.os.BinderProxy@f8023b7, next = null }: GattService registerServer
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3646)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3803)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:104)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2217)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7813)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
     Caused by: java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission for AttributionSource { uid = 10149, packageName = com.X.XX.XXX, attributionTag = null, token = android.os.BinderProxy@f8023b7, next = null }: GattService registerServer
        at android.os.Parcel.createExceptionOrNull(Parcel.java:2425)
        at android.os.Parcel.createException(Parcel.java:2409)
        at android.os.Parcel.readException(Parcel.java:2392)
        at android.os.Parcel.readException(Parcel.java:2334)
        at android.bluetooth.IBluetoothGatt$Stub$Proxy.registerServer(IBluetoothGatt.java:3042)
        at android.bluetooth.BluetoothGattServer.registerCallback(BluetoothGattServer.java:496)
        at android.bluetooth.BluetoothManager.openGattServer(BluetoothManager.java:306)
        at android.bluetooth.BluetoothManager.openGattServer(BluetoothManager.java:267)
        at android.bluetooth.BluetoothManager.openGattServer(BluetoothManager.java:225)
        at com.X.XX.XXXActivity.E(SourceFile:1)
        at com.X.XX.XXXActivity.o(SourceFile:17)
        at com.realsil.demo.emulator.advertiser.apcf.ApcfAdvertisingActivity.onCreate(SourceFile:20)
        at android.app.Activity.performCreate(Activity.java:8068)
        at android.app.Activity.performCreate(Activity.java:8048)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1341)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3627)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3803) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:104) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2217) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:201) 
        at android.os.Looper.loop(Looper.java:288) 
        at android.app.ActivityThread.main(ActivityThread.java:7813) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003

Android 12 引入了 BLUETOOTH_SCANBLUETOOTH_ADVERTISEBLUETOOTH_CONNECT 权限,可让您的应用扫描附近的设备,而无需请求位置权限。您的应用必须以 Android 12 为目标平台,才能声明这些权限。

添加权限

<manifest>
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH"
                     android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
                     android:maxSdkVersion="30" />

    <!-- Needed only if your app looks for Bluetooth devices.
         You must add an attribute to this permission, or declare the
         ACCESS_FINE_LOCATION permission, depending on the results when you
         check location usage in your app. -->
    <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" />
    ...
</manifest>

面向用户的对话框

BLUETOOTH_SCANBLUETOOTH_ADVERTISEBLUETOOTH_CONNECT 权限是运行时权限。因此,您必须先在应用中明确请求用户批准,然后才能查找蓝牙设备、使某个设备可被其他设备检测到,或者与已配对的蓝牙设备通信。

参考:

developer.android.google.cn/about/versi…