一、预览时正确显示java
主要参考系统相机代码实现getDisplayOritation就能够了数据库
//在preview以前调用setDisplayOrientationide
int degrees = getDisplayOritation(getDispalyRotation(), cameraId); mCamera.setDisplayOrientation(degrees); mCamera.startPreview();
getDisplayOritation函数以下:函数
private int getDisplayOritation(int degrees, int cameraId) { Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info); int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; } else { result = (info.orientation - degrees + 360) % 360; } return result; } private int getDispalyRotation() { int i = getWindowManager().getDefaultDisplay().getRotation(); switch (i) { case Surface.ROTATION_0: return 0; case Surface.ROTATION_90: return 90; case Surface.ROTATION_180: return 180; case Surface.ROTATION_270: return 270; } return 0; }
二、显示图片时正确显示spa
竖屏拍照的照片,直接使用的话,会旋转90度code
参考系统图库的代码,须要先查询mediascanner的orientation字段,而后应用再把角度旋转过来,这样显示就ok了orm
参考代码以下:图片
假设c为查询mediaprovider数据库返回的cursorci
int rotation = c.getInt(c.getColumnIndex(MediaStore.Images.ImageColumns.ORIENTATION)); if (rotation != 0) { Bitmap bitmap = BitmapFactory.decodeFile(path); imageBefore.setImageBitmap(bitmap); Matrix m = new Matrix(); m.setRotate(rotation); Bitmap transformed = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); return transformed; }