Compare commits

...

3 Commits

Author SHA1 Message Date
e53c7be976 Ignore jar build dir 2026-08-21 20:34:57 -04:00
99598c14fe 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.
2026-08-21 20:28:43 -04:00
876ea68622 Use commitNowAllowingStateLoss (API 24+) for fragment registration
The register() runnable can run after the activity has saved its
state (e.g. app started in the background), in which case commitNow
throws IllegalStateException and crashes the app. Rebuild Ble.jar.
2026-08-21 19:52:33 -04:00
3 changed files with 18 additions and 3 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
classes/
cb.ast

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()");
@ -50,8 +51,12 @@ public class BlessedConnect extends Fragment {
Activity act = (Activity)ctx;
FragmentTransaction ft = act.getFragmentManager().beginTransaction();
ft.add(inst, "BlessedConnect");
if (android.os.Build.VERSION.SDK_INT >= 24) {
ft.commitNowAllowingStateLoss();
} else {
ft.commitNow();
}
}
});
}
@ -59,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);
@ -264,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) {