无需重启即可释放 Android 相机?

Posted

技术标签:

【中文标题】无需重启即可释放 Android 相机?【英文标题】:Release Android Camera without restart? 【发布时间】:2011-12-29 06:10:00 【问题描述】:

我目前正在尝试让相机在我的应用程序中正常工作,但我遇到了整个 camera.release() 的问题;我正在做相当复杂的事情,没有明确的方法可以简单地调用camera.release(),所以我必须不断尝试新的方法,但每次我出错时,我的应用程序都会崩溃(如预期的那样),导致相机没有释放。因此,为了能够再次测试我的应用程序,我需要重新启动手机以刷新相机。

有没有办法通过终端或DDMS释放相机,还是只有重启手机才能释放?它已经很老了,尤其是当一个小错误导致浪费时间等待我的手机重启时。

谢谢!

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

相机资源管理由安卓相机服务(libcameraservice.so)完成。 运行相机服务的进程是mediaserver。如果您重新启动媒体服务器,您将有效地释放所有相机锁定。

您必须具有 adb root 访问权限才能执行此操作。

运行 adb shell; su 以获取 root 命令提示符。

root@m0:/ # ps|grep media
media     1901  1     129268 6168  ffffffff 4026d470 S /system/bin/mediaserver
media_rw  1909  1     3064   1380  ffffffff 4015f1ac S /system/bin/sdcard
u0_a19    22821 1899  484316 21588 ffffffff 4016d574 S android.process.media
root@m0:/ # kill 1901
kill 1901

媒体服务器现在应该会自动启动。

Android 7.0

最新版本的 Android 将 mediaserver 二进制文件拆分为多个专用二进制文件,以帮助提高安全性。在official documentation 中阅读更多内容。

因此,您应该寻找cameraserver,而不是mediaserver。虽然没有测试。

【讨论】:

很好的答案!我有一台三星 Galaxy S3,自从切换到 Cyanogenmod 后,相机有时会出现“无法连接到相机错误”。您的解决方案使我无需重新启动整个手机即可让相机再次工作。我决定创建一个应用程序来自动执行此操作:play.google.com/store/apps/details?id=com.exlyo.camerarestarter我希望对其他人有所帮助:-) 有机会发布您的应用程序的源代码吗?怎么找到mediaserver进程的进程id? 我认为你可以解析 ps 输出。 “相机重启器”应用程序的完整源代码可在此处获得:github.com/androidseb/camerarestarter 看来这个解决方案在 CM 14 上不再适用了,有人有 CM 14 的解决方案吗?【参考方案2】:

我不确定是否有办法通过终端或 DDMS 重置摄像头,但我通过在我的 Activity 的 onPause() 方法中调用 Camera.release() 取得了很大成功,因此摄像头得到了每当应用程序进入后台时释放。同样,我的相机初始化都发生在onResume(),因此相机将在第一次运行时打开,然后在您的应用程序移入和移出后台时再次释放并重新初始化。这种技术完全消除了您为我描述的问题。

如果问题仍然存在,还可以考虑将可能崩溃的代码封装在 try/catch 中,您可以在其中捕获任何 Exception 并调用以释放该 catch 块中的摄像头。我通常使用这种技术来解决可以在不关闭应用程序的情况下消除的错误,但我相信它适用于所有情况。

【讨论】:

这很奇怪,在我重写 onPause() 以释放凸轮和 onPause 以打开凸轮后,每次在构建后启动应用程序时,我都会收到“无法连接到相机服务”。目前我只在surfaceDestroyed 回调中销毁相机,并且它大部分时间都运行良好。有时我确实会收到“无法连接到相机服务错误”,但很难弄清楚是什么时候/什么原因造成的。关于我可以寻找什么的任何提示?默默地失败不是一种选择,我确实需要手机可靠地拍照 如何初始化相机?在我的代码中,我调用camera.open,然后将我的Camera 对象传递给表面视图以调用setPreviewDisplaystartPreview。我不使用surfaceDestroyed 做任何事情,我完全在活动生命周期中管理相机,只需将引用传递给视图即可开始预览。这就是它对我的工作方式。 我明白了...我缺少 setPreviewDisplay。我刚刚从 SDK 中发现了 CameraPreview 示例,它已经像你提到的那样实现了。感谢您的提示 (+1) 没问题。要补充 SDK 示例,您可能需要查看开发人员文档中的 developer.android.com/guide/topics/media/camera.html 和 developer.android.com/training/camera/cameradirect.html。他们很好地解释了创建自定义相机的每个必要步骤,并且还提供了有用的代码存根,这可能比整个示例项目更容易解析。【参考方案3】:

我找到了解决这个问题的方法。设置----->应用程序----->管理应用程序----->相机--->清除数据,问题就解决了

【讨论】:

【参考方案4】:

这是一个安装UncaughtExceptionHandler 的解决方案: https://***.com/a/17336974/755804

当应用死机时它会释放相机。

【讨论】:

【参考方案5】:

我正在寻找类似的答案,我在下面找到了可以解决问题的帖子

Ideal way to set global uncaught exception Handler in Android

您可以在 UncaughtException 中释放相机

【讨论】:

这看起来很方便(+1),虽然我猜它更简洁,让应用程序紧凑/优雅地处理所有可能的错误。 是的!非常真实。理想情况下,我们不应该处理全局处理程序。

以上是关于无需重启即可释放 Android 相机?的主要内容,如果未能解决你的问题,请参考以下文章

无需预览即可捕获视频

相机打开时如何释放相机?

释放()异常后调用的方法无法使用android相机恢复

Android中的相机方向问题

Android SDK 相机 API 演示崩溃

无需重启即可安装 Jenkins 插件