最近使用到了拍照与相册选图。
从4.4到6.0,再到7.0,Google关于系统权限与文件安全方面做了几次大的变动。
因此特别让Android猿媛们苦恼,没有一个全兼容的API,只能手动兼容每个版本。
当然Github上也有很多奆奆们的轮子可以使用,但是考虑到项目大小的问题,还是选择自己手动实现。
在此描述两个容易忽视的问题:
1、照片翻转问题
由于硬件缘故,从相册或相机中获取到的照片是翻转的。
1.1 获取照片翻转角度
private int getPhotoDegree(String photoPath){
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;
}
1.2 将图片翻转回正向
if (degree != 0) {
Matrix m = new Matrix();
m.postRotate(degree);
bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), m, true);
}
2、文件读写权限问题:
Android7.0及以上,文件的处理多了一些繁琐的过程。
无法直接使用图片地址,需要使用FileProvider获取Uri。
public static Uri getUriForFile(Context context, String authority, File file) {};
并且再向第三方应用提供文件读取和写入时,需要赋予临时的读写权限。
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
笔者就因为在裁剪相册图片时忘记赋予写权限而......