12

我的应用程序非常基础和简单,我只需要打开相机(甚至不显示图像,我注释了代码)

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

@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

4

6 回答 6

3

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

我做了一些研究,发现了一个有趣且可能不那么紧密相关的线程,关于DroidForums中的类似问题:

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

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

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

更新!!!

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

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

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

从那里引用:

显然,Camera.open() 本身挂起而不会引起任何异常,因此我无法捕捉和采取任何行动。然后我也不能使用内置的相机应用程序,因为它只提供黑色预览屏幕,稍后会显示我尝试与之交互时无响应的消息。由于在上面的代码片段中已经为空(在程序启动时),所以我无法释放任何东西:没有 camera.release()。

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

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

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

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

从那里引用:

并找到了解决方案:我删除了 SD 卡图像文件夹中的缩略图并重新启动了手机。似乎指示最后一次拍摄的小缩略图窗口是导致应用程序崩溃的原因,由于某种原因,拇指无法加载并且应用程序崩溃了。

然后,在 xda-Developers 上出现了一个名为“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=银河系 ro.product.brand=google

接下来(只是为了向广大公众提及),我在AndroidCentral中发现了这个,只是为了它,它再次是根设备的“修复”。

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

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

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

限制 Galaxy S3 进程

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

清除 TouchWiz 的数据

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

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

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

于 2013-07-25T08:18:44.107 回答
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

于 2013-07-25T16:30:48.350 回答
1

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

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

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

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

于 2013-07-26T06:58:27.910 回答
0

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

于 2013-07-26T12:39:07.450 回答
0

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

于 2014-09-04T00:48:24.680 回答
0

在你onPause删除你SurfaceViewframeLayout喜欢:

@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.
    }
}
于 2016-09-02T11:59:15.640 回答