Request BLUETOOTH_SCAN/CONNECT at onAttach on API 31+

Activity.requestPermissions is unreliable from non-UI threads / late
timing on Android 17 (createDeviceContext garbage device id); the
fragment's onAttach request path works. Skip the legacy location
request on API 31+ (BLUETOOTH_SCAN is neverForLocation). Rebuild
Ble.jar.
This commit is contained in:
Greg Pomerantz 2026-08-21 20:28:43 -04:00
parent 876ea68622
commit 99598c14fe
2 changed files with 11 additions and 2 deletions

BIN
Ble.jar

Binary file not shown.

View File

@ -35,6 +35,7 @@ public class BlessedConnect extends Fragment {
final int PERMISSION_REQUEST = 1;
final int REQUEST_ENABLE_BT = 2;
final int PERMISSION_REQUEST_BLE = 3;
public BlessedConnect() {
Log.d("gio", "BlessedConnect()");
@ -63,7 +64,15 @@ public class BlessedConnect extends Fragment {
super.onAttach(ctx);
Log.d("gio", "BlessedConnect: onAttach()");
ctx.registerReceiver(receiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
if (ctx.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (android.os.Build.VERSION.SDK_INT >= 31) {
// BLE on Android 12+ needs the BLUETOOTH_SCAN/CONNECT runtime
// permissions. BLUETOOTH_SCAN is declared with
// usesPermissionFlags="neverForLocation", so no location
// permission is required for scanning.
requestPermissions(new String[]{
"android.permission.BLUETOOTH_SCAN",
"android.permission.BLUETOOTH_CONNECT"}, PERMISSION_REQUEST_BLE);
} else if (ctx.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST);
}
central = new BluetoothCentral(ctx, centralCallback, null);
@ -268,7 +277,7 @@ public class BlessedConnect extends Fragment {
@Override
public void onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) {
Log.d("gio", "BlessedConnect: onRequestPermissionsResult");
if (requestCode == PERMISSION_REQUEST) {
if (requestCode == PERMISSION_REQUEST || requestCode == PERMISSION_REQUEST_BLE) {
boolean granted = true;
for (int x : grantResults) {
if (x == PackageManager.PERMISSION_DENIED) {