问题:在安卓部分手机上从相册获取到图片的uri,在显示的时候会默认旋转90度。(特别是若是这张照片拍摄的时候是竖着拍摄的)java
解决问题思路:获取照片的旋转角度,在显示的时候再根据旋转角度,旋转一下照片。android
大坑:使用ExifInterface获取不到任何照片的信息。(ExifInterface是用来显示照片的相关信息包括:分辨率,旋转方向,感光度、白平衡、拍摄的光圈、焦距、分辨率、相机品牌、型号、GPS等信息。)post
解决办法注重点:ui
在获取到uri以后不要进行任何的图片压缩操做!this
ExifInterface类使用com.android.support:exifinterface:28.0.0 ,不要使用Android自带的,避免在高版本中报错。code
特别重要的一点:要先根据uri将图片复制出来(通常是复制到本身App应用里面),再根据新的路径读取照片。对象
下面贴出相关代码:图片
/** * 打开相册 */ public void openFilePhoto() { Activity activity = this.mActivity.get(); Fragment fragment = this.mFragment.get(); Intent intent = new Intent(); if (Build.VERSION.SDK_INT < 19) { intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); } else { intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); } if (fragment != null) { fragment.startActivityForResult(intent, OPEN_FILE_PHOTO_REQUEST); } else { activity.startActivityForResult(intent, OPEN_FILE_PHOTO_REQUEST); } } //uri转成file public static File getFileFromUri(Uri uri, Context context) { if (uri == null) { return null; } switch (uri.getScheme()) { case "content": return getFileFromContentUri(uri, context); case "file": return new File(uri.getPath()); default: return null; } } //根据uri转成file 是以content开头 private static File getFileFromContentUri(Uri contentUri, Context context) { if (contentUri == null) { return null; } File file = null; String filePath; String fileName; String[] filePathColumn = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DISPLAY_NAME}; ContentResolver contentResolver = context.getContentResolver(); Cursor cursor = contentResolver.query(contentUri, filePathColumn, null, null, null); if (cursor != null) { cursor.moveToFirst(); filePath = cursor.getString(cursor.getColumnIndex(filePathColumn[0])); fileName = cursor.getString(cursor.getColumnIndex(filePathColumn[1])); cursor.close(); if (!TextUtils.isEmpty(filePath)) { file = new File(filePath); } if (!file.exists() || file.length() <= 0 || TextUtils.isEmpty(filePath)) { filePath = getPathFromInputStreamUri(context, contentUri, fileName); } if (!TextUtils.isEmpty(filePath)) { file = new File(filePath); } } return file; } /** * 用流拷贝文件一份到本身APP目录下 * * @param context * @param uri * @param fileName * @return */ public static String getPathFromInputStreamUri(Context context, Uri uri, String fileName) { InputStream inputStream = null; String filePath = null; if (uri.getAuthority() != null) { try { inputStream = context.getContentResolver().openInputStream(uri); File file = createTemporalFileFrom(inputStream, fileName); filePath = file.getPath(); } catch (Exception e) { Log.e("FileUtils", e.toString()); } finally { try { if (inputStream != null) { inputStream.close(); } } catch (Exception e) { Log.e("FileUtils", e.toString()); } } } return filePath; } private static File createTemporalFileFrom(InputStream inputStream, String fileName) throws IOException { File targetFile = null; if (inputStream != null) { int read; byte[] buffer = new byte[8 * 1024]; //本身定义拷贝文件路径 targetFile = new File(Constant.DIR_ROOT, fileName); if (targetFile.exists()) { targetFile.delete(); } OutputStream outputStream = new FileOutputStream(targetFile); while ((read = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, read); } outputStream.flush(); try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return targetFile; } /** * 读取照片旋转角度 * * @param path 照片路径 * @return 角度 */ public static int readPictureDegree(String path) { if (TextUtils.isEmpty(path)) { return 0; } int degree = 0; try { ExifInterface exifInterface = new ExifInterface(path); int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; } /** * 旋转图片 * * @param angle 被旋转角度 * @param bitmap 图片对象 * @return 旋转后的图片 */ public static Bitmap rotaingImageView(int angle, Bitmap bitmap) { Bitmap returnBm = null; // 根据旋转角度,生成旋转矩阵 Matrix matrix = new Matrix(); matrix.postRotate(angle); try { // 将原始图片按照旋转矩阵进行旋转,并获得新的图片 returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } catch (OutOfMemoryError e) { } if (returnBm == null) { returnBm = bitmap; } if (bitmap != returnBm) { bitmap.recycle(); } return returnBm; }