检测其他应用何时尝试使用相机

Posted

技术标签:

【中文标题】检测其他应用何时尝试使用相机【英文标题】:Detect when another app tries to use the camera 【发布时间】:2016-11-25 05:17:31 【问题描述】:

我们的应用程序作为后台服务运行,不断从前置摄像头获取图像,然后对图像进行处理。但是,当用户尝试打开另一个使用摄像头的应用时,会发生两种情况:新应用崩溃而我们的应用继续运行,或者我们的崩溃而新应用可以访问摄像头。

现在,如果我们的应用程序失去对摄像头的控制,我们可以捕获一个异常,然后我们可以开始尝试访问它,直到我们获得访问权并且一切恢复正常。

问题是当其他应用程序因为我们的而崩溃时。有什么方法可以检测到这一点,所以我们可以暂停我们的应用,直到我们可以再次访问相机?

【问题讨论】:

相关question 【参考方案1】:

这是因为相机是专有资源。

我建议你阅读Camera documentation,上面写着:

如果您的应用程序没有正确释放相机,所有 随后尝试访问相机,包括您自己的尝试 应用程序,将失败,并可能导致您或其他应用程序 关闭。

【讨论】:

我们的应用需要不断地访问相机。我们希望在另一个应用程序尝试使用它时释放它,因为现在其他应用程序只是崩溃而没有通知用户原因(尽管有些手机会通知甚至将我们的应用程序从后台带到前台)。不断释放,进行我们的分析,然后再次打开相机会太慢(相机打开的快速测试大约需要 350 毫秒。应用程序需要以至少 15 fps 的速度运行,但 20+ 会很好) 为什么在您的应用未打开时需要相机访问权限?可以在 onpause 方法中释放相机,然后在 onresume 方法中重新初始化。 应用程序抛出 RuntimeException 如果打开相机失败,无论出于何种原因。有一个代码here 可能有用。 @drew 我们的应用程序会监控司机,分析面部,并在司机分心或睡觉时触发警告。司机可能想查看时间或接听电话,但我们的应用程序必须继续运行,否则每次他完成任何导致应用程序暂停的操作时,我们都会强制他重新启动我们的应用程序。所以它在后台运行,始终分析并始终使用相机。但是,如果司机决定使用摄像头(他在开车时确实不应该这样做,但这不是我们能控制的),那么我们必须暂停我们的应用程序。 @JeanVitor 问题是关于检测另一个应用程序何时尝试打开我们的应用程序当前正在使用的相机。【参考方案2】:

很遗憾,Camera API 或 android SDK 通常不提供此类信息。好消息是,越来越多的新设备让你可以独立打开前置和后置摄像头。这可以降低发生冲突的可能性。

根据您的描述,让与您的应用程序竞争访问相机的应用程序崩溃可能是合法的,但是,除了开玩笑之外,您对此无能为力。没有正确检查 RuntimeException 是他们的错。

Android 最近加强了应用之间的隔离,因此可能无法跟踪启动了哪些应用(请参阅App to monitor other apps on android),除非您的应用具有系统权限。

【讨论】:

以上是关于检测其他应用何时尝试使用相机的主要内容,如果未能解决你的问题,请参考以下文章

检测相机的主动使用

Swift - 检测应用程序何时发送到后台而不是设备锁定时

检测内存入侵

是否可以检测浏览器何时使用后备字体而不是 CSS 中指定的主要字体?

iOS:确定相册中的照片是不是来自相机

谷歌移动视觉api相机源暗帧