无意捕获图像,在不同设备上提供不同的输出
我的要求是既不显示相机预览也不使用相机意图进行图像捕捉。
在那里,我找到了一种适用于我的第一个测试设备(Galaxy tab 7“)的方法。
我的CaptureImage
功能如下
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);
}
}
和getCameraID
函数如下
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;
}
现在我很难在不同设备上成功运行代码。
Samsung Galaxy Nexus的Logcat:
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个设备导致问题,所以有没有任何标准方法可以在没有意图和预览的情况下从相机获取图像。
请注意,我包含在清单中并将最低sdk版本设置为9
更新:在Camera.java类的行号为1061的4.1 Nexus Galaxy takePicture Failed
,这里是类链接,它给我的信息native_takePicture(msgType); function in Camera.java
native_takePicture(msgType); function in Camera.java
确实会抛出该错误
Android设备中的相机处理是主要的PITA - 不同的设备(甚至是同一设备上的android版本)可以并且当然会有不同的表现。 基本上你是用设备上的一些恶魔进程说话,而且它们彼此不同。
我没有解决所有问题的方法,但这是我迄今为止的发现
我开发了一些为JavaOCR项目开发的相机管理工具,它适用于大多数设备。 随意使用这个作为灵感:
http://sourceforge.net/p/javaocr/code/240/tree/trunk/demos/camera-utils/src/main/java/net/sf/javaocr/demos/android/utils/camera/CameraManager.java
经过多次搜索,我发现相机预览是必要的,我不知道我的代码在某些设备中的工作情况如何,即使它有问题。
任何方式的解决方案是,
我们需要在表面视图中保留相机预览,并且我们可以隐藏任何其他视图后面的表面视图,我在framelayout中采用表面视图(我知道它已被弃用),并且在其上方拍摄图像视图,对于表面视图,我只需要80 * 80 dp表面视图,因为像30 * 30 dp这样的小表面视图不起作用,并且再次通过错误。
您需要使用Camera.setOneShotPreviewCallback方法,然后处理图像
尝试使用YuvImage并在传递给bitmapfactory之前对其进行压缩,如下所示:
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());
编辑:
您必须使用曲面视图,但曲面视图可以隐藏在另一个视图的下方,因此它在屏幕上不可见,但仍然存在并处于活动状态。
链接地址: http://www.djcxy.com/p/90933.html上一篇: Capture image without intent, Gives different output on different devices
下一篇: iOS 'Web App' has different localStorage than Mobile Safari