Flutter使用flutter_windowmanager停录屏后仍录制音频问题
解决flutter_windowmanager禁用录屏后音频仍录制的问题
flutter_windowmanager的核心是给Android设置FLAG_SECURE、iOS监听录屏状态来隐藏画面,但这个插件只管画面,不管音频,这就是你遇到黑屏但音频还在录、停录后音频没停的原因。下面分平台给你解决办法:
Android端处理
- 用AudioManager抢占音频焦点,阻止其他应用录音
打开Android项目的MainActivity.kt(如果是Java就改MainActivity.java),添加以下代码:
页面销毁时记得释放焦点,避免影响其他应用:val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager // 申请独占式音频焦点,让录音类应用拿不到权限 val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) .setAudioAttributes(AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build()) .setOnAudioFocusChangeListener { /* 焦点变化时可做额外处理,比如暂停音频 */ } .build() audioManager.requestAudioFocus(focusRequest)override fun onDestroy() { super.onDestroy() audioManager.abandonAudioFocusRequest(focusRequest) } - 别忘了在
AndroidManifest.xml加权限:<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
iOS端处理
iOS上可以监听系统的录屏状态通知,动态控制音频:
- 在iOS项目的
AppDelegate.swift里加监听:override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 监听录屏状态变化 NotificationCenter.default.addObserver(self, selector: #selector(screenCaptureStateChanged), name: UIScreen.capturedDidChangeNotification, object: nil) return true } @objc private func screenCaptureStateChanged() { let isCapturing = UIScreen.main.isCaptured // 这里拿到录屏状态后,要么静音音频,要么暂停播放 // 如果你用的是Flutter音频插件,也可以通过MethodChannel把状态传给Flutter层处理 if isCapturing { // 静音示例 yourAudioPlayer?.volume = 0 } else { yourAudioPlayer?.volume = 1.0 } } - 如果要在Flutter层处理,就建个MethodChannel传状态:
Flutter代码示例:final MethodChannel _screenChannel = MethodChannel('screen_capture_channel'); bool _isCapturing = false; @override void initState() { super.initState(); _screenChannel.setMethodCallHandler((call) async { if (call.method == 'onCaptureStateChanged') { setState(() { _isCapturing = call.arguments as bool; }); // 用你自己的音频控制器调整音量或播放状态 if (_isCapturing) { audioPlayer.setVolume(0); } else { audioPlayer.setVolume(1.0); } } }); }
关键提醒
- 不管Android还是iOS,flutter_windowmanager都只处理画面防录制,音频是独立的,必须单独处理。
- 停止录屏后音频没停,是因为你没监听录屏结束的事件,一定要在录屏状态变化时同步调整音频,而不是只在开启禁用时做一次处理。
- 测试时注意版本兼容性:Android 11+权限更严,iOS 14+对录屏监听的权限也有调整,必要时要动态申请相关权限。
内容的提问来源于stack exchange,提问作者Abdallah Yassein
相关产品推荐
相关产品推荐

