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_SCAN
、BLUETOOTH_ADVERTISE
和 BLUETOOTH_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_SCAN
、BLUETOOTH_ADVERTISE
和 BLUETOOTH_CONNECT
权限是运行时权限。因此,您必须先在应用中明确请求用户批准,然后才能查找蓝牙设备、使某个设备可被其他设备检测到,或者与已配对的蓝牙设备通信。