自定义一个Camera的时候,往往看到预览的方向是正确的,但是看实际存储的图像会发现与预览方向不一致,它们之间存在如下关系:
在自定义Camera进行拍照的时候,调用了
public final void takePicture(ShutterCallback shutter, PictureCallback raw,
PictureCallback jpeg) {
takePicture(shutter, raw, null, jpeg);
}
代码:
//mCamera是自定义的一个Camera实例
TakePictureCallback takePictureCallback = new TakePictureCallback();
mCamera.takePicture(null,null, takePictureCallback );
//实现回调函数
//在这里只是简单的将文件进行保存,并且更新到相册中,可以在相册中直接看到
//在此处有个问题就是实际保存的照片方向与预览方向并不一致,
//后置摄像头的话差90°,前置差270°,如上图
class TakePictureCallback implements Camera.PictureCallback {
private static final String TAG = "takePictureCallback";
File pictureFile;
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
//do Something
if (savePicture(bytes)) {
Toast.makeText(getActivity(), "拍摄照片成功", Toast.LENGTH_SHORT).show();
}
UpdateAlbum(pictureFile);// 插入file数据到相册并通知相册更新
camera.startPreview();
}
private void UpdateAlbum(File file){
// 插入file数据到相册
ContentValues values = new ContentValues(9);
values.put(MediaStore.Images.Media.TITLE, "Camera");
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.ORIENTATION, 90);
values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
values.put(MediaStore.Images.Media.SIZE, file.length());
Uri uri = mActivity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
// 通知相册更新
mActivity.sendBroadcast(new Intent("com.android.camera.NEW_PICTURE", uri))
}
private boolean savePicture(byte[] bytes){
String fileName = System.currentTimeMillis() + ".jpg"; //jpeg文件名定义
File sdRoot = Environment.getExternalStorageDirectory(); //系统路径
pictureFile = new File(sdRoot , fileName);
if (!pictureFile.exists()) {
try {
pictureFile.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(bytes);
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG,"savePicture()照片存储失败");
}
return false;
}
}
//在这里只是简单的将文件进行保存,并且更新到相册中,可以在相册中直接看到
//在此处有个问题就是实际保存的照片方向与预览方向并不一致,
//后置摄像头的话差90°,前置差270°,如上图
为了实现保存的照片方向与预览时的方向一致,代码如下
//在此处只是新增加了一个setParameters方法就可以实现预览与实际方向一致的效果了
Camera.Parameters mParameter =mCamera.getParameters();
int currentCameraFacing = mSurfaceCallback.getmCameraFacing();//获取此时的摄像头方向以设置旋转角度
if(currentCameraFacing == Camera.CameraInfo.CAMERA_FACING_FRONT){
mParameter.setRotation(270);//前置旋转270°
}else{
mParameter.setRotation(90);//后置旋转90°
}
mCamera.setParameters(mParameter);//将参数设置进去
TakePictureCallback mTakePictureCb = new TakePictureCallback();//进行拍照
mCamera.takePicture(null,null,mTakePictureCb);//TakePictureCallback类不需要做任何更改