You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter InAppWebView库中调用getUserMedia()?

解决Flutter InAppWebView调用getUserMedia()的权限问题

1. 添加Android权限声明

在android/app/src/main/AndroidManifest.xml中添加相机、麦克风权限及硬件特性声明:

<!-- 基础权限(适用于Android 12及以下) -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

<!-- 硬件特性声明,可选但建议添加 -->
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

<!-- Android 13+ 细分权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

2. 动态请求运行时权限

Android 6.0及以上版本需要在运行时主动请求权限,推荐使用permission_handler库简化操作:
首先在pubspec.yaml添加依赖:

dependencies:
  permission_handler: ^10.2.0 # 可使用最新稳定版

然后在页面中请求权限:

import 'package:permission_handler/permission_handler.dart';

@override
void initState() {
  super.initState();
  _requestMediaPermissions();
}

Future<void> _requestMediaPermissions() async {
  final cameraPermission = await Permission.camera.request();
  final micPermission = await Permission.microphone.request();

  if (cameraPermission.isPermanentlyDenied || micPermission.isPermanentlyDenied) {
    // 权限被永久拒绝时,引导用户跳转到应用设置页开启权限
    await openAppSettings();
  }
}

3. 配置InAppWebView的权限回调

通过onPermissionRequest处理网页发起的权限请求,允许相机和麦克风访问:

InAppWebView(
  initialUrlRequest: URLRequest(url: Uri.parse("https://webrtc.github.io/samples/src/content/getusermedia/gum/")),
  initialOptions: InAppWebViewGroupOptions(
    crossPlatform: InAppWebViewOptions(
      mediaPlaybackRequiresUserGesture: false,
      javaScriptEnabled: true, // 显式启用JS,确保WebRTC脚本正常运行
    ),
    android: AndroidInAppWebViewOptions(
      useHybridComposition: true,
    ),
    ios: IOSInAppWebViewOptions(
      allowsInlineMediaPlayback: true,
    )
  ),
  onPermissionRequest: (controller, request) async {
    // 授予网页请求的相机/麦克风权限
    return PermissionResponse(
      resources: request.resources,
      action: PermissionResponseAction.GRANT,
    );
  },
)

关键注意点

  • 你遇到的SecurityException核心原因是应用未获取相机权限,必须先完成权限声明和动态请求。
  • mediaPlaybackRequiresUserGesture: false是必要配置,否则WebView会阻止相机预览等媒体自动加载。
  • 若不想使用第三方权限库,也可通过Flutter原生MethodChannel实现Android权限请求逻辑。

内容的提问来源于stack exchange,提问作者Huu Bao Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:25:09