Coder Social home page Coder Social logo

boskokg / flutter_blue Goto Github PK

View Code? Open in Web Editor NEW

This project forked from pauldemarco/flutter_blue

48.0 48.0 23.0 17.02 MB

Bluetooth plugin for Flutter

License: BSD 3-Clause "New" or "Revised" License

Java 21.11% Ruby 2.19% Objective-C 12.66% Dart 63.75% Swift 0.30%

flutter_blue's People

Contributors

123lxw123 avatar alxkzmn avatar berdroid avatar blaugold avatar brianegan avatar bsheen avatar dustin-graham avatar efortuna avatar ened avatar ezamagni avatar hanabi1224 avatar kschulz-samsung avatar lidongze91 avatar mehmetf avatar mit-mit avatar nicolasdupere avatar officelioneight avatar pauldemarco avatar rickcasson avatar spekary avatar x0054 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flutter_blue's Issues

BluetoothDescriptor isNotifying throws error: out of range

This error can be found on the example of this package. At the devicescreen, notifying values' status are not correctly displayed.

When I call isNotifying to check if it's notifying, it always returns false so I've checked if any error was occuring by printing error, and checked 'out of range' error was occuring. Probably the cccd.lastValue is empty.

I tried reading the descriptor(0x2902) of the characteristic to get the correct notifying status, but failed since reading multiple descriptor at once is unavailable. It throws descriptor read error, that reading descriptor while other descriptor is being read.

Invalid Data safety section - Usage of ACCESS_FINE_LOCATION

Hi there,

I am currently using v0.11.0 of your fork in my app. Now with every release I get a warning that I am violating the new data safety section (visible from Feb 2022, compliance require from April 2022). The issue is

Data sent off device undeclared in Data safety form: Location Data Type - Precise Location

which to my knowledge should be related to <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> in the AndroidManifest.xml.

Since I can ensure that the physical location is actually not required, is there a way this can be removed from the plugin and added as an installation step to the plugin? I would like to avoid having to declare I am using the user's precise location since I am not actually using it and it may concern users.

Has anyone else experienced this?

Thanks!

Edit: Just realizing this PR and this link. Looks like ACCESS_FINE_LOCATION is required.... Can anyone confirm this?

Characteristic Future never return

In case i try to read or write a characteristic on a glucose meter and after PIN dialog popup, if i cancel it or write in it a wrong PIN, Future await never return.

java.lang.ClassCastException on device.connect() - version 0.13.0 specific

Hi! I'm experiencing an issue when I call device.connect() in version 0.13.0. Please have a look at the log:

I/BluetoothAdapter(24348): getBluetoothLeScanner
D/BluetoothAdapter(24348): isLeEnabled(): ON
D/BluetoothLeScanner(24348): onScannerRegistered() - status=0 scannerId=7 mScannerId=0
I/zygote64(24348): Do partial code cache collection, code=25KB, data=27KB
I/zygote64(24348): After code cache collection, code=25KB, data=27KB
I/zygote64(24348): Increasing code cache capacity to 128KB
I/flutter (24348):    INFO [๐Ÿ’ก  21:32:04 FlutterBluePageController]: Found Device
I/BluetoothAdapter(24348): getBluetoothLeScanner
D/BluetoothAdapter(24348): isLeEnabled(): ON
D/BluetoothManager(24348): getConnectedDevices
D/BluetoothGatt(24348): connect() - device: F2:9A:3E:2B:6E:5D, auto: true
D/BluetoothGatt(24348): registerApp()
D/BluetoothGatt(24348): registerApp() - UUID=43b530ba-380a-4784-9b85-de82b101bcd5
D/BluetoothGatt(24348): onClientRegistered() - status=0 clientIf=7
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): Failed to handle method call
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): java.lang.ClassCastException: byte[] cannot be cast to java.lang.String
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at com.pauldemarco.flutter_blue.FlutterBluePlugin.onMethodCall(FlutterBluePlugin.java:336)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at android.os.MessageQueue.next(MessageQueue.java:379)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at android.os.Looper.loop(Looper.java:144)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at android.app.ActivityThread.main(ActivityThread.java:7529)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
E/MethodChannel#plugins.pauldemarco.com/flutter_blue/methods(24348): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
E/DartMessenger(24348): Uncaught exception in binary message listener
E/DartMessenger(24348): java.lang.IllegalStateException: Reply already submitted
E/DartMessenger(24348): 	at io.flutter.embedding.engine.dart.DartMessenger$Reply.reply(DartMessenger.java:164)
E/DartMessenger(24348): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:253)
E/DartMessenger(24348): 	at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84)
E/DartMessenger(24348): 	at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865)
E/DartMessenger(24348): 	at android.os.MessageQueue.nativePollOnce(Native Method)
E/DartMessenger(24348): 	at android.os.MessageQueue.next(MessageQueue.java:379)
E/DartMessenger(24348): 	at android.os.Looper.loop(Looper.java:144)
E/DartMessenger(24348): 	at android.app.ActivityThread.main(ActivityThread.java:7529)
E/DartMessenger(24348): 	at java.lang.reflect.Method.invoke(Native Method)
E/DartMessenger(24348): 	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
E/DartMessenger(24348): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
D/BluetoothManager(24348): getConnectionState()
D/BluetoothManager(24348): getConnectedDevices
D/BluetoothManager(24348): getConnectionState()
D/BluetoothManager(24348): getConnectedDevices
I/flutter (24348):   DEBUG [๐Ÿ›  21:32:05 FlutterBluePageController]: BluetoothDeviceState.disconnected

This issue doesn't happen in version 0.12.0. My testing device is Android 8.0.0. Could anyone provide any advice on how to deal with it? Thanks in advance!

CentralManager Init: Background Usage and API MISUSE

Previously, pauldemarco#191 had changes for background usage on iOS and Android.

https://github.com/boskokg/flutter_blue/releases/tag/0.11.0 claims Android background usage was added in this repo, but no PR number was referenced and the iOS changes are not present currently.

There are some conflicts with master now because the centralManager initialization was moved to the first handled message. This causes a race on whatever first message is received and startup of CoreBluetooth. The workaround is to make a call like flutterBlue.instance.isOn().

The reason for this change was to delay requested permissions popups from firing as soon as the app opens the first time, so it was a necessary but undocumented regression.

Minimum iOS Deployment target is 10.0

Some of the CoreBluetooth bindings are minimum of 10.0 for IPHONEOS_DEPLOYMENT_TARGET. The Android minimum sdk version is documented on the README. The default for a new flutter application is 9.0.

Instructions for updating the deployment target are documented here: https://docs.flutter.dev/deployment/ios#review-xcode-project-settings

Example Errors:

    /Users/username/.pub-cache/git/flutter_blue-a7fa5410b66cabdc3f12e7d74375db3477a70c85/ios/Classes/FlutterBluePlugin.m:553:49: warning: 'CBManagerState' is only available on iOS 10.0 or newer [-Wunguarded-availability]
    - (ProtosBluetoothState*)toBluetoothStateProto:(CBManagerState)state {
                                                    ^
    In module 'CoreBluetooth' imported from /Users/username/.pub-cache/git/flutter_blue-a7fa5410b66cabdc3f12e7d74375db3477a70c85/ios/Classes/FlutterBluePlugin.h:10:
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.0.sdk/System/Library/Frameworks/CoreBluetooth.framework/Headers/CBManager.h:32:28: note: 'CBManagerState' has been marked as being introduced in iOS 10.0 here, but the deployment target is iOS 9.0.0
    typedef NS_ENUM(NSInteger, CBManagerState) {
                               ^
    /Users/username/.pub-cache/git/flutter_blue-a7fa5410b66cabdc3f12e7d74375db3477a70c85/ios/Classes/FlutterBluePlugin.m:553:1: note: annotate 'toBluetoothStateProto:' with an availability attribute to silence this warning
    - (ProtosBluetoothState*)toBluetoothStateProto:(CBManagerState)state {
    ^
                                                                          API_AVAILABLE(ios(10.0))
    /Users/username/.pub-cache/git/flutter_blue-a7fa5410b66cabdc3f12e7d74375db3477a70c85/ios/Classes/FlutterBluePlugin.m:113:53: warning: values of type 'NSUInteger' should not be used as format arguments; add an explicit cast to 'unsigned long' instead [-Wformat]
        NSLog(@"getConnectedDevices periphs size: %lu", [periphs count]);
                                                  ~~~   ^~~~~~~~~~~~~~~
                                                  %lu   (unsigned long)
    /Users/username/.pub-cache/git/flutter_blue-a7fa5410b66cabdc3f12e7d74375db3477a70c85/ios/Classes/FlutterBluePlugin.m:78:37: warning: 'CBManagerStateUnsupported' is only available on iOS 10.0 or newer [-Wunguarded-availability]
        if(self.centralManager.state != CBManagerStateUnsupported && self.centralManager.state != CBManagerStateUnknown) {
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~
    In module 'CoreBluetooth' imported from /Users/username/.pub-cache/git/flutter_blue-a7fa5410b66cabdc3f12e7d74375db3477a70c85/ios/Classes/FlutterBluePlugin.h:10:
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.0.sdk/System/Library/Frameworks/CoreBluetooth.framework/Headers/CBManager.h:32:28: note: 'CBManagerState' has been marked as being introduced in iOS 10.0 here, but the deployment target is iOS 9.0.0
    typedef NS_ENUM(NSInteger, CBManagerState) {
                               ^
    /Users/username/.pub-cache/git/flutter_blue-a7fa5410b66cabdc3f12e7d74375db3477a70c85/ios/Classes/FlutterBluePlugin.m:78:37: note: enclose 'CBManagerStateUnsupported' in an @available check to silence this warning
        if(self.centralManager.state != CBManagerStateUnsupported && self.centralManager.state != CBManagerStateUnknown) {
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~
    /Users/username/.pub-cache/git/flutter_blue-a7fa5410b66cabdc3f12e7d74375db3477a70c85/ios/Classes/FlutterBluePlugin.m:78:95: warning: 'CBManagerStateUnknown' is only available on iOS 10.0 or newer [-Wunguarded-availability]
        if(self.centralManager.state != CBManagerStateUnsupported && self.centralManager.state != CBManagerStateUnknown) {
                                                                                                  ^~~~~~~~~~~~~~~~~~~~~

Missing isConnected value

Unhandled Exception: PlatformException(already_connected, connection with device already exists, null, null)

Notification

E/BpSurfaceComposerClient(17755): Failed to transact (-1)
E/BpSurfaceComposerClient(17755): Failed to transact (-1)
E/flutter (17755): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: PlatformException(set_notification_error, service (0000180f-0000-1000-8000-00805f9b34fb) could not be located on the device, null, null)
E/flutter (17755): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7)
E/flutter (17755): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:18)
E/flutter (17755): <asynchronous suspension>
E/flutter (17755): #2      BluetoothCharacteristic.setNotifyValue (package:flutter_blue/src/bluetooth_characteristic.dart:152:5)
E/flutter (17755): <asynchronous suspension>
E/flutter (17755): #3      DetailsPage.services.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:bluetooth/screens/details_page.dart:40:17)
E/flutter (17755): <asynchronous suspension>
E/flutter (17755): 

Example Android Build Fails with :flutter_blue:compileReleaseJavaWithJavac

See capture below. I've done some Googling but lost on this one. Build host is macOS. iOS and macOS builds and run fine.

I did find flutter/flutter#23131 (comment) and pauldemarco#346 but they are both very old and just suggest upgrading the Gradle version to a version already surpased or downgrading Flutter Blue.

An exception has occurred in the compiler (1.8.0_242-release). Please file a bug against the Java compiler via the Java bug reporting page (http://bugreport.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report. Thank you.
java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE (class com.sun.tools.javac.util.UnsharedNameTable$NameImpl)
        at com.sun.tools.javac.util.Assert.error(Assert.java:133)
        at com.sun.tools.javac.code.TypeAnnotations.annotationType(TypeAnnotations.java:231)
        at com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.separateAnnotationsKinds(TypeAnnotations.java:294)
        at com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.visitMethodDef(TypeAnnotations.java:1066)
        at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:778)
        at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
        at com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.scan(TypeAnnotations.java:275)
        at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
        at com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.visitClassDef(TypeAnnotations.java:1042)
        at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:693)
        at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
        at com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.scan(TypeAnnotations.java:275)
        at com.sun.tools.javac.code.TypeAnnotations$1.run(TypeAnnotations.java:127)
        at com.sun.tools.javac.comp.Annotate.flush(Annotate.java:152)
        at com.sun.tools.javac.comp.Annotate.enterDone(Annotate.java:129)
        at com.sun.tools.javac.comp.Enter.complete(Enter.java:512)
        at com.sun.tools.javac.comp.Enter.main(Enter.java:471)
        at com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:982)
        at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:857)
        at com.sun.tools.javac.main.Main.compile(Main.java:523)
        at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
        at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
        at org.gradle.internal.compiler.java.IncrementalCompileTask.call(IncrementalCompileTask.java:74)
        at org.gradle.api.internal.tasks.compile.AnnotationProcessingCompileTask.call(AnnotationProcessingCompileTask.java:94)
        at org.gradle.api.internal.tasks.compile.ResourceCleaningCompilationTask.call(ResourceCleaningCompilationTask.java:57)
        at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:55)
        at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:40)
        at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:97)
        at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:51)
        at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37)
        at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:51)
        at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:37)
        at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:46)
        at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:36)
        at org.gradle.api.internal.tasks.compile.CleaningJavaCompiler.execute(CleaningJavaCompiler.java:53)
        at org.gradle.api.internal.tasks.compile.incremental.IncrementalCompilerFactory.lambda$createRebuildAllCompiler$0(IncrementalCompilerFactory.java:98)
        at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:61)
        at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:45)
        at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:59)
        at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:51)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler.execute(CompileJavaBuildOperationReportingCompiler.java:51)
        at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:343)
        at org.gradle.api.tasks.compile.JavaCompile.performIncrementalCompilation(JavaCompile.java:237)
        at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:209)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction.doExecute(IncrementalInputsTaskAction.java:32)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:555)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:540)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:523)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:260)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$0(ExecuteStep.java:33)
        at java.util.Optional.map(Optional.java:215)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:42)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
        at java.util.Optional.map(Optional.java:215)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at java.util.Optional.orElseGet(Optional.java:267)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:187)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:179)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
        at java.lang.Thread.run(Thread.java:748)

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':flutter_blue:compileReleaseJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 37s
Running Gradle task 'assembleRelease'...                           38.5s
Gradle task assembleRelease failed with exit code 1

Example app is not working on macos

The example app is somewhat broken on macos.

The scan finds devices, but connection button is disabled for some of them and service UUIDs are somewhat off.

Example app running on Macos (note the service UUIDs)

image

Example app running on Android:

image

Add getUuids()

You should return the result of getUuids() during device discovery: failing this makes it practically impossible to decide which devices a particular use case scenario is interested in.

I'll try to come up with a PR but I had bad luck with protobuf generation on Windows earlier, this seems to be a recurring problem...

Cant find phones on scan result

I am trying to connect two phones through this library. I have two Pixel 4a phones which I am trying to connect to each other. But neither of them appear on the scan result. Is there something specific I need to do to make them visible, other than turning on the Bluetooth adapter?

Bonded devices

I have bonded and connected the device, when I try to discover services I got this in logs, but services areempty.

D/BluetoothManager(17755): getConnectedDevices
D/BluetoothGatt(17755): discoverServices() - device: C9:72:F0:C1:5D:AB
D/BluetoothGatt(17755): onSearchComplete() = Device=C9:72:F0:C1:5D:AB Status=0
D/FlutterBluePlugin(17755): [onServicesDiscovered] count: 6 status: 0

also got this.

E/flutter (17755): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: PlatformException(discover_services_error, no instance of BluetoothGatt, have you connected first?, java.lang.Exception: no instance of BluetoothGatt, have you connected first?
E/flutter (17755): 	at com.pauldemarco.flutter_blue.FlutterBluePlugin.locateGatt(FlutterBluePlugin.java:667)
E/flutter (17755): 	at com.pauldemarco.flutter_blue.FlutterBluePlugin.onMethodCall(FlutterBluePlugin.java:357)
E/flutter (17755): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/flutter (17755): 	at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84)
E/flutter (17755): 	at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865)
E/flutter (17755): 	at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter (17755): 	at android.os.MessageQueue.next(MessageQueue.java:325)
E/flutter (17755): 	at android.os.Looper.loop(Looper.java:142)
E/flutter (17755): 	at android.app.ActivityThread.main(ActivityThread.java:6494)
E/flutter (17755): 	at java.lang.reflect.Method.invoke(Native Method)
E/flutter (17755): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
E/flutter (17755): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
E/flutter (17755): , null)
E/flutter (17755): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7)
E/flutter (17755): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:18)
E/flutter (17755): <asynchronous suspension>
E/flutter (17755): #2      BluetoothDevice.discoverServices (package:flutter_blue/src/bluetooth_device.dart:79:5)
E/flutter (17755): <asynchronous suspension>
E/flutter (17755): 

With Android 12 not find all bluetooth devices

I tried this fork in my app and with your example with my Pixel 4 running Android 12 and scan results are quite less rather than pauldemarco plugin.
I found that the problem is on permissions: ble scan in Android 12 doesn't need permission for access_fine_location but if you don't allow this scanning lacks some devices.
I had modified AndroidManifest.xml in:

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

and giving manually location permission scan result is right.
Ble devices that is not recognized are some old Sensoro Beacons, maybe they will be never supported in Android 12.
Hope this helps.

BluetoothDeviceState return connected when device disconnected

Future<List> connectedDevices sometimes return the result with disconnected devices but show connected state, and when I want to discover services I got this:

E/flutter (17755): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: PlatformException(discover_services_error, no instance of BluetoothGatt, have you connected first?, java.lang.Exception: no instance of BluetoothGatt, have you connected first?
E/flutter (17755): 	at com.pauldemarco.flutter_blue.FlutterBluePlugin.locateGatt(FlutterBluePlugin.java:667)
E/flutter (17755): 	at com.pauldemarco.flutter_blue.FlutterBluePlugin.onMethodCall(FlutterBluePlugin.java:357)
E/flutter (17755): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/flutter (17755): 	at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84)
E/flutter (17755): 	at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865)
E/flutter (17755): 	at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter (17755): 	at android.os.MessageQueue.next(MessageQueue.java:325)
E/flutter (17755): 	at android.os.Looper.loop(Looper.java:142)
E/flutter (17755): 	at android.app.ActivityThread.main(ActivityThread.java:6494)
E/flutter (17755): 	at java.lang.reflect.Method.invoke(Native Method)
E/flutter (17755): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
E/flutter (17755): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
E/flutter (17755): , null)
E/flutter (17755): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7)
E/flutter (17755): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:18)
E/flutter (17755): <asynchronous suspension>
E/flutter (17755): #2      BluetoothDevice.discoverServices (package:flutter_blue/src/bluetooth_device.dart:79:5)
E/flutter (17755): <asynchronous suspension>
E/flutter (17755): 

deprecated API

this lib still up to date? I found the deprecated API, can you fix it?

.pub-cache\git\flutter_blue-a7fa5410b66cabdc3f12e7d74375db3477a70c85\android\src\main\java\com\pauldemarco\flutter_blue\FlutterBluePlugin.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
flutter_blue:
    git:
      url: https://github.com/boskokg/flutter_blue/
      ref: 0.13

I'm using flutter 3.3.4

The ios name is incorrect

The ios name is not accurate, similar to a cache problem. After the connection is successful, the user disconnects and scans the name again

pubspec setup in README.md

Thanks for maintaining this plugin. It might be worth adding the pubspec setup in the main README (not everybody is well aware on how to use git dependencies):

flutter_blue:
  git:
    url: https://github.com/boskokg/flutter_blue/
    ref: 0.11.0

(Yes I know I could de a PR but well...thanks in advance!)

Crash while scanning...

At this point this a blocking issue for me. The app is crashing without stopping in the debugger even when trying to catch all exceptions.

I updated to flutter 2.8 recently (I'm not sure if that matters)
Android Studio recently updated to 2020.3.1 Patch 4
Android minSdkVersion is 27
targetSdkVersion is 31 (or 30)

D/AndroidRuntime(17594): Shutting down VM
E/AndroidRuntime(17594): FATAL EXCEPTION: main
E/AndroidRuntime(17594): Process: com.apcon.intellaviewmobile, PID: 17594
E/AndroidRuntime(17594): java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission for android.content.AttributionSource@924379cb: AdapterService getRemoteName
E/AndroidRuntime(17594): at android.os.Parcel.createExceptionOrNull(Parcel.java:2425)
E/AndroidRuntime(17594): at android.os.Parcel.createException(Parcel.java:2409)
E/AndroidRuntime(17594): at android.os.Parcel.readException(Parcel.java:2392)
E/AndroidRuntime(17594): at android.os.Parcel.readException(Parcel.java:2334)
E/AndroidRuntime(17594): at android.bluetooth.IBluetooth$Stub$Proxy.getRemoteName(IBluetooth.java:3395)
E/AndroidRuntime(17594): at android.bluetooth.BluetoothDevice.getName(BluetoothDevice.java:1273)
E/AndroidRuntime(17594): at com.pauldemarco.flutter_blue.ProtoMaker.from(ProtoMaker.java:99)
E/AndroidRuntime(17594): at com.pauldemarco.flutter_blue.ProtoMaker.from(ProtoMaker.java:49)
E/AndroidRuntime(17594): at com.pauldemarco.flutter_blue.FlutterBluePlugin$2.onScanResult(FlutterBluePlugin.java:813)
E/AndroidRuntime(17594): at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$1.run(BluetoothLeScanner.java:531)
E/AndroidRuntime(17594): at android.os.Handler.handleCallback(Handler.java:938)
E/AndroidRuntime(17594): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(17594): at android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime(17594): at android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime(17594): at android.app.ActivityThread.main(ActivityThread.java:7839)
E/AndroidRuntime(17594): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(17594): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime(17594): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
I/Process (17594): Sending signal. PID: 17594 SIG: 9

% flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[โœ“] Flutter (Channel stable, 2.8.0, on macOS 12.0.1 21A559 darwin-x64, locale en-US)
[โœ“] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
[โœ“] Xcode - develop for iOS and macOS (Xcode 13.1)
[โœ“] Chrome - develop for the web
[โœ“] Android Studio (version 2020.3)
[โœ“] Android Studio (version 2020.3)
[โœ“] IntelliJ IDEA Ultimate Edition (version 2021.3)
[โœ“] IntelliJ IDEA Ultimate Edition (version 2021.3)
[โœ“] IntelliJ IDEA Ultimate Edition (version 2021.2.3)
[โœ“] VS Code (version 1.62.3)
[โœ“] Connected device (4 available)

โ€ข No issues found!

iOS BluetoothState.off initially even if bluetooth is on for version > 0.9.0

I get the wrong status initially on recent releases.
I need to toggle the BT off and on to get the correct status.

EDIT: This is for all releases after 0.9.0
Only change I can see that may be related is the update of RXDart to 0.27.
Since I'm having issues with state it is not unreasonable to suspect this is involved.

Tested on multiple iOS devices running 15.2, both under debugging and distributed.
Tested on Android and the issue is NOT reproduceable there.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.