I installed the "ble-scanner-filters-preview" branch for testing but it (occasionally) crashes at (fresh) start-up:
FATAL EXCEPTION: main
Process: com.santansarah.blescanner, PID: 7151
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.adapter.action.STATE_CHANGED flg=0x4000010 (has extras) } in com.santansarah.blescanner.presentation.BleObserver$createBroadcastReceiver$1@a5bf36f
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$android-app-LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1928)
at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:942)
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:8757)
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:1067)
Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.bluetooth.adapter.action.REQUEST_ENABLE cmp=com.android.settings/.bluetooth.RequestPermissionActivity } from ProcessRecord{1761c06 7151:com.santansarah.blescanner/u0a252} (pid=7151, uid=10252) requires android.permission.BLUETOOTH_CONNECT
at android.os.Parcel.createExceptionOrNull(Parcel.java:3023)
at android.os.Parcel.createException(Parcel.java:3007)
at android.os.Parcel.readException(Parcel.java:2990)
at android.os.Parcel.readException(Parcel.java:2932)
at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:2791)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1801)
at android.app.Activity.startActivityForResult(Activity.java:5596)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:712)
at androidx.core.app.ActivityCompat$Api16Impl.startActivityForResult(ActivityCompat.java:809)
at androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:246)
at androidx.activity.ComponentActivity$2.onLaunch(ComponentActivity.java:237)
at androidx.activity.result.ActivityResultRegistry$2.launch(ActivityResultRegistry.java:175)
at androidx.activity.result.ActivityResultLauncher.launch(ActivityResultLauncher.java:47)
at com.santansarah.blescanner.presentation.BleObserver.launchEnableBtAdapter(BleObserver.kt:93)
at com.santansarah.blescanner.presentation.BleObserver.access$launchEnableBtAdapter(BleObserver.kt:20)
at com.santansarah.blescanner.presentation.BleObserver$createBroadcastReceiver$1.onReceive(BleObserver.kt:77)
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$android-app-LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1918)
at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:942)
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:8757)
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:1067)
Since it does not always happen, my first guess is a race condition (one of the few things kernel developers are good in :-) ) between the BleObserver
(launch of BLE enable intent) and Home.kt
where all the correct permissions are requested. I think in Android 12+ the BleObserver
must request permissions first when the Bluetooth adapter is not enabled and wants to turn it on.
Probably just a small code change to fix this as all the supporting code is already there...