Flutter предоставляет разрешения для камеры и микрофона после нажатия кнопки или при включенном событии

#flutter #webview #android-permissions

#трепетать #веб-просмотр #android-разрешения #flutter #webview

Вопрос:

У меня есть требование предоставлять разрешения на камеру и микрофон одним нажатием кнопки. Я хочу, чтобы мои разрешения отображались одно за другим, но в этом случае отображается только разрешение микрофона. Чтобы дать разрешение для камеры, я должен снова нажать на кнопку.

Как я могу этого добиться?

             import 'package:flutter/material.dart';
            import 'package:flutter_inappwebview/flutter_inappwebview.dart';
            import 'package:permission_handler/permission_handler.dart';

            class IframeScreen extends StatefulWidget {
            @override
           _IframeScreenState createState() => _IframeScreenState();
             }

             class _IframeScreenState extends State<IframeScreen> {
              InAppWebViewController _webViewController;

              Future webViewMethod() async {
              print('In Microphone permission method');
              WidgetsFlutterBinding.ensureInitialized();
            
              Permission.microphone.request();
              WebViewMethodForCamera();

             }
              Future WebViewMethodForCamera() async{
               print('In Camera permission method');
               WidgetsFlutterBinding.ensureInitialized();
               Permission.camera.request();
              }



            @override
            Widget build(BuildContext context) {
            return Scaffold(
            appBar: AppBar(
            title: Text('Check this frame'),
           ),
             body: Column(
      children: <Widget>[
        RaisedButton(
          onPressed: webViewMethod,
          child: Text('Join'),
          textColor: Colors.black,
        ),

        Expanded(
          child: Container(
            child: InAppWebView(
                initialUrl: "https://appr.tc/r/158489234",
                initialOptions: InAppWebViewGroupOptions(
                  crossPlatform: InAppWebViewOptions(
                    mediaPlaybackRequiresUserGesture: false,
                    debuggingEnabled: true,
                  ),
                ),
                onWebViewCreated: (InAppWebViewController controller) {
                  _webViewController = controller;
                },
                androidOnPermissionRequest: (
                    InAppWebViewController controller, String origin,
                    List<String> resources) async {
                  return PermissionRequestResponse(resources: resources,
                      action: PermissionRequestResponseAction.GRANT);
                }
            ),
          ),
        )

      ],
    )
);
  

}
}

Ответ №1:

Вы можете скопировать вставить запустить полный код ниже,
вы можете дождаться Permission.microphone.request(); и await Permission.camera.request();
фрагмент кода

 Future webViewMethod() async {
    print('In Microphone permission method');
    //WidgetsFlutterBinding.ensureInitialized();

    await Permission.microphone.request();
    WebViewMethodForCamera();

  }
  
Future WebViewMethodForCamera() async{
    print('In Camera permission method');
    //WidgetsFlutterBinding.ensureInitialized();
    await Permission.camera.request();
}
  

рабочая демонстрация

введите описание изображения здесь

полный код

 import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:permission_handler/permission_handler.dart';

class IframeScreen extends StatefulWidget {
  @override
  _IframeScreenState createState() => _IframeScreenState();
}

class _IframeScreenState extends State<IframeScreen> {
  InAppWebViewController _webViewController;

  Future webViewMethod() async {
    print('In Microphone permission method');
    //WidgetsFlutterBinding.ensureInitialized();

    await Permission.microphone.request();
    WebViewMethodForCamera();

  }
  Future WebViewMethodForCamera() async{
    print('In Camera permission method');
    //WidgetsFlutterBinding.ensureInitialized();
    await Permission.camera.request();
  }



  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Check this frame'),
        ),
        body: Column(
          children: <Widget>[
            RaisedButton(
              onPressed: webViewMethod,
              child: Text('Join'),
              textColor: Colors.black,
            ),

            Expanded(
              child: Container(
                child: InAppWebView(
                    initialUrl: "https://appr.tc/r/158489234",
                    initialOptions: InAppWebViewGroupOptions(
                      crossPlatform: InAppWebViewOptions(
                        mediaPlaybackRequiresUserGesture: false,
                        debuggingEnabled: true,
                      ),
                    ),
                    onWebViewCreated: (InAppWebViewController controller) {
                      _webViewController = controller;
                    },
                    androidOnPermissionRequest: (
                        InAppWebViewController controller, String origin,
                        List<String> resources) async {
                      return PermissionRequestResponse(resources: resources,
                          action: PermissionRequestResponseAction.GRANT);
                    }
                ),
              ),
            )

          ],
        )
    );
  } }

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(       
        primarySwatch: Colors.blue,       
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: IframeScreen(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {     
      _counter  ;
    });
  }

  @override
  Widget build(BuildContext context) {    
    return Scaffold(
      appBar: AppBar(       
        title: Text(widget.title),
      ),
      body: Center(        
        child: Column(          
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
  

Комментарии:

1. Рад помочь. пожалуйста, отметьте это как ответ, если это вам поможет. Спасибо.

2. @chunhunghan. Я использую InAppWebView для загрузки файла, но не могу загрузить изображение. Я могу выбрать изображение с устройства, но не могу загрузить его, потому что оно продолжает загружаться. Есть ли какие-то дополнительные разрешения, которые мне нужно предоставить в Android?

3. @utkarsh, не могли бы вы опубликовать свой код воспроизведения для нового вопроса? Спасибо.

Ответ №2:

Попытка

 await WebViewMethodForCamera();