屏幕保护程序结束后音频继续播放

如何解决屏幕保护程序结束后音频继续播放

我正在开发带有(可选)音频的屏幕保护程序。但是每当我通过滑动鼠标将其停用时,音频会继续播放几秒钟。但是,在系统首选项中单击预览时不会发生这种情况。我的理论是,在预览中移动鼠标时,屏幕保护程序进程会立即被终止,但当它没有将其作为预览运行时则不会。有没有办法通过运行一个函数来感知鼠标活动并自己停止音频? 我在下面提供了一些代码https://gist.github.com/MaxTechnics/3d4280fabc4da53b6df1022864d1bf23 如果需要,将提供更多。提前致谢!

更新:这是我认为问题的主要部分,因为音频永远不会及时停止

// MARK: - Lifecycle
extension VideoView {
    
    override func startAnimation() {
        super.startAnimation()
        manager.player.play()
    }
    
    override func stopAnimation() {
        super.stopAnimation()
        manager.player.pause()
    }
}

解决方法

经过一番折腾,虽然我们无法拦截键盘(也不应该可靠地检测到退出),但实际上可以在屏幕保护程序中收听一些分布式通知,告诉我们用户何时登录,并使用调用我们的代码来停止动画/声音,因为在我们被有效杀死的那一刻和用户回到桌面的那一刻之间存在相当大的延迟。

我确实在此答案中找到了一些事件:Monitoring Screensaver Events in OSX,虽然有些过时,但这些事件仍然会被触发,并且可以在屏幕保护程序内拦截,尽管存在沙盒。我确实发现了一些新的,尽管它们可能对其他目的很有趣。

无论如何,这对我有用:

class AerialView: ScreenSaverView {
    ...
    func setNotifications {
        DistributedNotificationCenter.default.addObserver(self,selector: #selector(AerialView.willStop(_:)),name: Notification.Name("com.apple.screensaver.willstop"),object: nil)
    }

    @objc func willStop(_ aNotification: Notification) {
        NSLog("############ willStop")
        // Put your stop audio/animation code here
    }
}

(您必须自己调用 setNotifications 或将该代码放在其他地方)。

实际上,当屏幕保护程序退出时,有多个事件一个接一个地触发:

  • com.apple.screensaver.willstop
  • com.apple.screensaver.didstop
  • com.apple.screenIsUnlocked
  • com.apple.screenLockUIIsShown

这是这些事件的一些日志

2021-04-27 14:52:00.564 : ############ screenLockUIIsShown
2021-04-27 14:52:01.873 : ############ screenIsUnlocked
2021-04-27 14:52:01.873 : ############ willStop
2021-04-27 14:52:01.879 : ############ didStop

第一个事件是当我按下一个键时,大约 1.5 秒后手表解锁解锁屏幕,您可以看到连续触发 3 个事件。

在这种情况下,屏幕保护程序的实际终止仅发生在 14:52:07。

为了完整起见,一些新事件用于检测登录 UI 何时启动和关闭(可能对其他一些事情有用)。这是在 11.4 中,我不知道这些事件是否在以前版本的 macOS 中被触发。按发射顺序:

  • com.apple.shieldWindowRaised
  • com.apple.screenIsLocked
  • com.apple.screenLockUIIsShown
  • com.apple.screenLockUIIsHidden
  • com.apple.shieldWindowLowered
  • com.apple.screenIsUnlocked

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?