使用camera.open()时应用程序挂起/冻结 - 需要重启设备

时间:2013-07-15 13:10:03

标签: android camera freeze

我的应用程序非常简单,我只需要打开相机(甚至不显示图像,我对代码进行了评论)

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

@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

6 个答案:

答案 0 :(得分:3)

首先,我想说的是,我并不是在寻求投票或声誉等等,而是想总结一下我能找到的有关这个问题的所有信息,所以请不要&# 39;太苛刻了: - )。

我做了一些研究,我在DroidForums找到了一个关于类似问题的有趣且可能不那么紧密相关的帖子:

他们在那里发现,SD卡正在造成冻结(我不确定现在是不是这样,但如果有人可以尝试的话会很好),而且这里'从那里引用:

  

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

     

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

     

UPDATE !!!

     

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

一般情况下,存储卡似乎有时(或在大多数情况下)会导致问题,因此如果您可以格式化您正在使用的存储卡或将其替换为新存储卡,您可以看到这就是问题所在。

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

从那里引用:

  

显然,Camera.open()本身会挂起而不会导致任何异常,   这样我就没有任何东西可以陷阱并采取行动。我可以   也不使用内置的相机应用程序,因为它只提供黑色预览   屏幕和稍后一条关于我尝试时没有反应的消息   与它互动。因为在上面的代码片段中   已经为null(在程序启动时),我无能为力   发布:没有camera.release()。

很高兴在最新版本中修复了这个问题,而且几天前有评论(最后一个是2013年7月15日):

  

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

希望我们能够对此进行更新,所以我们希望我们能够在那里听到有关旧API的新闻。

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

从那里引用:

  

解决方案发现:我删除了图片文件夹上的缩略图   我的SD卡并重新启动了手机。看来那个小   缩略图窗口,表示最后一次拍摄负责   应用程序崩溃,由于某种原因拇指无法加载和   应用程序崩溃。

然后,xda-Developers上有this thread名为" 4.2 Android相机APK FIX!" (不要兴奋,这只适用于ROOTED设备:-():

从线程中获取快速说明:

  

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

     

在安装camera apk之前将此apk添加到系统/应用程序   手册。     http://db.tt/OZF6D8fL

     

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

     

对于不支持设备的用户,请更改以下行   build.prop和reboot:

     

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

接下来(只是向广大公众提及),我在AndroidCentral中找到了这个,只是为了它,它再次成为一个"修复"对于有根设备。

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

  

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

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

    限制Galaxy S3流程

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

      清除TouchWiz的数据

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

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

最后,为了完成这个looong的答案,我想说,即使我发现很少有修复/解决方法,我真的希望,Offical Bug Fix(再次链接,以便有这个东西再一次引用)将广泛提供,不仅适用于4.xx版本的Android,很可惜我们不适用于旧版本(错误的处理是什么)无论如何修复旧的API?)。

TL; DR

干杯; - )

答案 1 :(得分:1)

试试这个:

  @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

答案 2 :(得分:1)

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

显然这个回调是用相机预览的每一帧的数据来阻塞缓冲区。

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

问题与您安装到手机上的更新后的Rom数据有关,除非您在手机中更新了Rom,否则无法执行任何操作。

答案 5 :(得分:0)

onPauseSurfaceView中删除frameLayout之后:

@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.
    }
}