From d538b6fa575d5e715d835c96122fab8f3559e632 Mon Sep 17 00:00:00 2001 From: grand-master Date: Fri, 7 Feb 2025 14:44:33 +0300 Subject: [PATCH 1/2] Namespace not specified. Specify a namespace in the module's build file. --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index bc78bd3..67c29f1 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -23,7 +23,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 28 - + namespace = "com.tablemi.flutter_bluetooth_basic" defaultConfig { minSdkVersion 21 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From 5c3bf8d8a9e4e2905cf7c3f552208d3d53aa4596 Mon Sep 17 00:00:00 2001 From: GrandMaster Date: Tue, 4 Aug 2026 18:33:31 +0300 Subject: [PATCH 2/2] Fix: Migrate Android plugin to Flutter V2 Embedding API --- .../FlutterBluetoothBasicPlugin.java | 63 +++++++++++++------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/android/src/main/java/com/tablemi/flutter_bluetooth_basic/FlutterBluetoothBasicPlugin.java b/android/src/main/java/com/tablemi/flutter_bluetooth_basic/FlutterBluetoothBasicPlugin.java index 3eca57f..aa13957 100644 --- a/android/src/main/java/com/tablemi/flutter_bluetooth_basic/FlutterBluetoothBasicPlugin.java +++ b/android/src/main/java/com/tablemi/flutter_bluetooth_basic/FlutterBluetoothBasicPlugin.java @@ -17,6 +17,9 @@ import android.util.Log; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.EventChannel.EventSink; import io.flutter.plugin.common.EventChannel.StreamHandler; @@ -24,7 +27,6 @@ import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.plugin.common.PluginRegistry.Registrar; import io.flutter.plugin.common.PluginRegistry.RequestPermissionsResultListener; import java.util.ArrayList; @@ -34,38 +36,63 @@ import java.util.Vector; /** FlutterBluetoothBasicPlugin */ -public class FlutterBluetoothBasicPlugin implements MethodCallHandler, RequestPermissionsResultListener { +public class FlutterBluetoothBasicPlugin implements FlutterPlugin, ActivityAware, MethodCallHandler, RequestPermissionsResultListener { private static final String TAG = "BluetoothBasicPlugin"; private int id = 0; private ThreadPool threadPool; private static final int REQUEST_COARSE_LOCATION_PERMISSIONS = 1451; private static final String NAMESPACE = "flutter_bluetooth_basic"; - private final Registrar registrar; - private final Activity activity; - private final MethodChannel channel; - private final EventChannel stateChannel; - private final BluetoothManager mBluetoothManager; + private Activity activity; + private MethodChannel channel; + private EventChannel stateChannel; + private BluetoothManager mBluetoothManager; private BluetoothAdapter mBluetoothAdapter; private MethodCall pendingCall; private Result pendingResult; - public static void registerWith(Registrar registrar) { - final FlutterBluetoothBasicPlugin instance = new FlutterBluetoothBasicPlugin(registrar); - registrar.addRequestPermissionsResultListener(instance); - } + public FlutterBluetoothBasicPlugin() {} - FlutterBluetoothBasicPlugin(Registrar r){ - this.registrar = r; - this.activity = r.activity(); - this.channel = new MethodChannel(registrar.messenger(), NAMESPACE + "/methods"); - this.stateChannel = new EventChannel(registrar.messenger(), NAMESPACE + "/state"); - this.mBluetoothManager = (BluetoothManager) registrar.activity().getSystemService(Context.BLUETOOTH_SERVICE); - this.mBluetoothAdapter = mBluetoothManager.getAdapter(); + @Override + public void onAttachedToEngine(FlutterPluginBinding binding) { + channel = new MethodChannel(binding.getBinaryMessenger(), NAMESPACE + "/methods"); + stateChannel = new EventChannel(binding.getBinaryMessenger(), NAMESPACE + "/state"); channel.setMethodCallHandler(this); stateChannel.setStreamHandler(stateStreamHandler); } + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) { + channel.setMethodCallHandler(null); + stateChannel.setStreamHandler(null); + } + + @Override + public void onAttachedToActivity(ActivityPluginBinding binding) { + activity = binding.getActivity(); + mBluetoothManager = (BluetoothManager) activity.getSystemService(Context.BLUETOOTH_SERVICE); + if (mBluetoothManager != null) { + mBluetoothAdapter = mBluetoothManager.getAdapter(); + } + binding.addRequestPermissionsResultListener(this); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + activity = null; + } + + @Override + public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) { + activity = binding.getActivity(); + binding.addRequestPermissionsResultListener(this); + } + + @Override + public void onDetachedFromActivity() { + activity = null; + } + @Override public void onMethodCall(MethodCall call, Result result) { if (mBluetoothAdapter == null && !"isAvailable".equals(call.method)) {