我有一个自定义相机在某些设备上工作正常.它适用于三星Galaxy Gran Duos(三星-gt i9082,Android 4.2.2)但是当我尝试捕捉图像时,我之前放大了,它冻结了,没有崩溃,唯一的出路就是按下返回键.这只发生在三星Galaxy Gran Duos上.
我用来拍照的代码:
Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
try {
} catch (Exception e) {
if (flePicture== null){
Log.d("camera", "Error creating media file, check storage permissions: " +
e.getMessage());
return;
}
}
try {
FileOutputStream fos = new FileOutputStream(flePicture);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d("camera", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("camera", "Error accessing file: " + e.getMessage());
}
} …Run Code Online (Sandbox Code Playgroud) 我正在为Android API 16到21开发相机应用程序,其主要目的是拍摄肖像照片.我可以用几个设备(Nexus 4,Nexus 5,HTC ......)拍照并正确定位(意味着我的预览等于拍摄的照片尺寸和方向).
但是我已经在其他几个设备上测试了我的应用程序,其中一些设备给我带来了很多麻烦:三星Galaxy S3/S4/S5.
在这三个设备上,预览正确显示,但方法返回的图片onPictureTaken(final byte[] jpeg, Camera camera)始终是侧面的.
这是byte[] jpeg在将ImageView保存到磁盘之前从我的用户创建并在ImageView中显示的位图:

这是保存在磁盘上的图像:

正如您所看到的,图像在预览中完全拉伸,并且一旦保存在磁盘上就会错误地旋转.
这是我的CameraPreview类(我混淆了其他方法,因为它们与相机参数无关):
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder surfaceHolder;
private Camera camera;
// Removed unnecessary code
public void surfaceCreated(SurfaceHolder holder)
{
camera.setPreviewDisplay(holder);
setCameraParameters();
camera.startPreview();
}
private void setCameraParameters()
{
Camera.Parameters parameters = camera.getParameters();
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, info);
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
int rotation = windowManager.getDefaultDisplay().getRotation(); …Run Code Online (Sandbox Code Playgroud)