Capture image without intent, Gives different output on different devices
我的要求既不是显示相机预览,也不是使用相机意图进行图像捕捉。
我找到了一种适用于我的第一个测试设备(Galaxy tab 7")的方法。
我的
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 | private void CaptureImage() { int FrontCameraFound = getCameraID(); if (FrontCameraFound != -1) { mCamera = Camera.open(FrontCameraFound); parameters = mCamera.getParameters(); mCamera.setParameters(parameters); mCamera.startPreview(); Camera.PictureCallback mCall = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { bmp = BitmapFactory.decodeByteArray(data, 0, data.length); // set bitmap tp image view just to check // if image capture proper, testing purpose iv_image.setImageBitmap(bmp); mCamera.stopPreview(); mCamera.release(); mCamera = null; } }; mCamera.takePicture(null, null, mCall); } } |
和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | private int getCameraID() { Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); camIdx++) { Camera.getCameraInfo(camIdx, cameraInfo); // for capture image from back camera // If want to capture from front // then change it to CAMERA_FACING_FRONT if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { try { return camIdx; } catch (RuntimeException e) { } } } return -1; } |
现在,我面临着在不同设备上成功运行代码的困难。
- 三星Galaxy S +(2.3.6):前置摄像头始终返回绿色图像,但编码后置摄像头工作正常。
- 三星Galaxy Nexus(4.1):编码不起作用Front和Back相机都没有用给"takePicture"失败了。
- LG Optimus Net(2.3.4):只有后置摄像头才有&amp;工作正常。
- 三星Galaxy Tab 7"(2.3.3):两款相机都能正常工作。
- 摩托罗拉Xoom(3.1):两款相机都工作??正常。
三星Galaxy Nexus的Logcat:
1 2 3 4 5 6 7 8 9 | 09-21 09:37:42.125: E/AndroidRuntime(4647): Caused by: java.lang.RuntimeException: takePicture failed 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.hardware.Camera.native_takePicture(Native Method) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.hardware.Camera.takePicture(Camera.java:1061) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.hardware.Camera.takePicture(Camera.java:1006) 09-21 09:37:42.125: E/AndroidRuntime(4647): at fortyonepost.com.pwop.TakePictureDemoActivity.CaptureImage(TakePictureDemoActivity.java:63) 09-21 09:37:42.125: E/AndroidRuntime(4647): at fortyonepost.com.pwop.TakePictureDemoActivity.onCreate(TakePictureDemoActivity.java:36) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.app.Activity.performCreate(Activity.java:5008) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) |
我无法检查每个设备的代码,我只是在5个设备上测试我的代码而2个设备导致问题,所以有没有任何标准的方法从相机中获取图像而没有意图&amp;预习。
请注意,我包括在清单&amp;将最小sdk版本设置为9
更新:
在Camera.java类中的行号1061的4.1 Nexus Galaxy
经过几次搜索后,我发现相机的预览是必要的,我想知道我的代码在某些设备上是如何工作的,即使它有问题。
任何方式解决方案是,
我们要求在表面视图上保持相机预览,我们可以隐藏任何其他视图后面的表面视图,我在framelayout中采取表面视图(我知道它已被弃用)以及它上面我采取图像视图,对于表面视图我只需要80 * 80 dp表面视图,因为像30 * 30 dp的小表面视图不起作用并再次通过错误。
Android设备中的摄像头处理是主要的PITA - 不同的设备(甚至同一设备上的Android版本)可以并且肯定会表现不同。基本上你是在设备上讲一些恶魔过程,它们彼此不同。
我没有针对所有问题的解决方案,但到目前为止,这是我的发现
- 并非所有分辨率都能正常工作,即使它们是在相机参数中公布的。您必须在设置相机时测试它们以防出现问题
- 预览数据通过mmapped内存区域来找到你
- NV21格式始终提供并且是默认格式,但我会查询相机设置。打开相机时,它可以使用之前使用相机的其他应用程序进行一些设置。 (据说无处可在打开时将相机重置为默认值)
我已经为JavaOCR Project开发了一些相机管理功能,它在大多数设备上都有用。随意使用它作为灵感:
http://sourceforge.net/p/javaocr/code/240/tree/trunk/demos/camera-utils/src/main/java/net/sf/javaocr/demos/android/utils/camera/CameraManager.java
您需要使用Camera.setOneShotPreviewCallback方法,然后处理图像
尝试使用YuvImage并在将其传递给bitmapfactory之前对其进行压缩,如下所示:
1 2 3 4 5 | YuvImage yuvimage = new YuvImage(byteArr, ImageFormat.NV21, width, height, null); Rect rect = new Rect(0, 0, width, height); ByteArrayOutputStream outstr = new ByteArrayOutputStream(); yuvimage.compressToJpeg(rect, 100, outstr); Bitmap bm = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size()); |
编辑:
您必须使用曲面视图,但曲面视图可以隐藏在另一个视图下方,因此它在屏幕上不可见但仍然存在并处于活动状态。