【问题标题】:Application hangs / freeze when using camera.open() - Restart of device needed使用 camera.open() 时应用程序挂起/冻结 - 需要重新启动设备
【发布时间】:2013-07-15 13:10:03
【问题描述】:

我的应用很基础很简单,只需要打开相机(连图片都不显示,我注释了代码)

所以,基本上,我有类似的东西:

@Override
public void onResume() {
    super.onResume();
    if (camera != null) {
        //Just to be sure
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        camera = null;
    }

    Log.e("DebugCam", "Before");
    camera = Camera.open();
    Log.e("DebugCam", "After");
}

@Override
protected void onPause() {
    super.onPause();
    if (camera != null) {
        camera.stopPreview();
        camera.release();
        camera = null;
    }
}

但我的 logcat 只显示第一条消息:

Before

应用刚刚挂起,我必须重启设备才能让它再次工作!!!

我真的不明白问题出在哪里,或者我如何才能至少避免真正烦人的冻结。

我真的不明白如何调试这个......

编辑:我在 Android 错误跟踪中看到了这一点,听起来我需要一个解决方法,因为补丁于 6 月发布) https://code.google.com/p/android/issues/detail?id=1578

【问题讨论】:

  • 手机没有重启。手机不是 Galaxy(索尼和阿尔卡特)
  • 除了应用程序之外,您的设备相机在正常打开相机或拍照时会这样吗?
  • 官方 Android 错误跟踪器中接受的错误使我得出结论,某些应用程序是有罪的。一旦发生这种情况,即使是官方相机应用程序也会冻结,但我无法在其他应用程序上重现此错误,可能是因为我每天调试我的应用程序 50 次,并且无法多次使用其他应用程序
  • 在拍照前删除预览回调,如 camera.setPreviewCallback(null); camera.takePicture(null, null, yourPictureCallback);还有一件事,通过谷歌搜索,我发现即使您的代码正常,previewCallback 有时也会导致问题。如果您的示例应用程序不是必须的,那么请尽量避免它。

标签: android camera freeze


【解决方案1】:

我想总结一下我设法找到的有关该问题的所有信息。

我做了一些研究,在DroidForums

他们在那里发现,是 SD 卡导致了冻结(我不确定现在是否是这种情况,但如果有人可以尝试一下就好了),这是那里的引述:

我的相机和摄像机像许多其他人一样冻结,并且 我很沮丧..在我手中我有我的“像新”手机希望 会有所帮助...没有这样的运气...弄清楚它是什么...SDHC卡! 卡的简单格式和问题消失了..自己测试一下 转到您的主要设置并卸载SD卡,然后重新启动 相机应用程序,看看它是否不会冻结...如果它不喜欢我的不 那么你有你的答案......不完全确定我的 SDHC 卡上有什么 导致这个......仍在调查中,但肯定是什么 那里...当我确切地了解其他人的内容时,我会更新

希望这会有所帮助,并感谢所有我使用的许多技巧 这个论坛...

更新!!!

我的新 Gingerbread 手机又出现了同样的问题 我尝试了一些新的东西......只需将一些照片和视频移开 手机并将它们备份到PC......就像一个魅力......不需要 格式化整个卡,只需给相机/摄像机应用程序一些空间..as 如果 5.5GB 还不够,但谁知道呢……现在视频只需要 1/2 第二次保存,相机又可以正常工作了……只是想我会 让大家知道..

一般来说,有时(或在大多数情况下)内存卡似乎会导致问题,所以如果您可以格式化您正在使用的卡或用新卡替换它,您可以查看是否是问题。

此外,关于记录在here 的官方错误(如您所述): 显然测试用例与您在此处提供的测试用例相同,因为使用 Camera.open() 的应用程序在完全相同的地方遇到了问题。

从那里引用:

显然,Camera.open() 本身挂起而没有引起任何异常, 这样我就没有什么可以捕捉和采取行动的了。那我可以 也不要使用内置的相机应用程序,因为它只提供黑色预览 屏幕和稍后一条关于我尝试时无响应的消息 与它互动。因为在上面的代码中 sn-p 是 已经为空(在程序启动时),我无能为力 发布:没有 camera.release()。

很好,这个问题在最新版本中得到了修复,几天前有一条评论(最后一条,来自 2013 年 7 月 15 日):

感谢您的错误修正,但是否有针对旧设备的解决方法 比 2013 年 6 月 22 日补丁发布时(这意味着 4.2.2 之后 2013年2月发布...)

希望我们能在这方面得到更新,所以希望我们能在那里听到有关旧 API 的消息。

我还找到了here 的帖子(再次提到 SD 卡问题;那里没有太多信息,但无论如何):

从那里引用:

找到了解决办法:我删除了图片文件夹中的缩略图 我的 SD 卡并重新启动手机。看来小 缩略图窗口,指示最后一个镜头负责 应用程序崩溃,由于某种原因,拇指无法加载并且 应用程序崩溃了。

然后,xda-Developers 上有this thread 名为“4.2 Android camera APK FIX!” (不要激动,这仅适用于 ROOTED 设备 :-( ):

从线程中获取的快速说明:

相机 apk: http://db.tt/xmpgkZIA

先安装相机apk后将此apk添加到系统/应用程序仅适用于 手动的。 http://db.tt/OZF6D8fL

这是将它们放在系统/lib 修复权限上的 lib 文件,然后重新启动。 http://db.tt/73lcCrcl http://db.tt/wQ7bfR8N

对于那些设备不支持的,更改以下行 build.prop 并重启:

ro.product.model=Galaxy Nexus ro.product.brand=google

接下来(只是为了向广大公众提及),我在AndroidCentral 中找到了这个,只是为了它,它再次是针对已root 设备的“修复”。

在 sebertech 网站上,我发现这个帖子是关于 Galaxy S3 的相机问题,主要是 TouchWix - LINK

对于受到性能问题困扰的 Galaxy S3 机型, 生根是解决这些问题的第一步。但你必须 考虑到所涉及的风险,尽管已经有 扎根手机的安全方法。但在你真正决定做之前 那,我有些事情想让你试试。

  1. 召回您最近安装的应用程序,尝试禁用它们并 看看你的手机性能有没有提升。一些 真正繁重的应用程序甚至可能导致或促成了 问题。
  2. 尝试通过转到主屏幕并按住来清除内存 主页按钮。正在运行或最近打开的应用程序列表将 节目;您只需向左或向右滑动即可关闭它们。我很漂亮 确定你已经知道运行这么多应用程序的影响 背景。

限制 Galaxy S3 进程

  1. 在主屏幕中,按菜单按钮并选择设置。
  2. 向下滚动并点击开发人员选项。
  3. 找到“限制后台进程”选项并点击它。
  4. 将 Galaxy S3 限制为一次运行大约 4 个进程,或者更少。

清除 TouchWiz 的数据

  1. 在主屏幕中,点击菜单按钮。
  2. 选择系统设置,然后选择应用程序管理器
  3. 向下滚动找到 TW 并点按清除数据。

如果没有其他办法,也许是时候根您的设备并使用 更轻、更快的自定义 ROM,并摆脱了 TouchWiz UI。

最后,为了完成这个冗长的答案,我想说的是,即使我发现很少有修复/解决方法,我真的希望 Official Bug Fix(再次链接,以便让这个东西被引用一次更多)将被广泛使用,不仅适用于 4.x.x 版本的 Android,很遗憾我们没有适用于旧版本(无论如何,旧 API 的错误修复有什么关系?)。

【讨论】:

    【解决方案2】:

    试试这个:

      @Override
     public void onResume() {
    super.onResume();
    if (camera != null) {
        //Just to be sure
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        camera = null;
    }
    
    Log.e("DebugCam", "Before");
    try {
        camera = Camera.open();// this is no safe way to open the camera
    }catch(Exception e)
    {
      e.printStackTrace();//get the exception on Logcat
    }
    Log.e("DebugCam", "After");
    }
    

    直接来自 DOCS

    /** 获取 Camera 对象实例的安全方法。 */

    public static Camera getCameraInstance(){
    Camera c = null;
    try {
        c = Camera.open(); // attempt to get a Camera instance
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
    }
    return c; // returns null if camera is unavailable
    }
    

    看这个:http://developer.android.com/guide/topics/media/camera.html#custom-camera

    【讨论】:

    • 没有抛出异常...还是同样的问题
    • @waza_be 而不是catch(Exception e) 试试catch (Throwable throwable),也许你可以抓住一个Throwable
    【解决方案3】:

    我遇到了类似的问题,这对我有用:

    显然,这个回调会阻塞缓冲区,其中包含相机预览每一帧的数据。

    camera.setPreviewCallback(new PreviewCallback() {
          public void onPreviewFrame(byte[] data, Camera arg1) {
          //invalidate surfaceview
          }
    });
    

    删除回调对我有用。希望能帮助到你。 :)

    【讨论】:

    • 我应该做些什么“使surfaceview无效”是什么意思,或者没有代码确实无效?
    • 在回调中什么也不做。
    • 同样的问题,我把这段代码放在 onPause 和 onResume 上,在打开相机之前。同样的冻结...
    【解决方案4】:

    问题与你手机上安装的更新ROM数据有关,除非你更新你手机里的ROM,否则没有办法。

    【讨论】:

      【解决方案5】:

      如果您的要求只是打开相机,我将使用以下代码
      Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, actionCode);
      为此,您需要此 final static int actioncode=100; 作为类变量

      【讨论】:

        【解决方案6】:

        在您的onPause 中,从frameLayout 中删除您的SurfaceView,例如:

        @Override
        protected void onPause() {
            super.onPause();
            if (camera != null) {
                camera.stopPreview();
                camera.setPreviewCallback(null);
                camera.release();
                camera = null;
        
                preview.removeView(mPreview);  //here preview is FrameLayout and mPreview is your camera SurfaceView.
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          • 2020-12-08
          • 1970-01-01
          • 2019-05-19
          • 1970-01-01
          • 1970-01-01
          • 2021-04-25
          相关资源
          最近更新 更多