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

如何为Flutter macOS应用授权访问摄像头与麦克风?

Flutter macOS端访问摄像头/麦克风的可行方案

针对你的场景,以下是两种可靠的实现方式,结合Agora SDK使用即可完成视频通话的权限处理:

一、使用支持macOS的PermissionHandler包

现在permission_handler的最新版本(v10.0.0及以上)已经支持macOS平台,步骤如下:

  1. 升级依赖:在pubspec.yaml中更新依赖:

    permission_handler: ^10.2.0 # 或更高版本
    

    执行flutter pub get完成安装。

  2. 配置macOS权限描述:打开macos/Runner/Info.plist,添加以下键值对(替换为符合你应用场景的权限说明):

    <key>NSCameraUsageDescription</key>
    <string>需要访问摄像头进行视频通话</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>需要访问麦克风进行语音通话</string>
    
  3. Flutter代码中申请权限:和iPad端逻辑一致,直接调用权限API:

    import 'package:permission_handler/permission_handler.dart';
    
    Future<void> requestPermissions() async {
      final cameraStatus = await Permission.camera.request();
      final micStatus = await Permission.microphone.request();
    
      if (cameraStatus.isGranted && micStatus.isGranted) {
        // 权限已获取,初始化Agora SDK
      } else {
        // 权限被拒绝,提示用户手动开启系统权限
      }
    }
    

二、通过Platform Channel调用原生AVFoundation框架

如果PermissionHandler存在兼容性问题,可以直接调用macOS原生API处理权限:

  1. 配置Info.plist:同方式一,先添加摄像头和麦克风的权限描述。

  2. macOS原生代码实现:打开macos/Runner/AppDelegate.swift,添加以下代码:

    import AVFoundation
    
    @objc class AppDelegate: FlutterAppDelegate {
      override func applicationDidFinishLaunching(_ aNotification: Notification) {
        let controller = window?.contentViewController as! FlutterViewController
        let permissionChannel = FlutterMethodChannel(
          name: "your.app.permission.channel",
          binaryMessenger: controller.binaryMessenger
        )
    
        permissionChannel.setMethodCallHandler { [weak self] call, result in
          switch call.method {
          case "requestCamera":
            self?.requestCameraPermission(result: result)
          case "requestMicrophone":
            self?.requestMicrophonePermission(result: result)
          default:
            result(FlutterMethodNotImplemented)
          }
        }
    
        super.applicationDidFinishLaunching(aNotification)
      }
    
      private func requestCameraPermission(result: @escaping FlutterResult) {
        let status = AVCaptureDevice.authorizationStatus(for: .video)
        switch status {
        case .authorized:
          result(true)
        case .notDetermined:
          AVCaptureDevice.requestAccess(for: .video) { granted in
            result(granted)
          }
        default:
          result(false)
        }
      }
    
      private func requestMicrophonePermission(result: @escaping FlutterResult) {
        let status = AVAudioSession.sharedInstance().recordPermission
        switch status {
        case .granted:
          result(true)
        case .undetermined:
          AVAudioSession.sharedInstance().requestRecordPermission { granted in
            result(granted)
          }
        default:
          result(false)
        }
      }
    }
    
  3. Flutter端调用:

    import 'package:flutter/services.dart';
    
    final _permissionChannel = MethodChannel('your.app.permission.channel');
    
    Future<bool> requestCamera() async {
      return await _permissionChannel.invokeMethod('requestCamera');
    }
    
    Future<bool> requestMicrophone() async {
      return await _permissionChannel.invokeMethod('requestMicrophone');
    }
    
    // 使用示例
    Future<void> setupPermissions() async {
      final cameraGranted = await requestCamera();
      final micGranted = await requestMicrophone();
      if (cameraGranted && micGranted) {
        // 初始化Agora SDK
      }
    }
    

注意事项

  • 若之前已拒绝权限,需引导用户到「系统偏好设置 > 安全性与隐私 > 摄像头/麦克风」中手动开启应用权限。
  • 确保你的Flutter项目已启用macOS支持,未启用的话执行flutter create --platforms=macos .添加平台。

内容的提问来源于stack exchange,提问作者Hassan Hammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:35:44