From 4f697ca8670d43034b9171be9c29a9678d8709f8 Mon Sep 17 00:00:00 2001 From: CloudWebRTC Date: Thu, 11 May 2023 17:29:33 +0800 Subject: [PATCH] fix bluetooth device enumerate. (#281) * fix bluetooth device enumerate. * update README.md * dart format. * revert pubspec.yaml. * fix analyzer. --- README.md | 25 ++++++++++++++++++ analysis_options.yaml | 2 -- example/analysis_options.yaml | 4 +-- .../android/app/src/main/AndroidManifest.xml | 1 + example/lib/pages/connect.dart | 26 +++++++++++++++++++ example/lib/widgets/controls.dart | 4 +-- example/pubspec.yaml | 1 + 7 files changed, 57 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 90e81c1..05e0049 100644 --- a/README.md +++ b/README.md @@ -117,11 +117,36 @@ We require a set of permissions that need to be declared in your `AppManifest.xm + ... ``` +For using the bluetooth headset correctly on the android device, you need to add `permission_handler` to your project. +And call the following code after launching your app for the first time. + +```dart +import 'package:permission_handler/permission_handler.dart'; + +Future _checkPremissions() async { + var status = await Permission.bluetooth.request(); + if (status.isPermanentlyDenied) { + print('Bluetooth Permission disabled'); + } + status = await Permission.bluetoothConnect.request(); + if (status.isPermanentlyDenied) { + print('Bluetooth Connect Permission disabled'); + } +} + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await _checkPremissions(); + runApp(MyApp()); +} +``` + ### Desktop support In order to enable Flutter desktop development, please follow [instructions here](https://docs.flutter.dev/desktop#set-up). diff --git a/analysis_options.yaml b/analysis_options.yaml index ab39238..52d7a49 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -19,8 +19,6 @@ analyzer: # https://dash-overflow.net/articles/getting_started/#step-3-disabling-_implicit-dynamic_--_implicit-cast_ # strong-mode: - implicit-casts: false - implicit-dynamic: false # # exclude protobuf files diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml index 8c01024..6ebd7a8 100644 --- a/example/analysis_options.yaml +++ b/example/analysis_options.yaml @@ -19,8 +19,6 @@ analyzer: # https://dash-overflow.net/articles/getting_started/#step-3-disabling-_implicit-dynamic_--_implicit-cast_ # strong-mode: - implicit-casts: false - implicit-dynamic: false # # exclude protobuf files @@ -44,3 +42,5 @@ linter: # Turn off avoid_print for example projects # avoid_print: false + depend_on_referenced_packages: false + use_build_context_synchronously: false diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index a7ac49c..2a33adb 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + diff --git a/example/lib/pages/connect.dart b/example/lib/pages/connect.dart index e0684bb..1b02609 100644 --- a/example/lib/pages/connect.dart +++ b/example/lib/pages/connect.dart @@ -3,6 +3,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:livekit_client/livekit_client.dart'; import 'package:livekit_example/widgets/text_field.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:permission_handler/permission_handler.dart'; import '../exts.dart'; import 'room.dart'; @@ -42,6 +43,9 @@ class _ConnectPageState extends State { void initState() { super.initState(); _readPrefs(); + if (lkPlatformIs(PlatformType.android)) { + _checkPremissions(); + } } @override @@ -51,6 +55,28 @@ class _ConnectPageState extends State { super.dispose(); } + Future _checkPremissions() async { + var status = await Permission.bluetooth.request(); + if (status.isPermanentlyDenied) { + print('Bluetooth Permission disabled'); + } + + status = await Permission.bluetoothConnect.request(); + if (status.isPermanentlyDenied) { + print('Bluetooth Connect Permission disabled'); + } + + status = await Permission.camera.request(); + if (status.isPermanentlyDenied) { + print('Camera Permission disabled'); + } + + status = await Permission.microphone.request(); + if (status.isPermanentlyDenied) { + print('Microphone Permission disabled'); + } + } + // Read saved URL and Token Future _readPrefs() async { final prefs = await SharedPreferences.getInstance(); diff --git a/example/lib/widgets/controls.dart b/example/lib/widgets/controls.dart index a4a6de1..0fe13c2 100644 --- a/example/lib/widgets/controls.dart +++ b/example/lib/widgets/controls.dart @@ -276,6 +276,7 @@ class _ControlsWidgetState extends State { return [ PopupMenuItem( value: null, + onTap: isMuted ? _enableAudio : _disableAudio, child: const ListTile( leading: Icon( EvaIcons.micOff, @@ -283,7 +284,6 @@ class _ControlsWidgetState extends State { ), title: Text('Mute Microphone'), ), - onTap: isMuted ? _enableAudio : _disableAudio, ), if (_audioInputs != null) ..._audioInputs!.map((device) { @@ -358,6 +358,7 @@ class _ControlsWidgetState extends State { return [ PopupMenuItem( value: null, + onTap: _disableVideo, child: const ListTile( leading: Icon( EvaIcons.videoOff, @@ -365,7 +366,6 @@ class _ControlsWidgetState extends State { ), title: Text('Disable Camera'), ), - onTap: _disableVideo, ), if (_videoInputs != null) ..._videoInputs!.map((device) { diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 7ab056a..59df3a8 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: intl: ^0.17.0 flutter_background: ^1.1.0 + permission_handler: ^10.2.0 provider: ^6.0.1 logging: ^1.0.1 shared_preferences: ^2.0.7