我的要求既不是显示相机预览,也不是使用相机意图进行图片捕捉。
因此,我找到了一种对我的第一个测试设备(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 S+ (2.3.6):前置摄像头始终返回绿色图像,但后置摄像头的编码工作正常。
- Samsung Galaxy Nexus (4.1):编码对于前置和后置摄像头都不能正常工作,并且会显示“takePicture”失败。
- LG Optimus Net (2.3.4):只有后置摄像头并且工作正常。
- Samsung Galaxy Tab 7 " (2.3.3):两个摄像头都可以正常工作。
- Motorola Xoom (3.1):两个摄像头都可以正常工作。
三星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个设备出现了问题,那么有没有标准的方法可以从相机中获取图像而不使用意图和预览。
请注意,我在清单中包含了<uses-permission android:name="android.permission.CAMERA"/>,并将最低SDK版本设置为9
更新:
在4.1 Nexus Galaxy上,Camera.java
类中第1061行的takePicture Failed
,这里是类链接,给我提供了信息:Camera.java
中的native_takePicture(msgType)
函数抛出了该异常。
takePicture()
方法显示是从onCreate()
而不是您的CaptureImage()
方法调用的。这正确吗? - Joe