【Android】解决自定义相机拍照时预览方向与实际照片方向不一致的问题

自定义一个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类不需要做任何更改
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值