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

Flutter使用flutter_windowmanager停录屏后仍录制音频问题

解决flutter_windowmanager禁用录屏后音频仍录制的问题

flutter_windowmanager的核心是给Android设置FLAG_SECURE、iOS监听录屏状态来隐藏画面,但这个插件只管画面,不管音频,这就是你遇到黑屏但音频还在录、停录后音频没停的原因。下面分平台给你解决办法:

Android端处理

  1. 用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)
    }
    
  2. 别忘了在AndroidManifest.xml加权限:
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    

iOS端处理

iOS上可以监听系统的录屏状态通知,动态控制音频:

  1. 在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
        }
    }
    
  2. 如果要在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:56:15