问题:在安卓部分手机上从相册获取到图片的uri,在显示的时候会默认旋转90度。(特别是如果这张照片拍摄的时候是竖着拍摄的)
解决问题思路:获取照片的旋转角度,在显示的时候再根据旋转角度,旋转一下照片。
大坑:使用ExifInterface获取不到任何照片的信息。(ExifInterface是用来显示照片的相关信息包括:分辨率,旋转方向,感光度、白平衡、拍摄的光圈、焦距、分辨率、相机品牌、型号、GPS等信息。)
解决办法注重点:
在获取到uri之后不要进行任何的图片压缩操作!
ExifInterface类使用com.android.support:exifinterface:28.0.0 ,不要使用Android自带的,避免在高版本中报错。
特别重要的一点:要先根据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;
}