boskokg / flutter_blue Goto Github PK
View Code? Open in Web Editor NEWThis project forked from pauldemarco/flutter_blue
Bluetooth plugin for Flutter
License: BSD 3-Clause "New" or "Revised" License
This project forked from pauldemarco/flutter_blue
Bluetooth plugin for Flutter
License: BSD 3-Clause "New" or "Revised" License
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) {
^~~~~~~~~~~~~~~~~~~~~
The device cannot be detected during the first ios scan
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.
The ios name is not accurate, similar to a cache problem. After the connection is successful, the user disconnects and scans the name again
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!
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):
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!)
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
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?
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.
Hey this fork seems great and almost upto date , can you please add it to Pub.dev , so that it will be easy to work with it
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.
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...
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):
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.
FlutterBluePlugin - case "connect" lack 'break'
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
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.
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):
Unhandled Exception: PlatformException(already_connected, connection with device already exists, null, null)
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?
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!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.