takepicture hangs on Android 2.3.3
我有一些适用于 Android 2.1 和 2.2 的拍照代码。
但是这些代码在 Android 2.3 中被破坏了。
在花了时间解决这个徒劳的问题后,我想在这里寻求帮助。
我的拍照代码流程是这样的:
创建一个Camlayer类扩展SurfaceView
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
public class CamLayer extends SurfaceView implements SurfaceHolder.Callback { private void init(Context context){ // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mCamera = Camera.open(); } public CamLayer(Context context) { public CamLayer(Context context, AttributeSet attrs) { public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { try { Camera.Parameters p = mCamera.getParameters(); mCamera.startPreview(); public void takePicture(){ |
问题是在Android 2.3.3,
达尔维克线:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 NATIVE | group="main" sCount=1 dsCount=0 obj=0x40022170 self=0xce68 | sysTid=2411 nice=0 sched=0/0 cgrp=default handle=-1345006464 at android.hardware.Camera.native_takePicture(Native Method) at android.hardware.Camera.takePicture(Camera.java:746) at android.hardware.Camera.takePicture(Camera.java:710) at oms.cj.tube.camera.CamLayer.takePicture(CamLayer.java:256) at oms.cj.tube.camera.DefineColor.takePicture(DefineColor.java:61) at oms.cj.tube.camera.DefineColor.onKeyUp(DefineColor.java:71) at android.view.KeyEvent.dispatch(KeyEvent.java:1280) at android.app.Activity.dispatchKeyEvent(Activity.java:2078) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:16 at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2546) at android.view.ViewRoot.handleMessage(ViewRoot.java:1878) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:3691) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) at dalvik.system.NativeStart.main(Native Method) |
有人遇到同样的问题吗?并且知道如何解决它?
我还观察到 mCamera.takePicture(null, null, handler) 冻结。我试图在调用 takePicture() 之前清除预览处理程序:mCamera.setPreviewCallback(null),现在它可以工作了。
我今天在装有 Android 2.3.3 的三星 Exhibit 4G 上测试我们的应用程序时遇到了完全相同的问题,并使用解决方法解决了它。
我不再调用 takepicture 而是使用最后一个预览回调作为图片。
问题是预览回调使用 NV21 格式发送数据缓冲区。
所以你必须使用这个过程来转换图像:NV21 -> RGB -> 加载位图 -> 压缩为 JPEG
我们现在的代码如下所示:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
camera.setPreviewCallback(new PreviewCallback() {
@Override if (mTakePictureCallback != null && !mPictureTaken) { |
decodeYUV420SP 的代码在这里 http://www.41post.com/3470/programming/android-retrieving-the-camera-preview-as-a-pixel-array 谁在科泰找到的 http://code .google.com/p/ketai/
当你拍照时,只需将 mTakePicture 变量设置为 true
我正在开发一个更好的版本,但这应该能让你继续前进。
我不确定您的代码中使用了什么 setOptimalSize 方法,但请确保您已设置相机参数
1
2 |
mCamera.setPictureSize(captureSize.width, captureSize.height);
mCamera.setPictureFormat(ImageFormat.JPEG); |
我在使用 GB 手机时遇到了这个问题,对我来说,这是因为我在调用 camera.takePicture() 之后立即调用了 camera.startPreview(),这导致了 Android 中的一些线程锁定。修复方法是将 camera.startPreview() 移动到传递给 camera.takePicture() 的回调中,这样它只会在图片数据进入后才被调用(下面的示例代码)。当然,这仅在您有兴趣在拍摄照片后重新开始预览时才相关。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// BAD BAD DON’T DO THIS! public void myTakePicture(Camera.PictureCallback callback) { mCamera.takePicture(null, null, null, callback); mCamera.startPreview(); } // … |
这不仅使 ANR 在调用 takePicture 时消失,而且还修复了一些高端手机(尤其是 >=4.3 Nexus 5)上发生的 startPreview 原生崩溃。希望对您有所帮助!
问题在于下面的代码是写的。
定义了一个 PreviewCallback,
1
2 3 4 5 6 7 |
PreviewCallback mPreviewCallback = new PreviewCallback() {
@Override |
mCamera.setPreviewCallback(mPreviewCallback);
这在 2.1/2.2 中有效,但在 2.3 中无效。
不确定 Android 团队是否支持这种使用相机的方式。
如果上述流程是预期的,那么 Android 团队应该解决这个问题。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269084.html