alann-maulana / flutter_beacon

An hybrid iBeacon scanner and transmitter SDK for Flutter Android and iOS.
Apache License 2.0
118 stars 147 forks source link

Android 12 issue: Caused by java.lang.IllegalStateException: Reply already submitted #109

Open XinyueZ opened 2 years ago

XinyueZ commented 2 years ago
Fatal Exception: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=5678, result=0, data=null} to activity {}: java.lang.IllegalStateException: Reply already submitted
       at android.app.ActivityThread.deliverResults(ActivityThread.java:5857)
       at android.app.ActivityThread.handleSendResult(ActivityThread.java:5896)
       at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54)
       at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
       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:2434)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8633)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)
Caused by java.lang.IllegalStateException: Reply already submitted
       at io.flutter.embedding.engine.dart.DartMessenger$Reply.reply(DartMessenger.java:35)
       at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.error(MethodChannel.java:14)
       at com.flutterbeacon.FlutterBeaconPlugin.onActivityResult(FlutterBeaconPlugin.java:65)
       at io.flutter.embedding.engine.FlutterEngineConnectionRegistry$FlutterEngineActivityPluginBinding.onActivityResult(FlutterEngineConnectionRegistry.java:25)
       at io.flutter.embedding.engine.FlutterEngineConnectionRegistry.onActivityResult(FlutterEngineConnectionRegistry.java:15)
       at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onActivityResult(FlutterActivityAndFragmentDelegate.java:51)
       at io.flutter.embedding.android.FlutterActivity.onActivityResult(FlutterActivity.java:10)
       at android.app.Activity.dispatchActivityResult(Activity.java:8651)
       at android.app.ActivityThread.deliverResults(ActivityThread.java:5850)
       at android.app.ActivityThread.handleSendResult(ActivityThread.java:5896)
       at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54)
       at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
       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:2434)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8633)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)
LutfiGarzon commented 2 years ago

There's a workaround, you just need to manually when starting the Bluetooth.

import 'package:flutter_beacon/flutter_beacon.dart' as beacon;

Future startBeacon() async {
    try {
      debugPrint('Beacon Start!');
      final status = await beacon.flutterBeacon.authorizationStatus;
      debugPrint(status.value);
      if (status.value == beacon.AuthorizationStatus.notDetermined.value) {
        final result = await beacon.flutterBeacon.bluetoothState;
        if (result.value == beacon.BluetoothState.stateOn.value) await beacon.flutterBeacon.initializeAndCheckScanning;
      } else {
        await beacon.flutterBeacon.initializeScanning;
      }
    } on PlatformException catch (e, s) {
      debugPrint(e.toString());
      debugPrint(s.toString());
      Sentry.captureException(e, stackTrace: s);
    }
  }

After you do this will not crash is not a solution but is better than anything else until there's a better solution.