我的应用程序非常简单,我只需要打开相机(甚至不显示图像,我对代码进行了评论)
所以,基本上,我有类似的东西:
@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
答案 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设备, 生根是解决这些问题的第一步。但你必须这样做 考虑到所涉及的风险,尽管已经存在 安全的手机根电话。但在你真正决定做之前 那,我有一些我想让你尝试的事情。
- 召回您最近安装的应用,尝试禁用它们 看看手机的性能是否有所改善。一些 真正沉重的应用甚至可能导致或促成了 问题。
- 尝试通过转到主屏幕并按住来清除内存 主页按钮。正在运行或最近打开的应用列表 节目;你只需向左或向右滑动即可关闭它们。我很漂亮 确定你已经知道有这么多应用程序运行的影响 背景。
醇>限制Galaxy S3流程
- 在主屏幕中,按菜单按钮,然后选择设置。
- 向下滚动并点按“开发者选项”。
- 找到“限制后台流程”选项并点按它。
- 限制Galaxy S3一次运行大约4个进程,或者更低。
醇>清除TouchWiz的数据
- 在主屏幕中,点按“菜单”按钮。
- 选择系统设置,然后选择应用程序管理器
- 向下滚动查找TW,然后点按清除数据。
醇>如果没有其他工作,也许是时候根设备并使用了 更轻松,更快速的自定义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)
在onPause
从SurfaceView
中删除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.
}
}