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