又经历了一次拍照与选相册的洗礼

最近使用到了拍照与相册选图。

从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);

笔者就因为在裁剪相册图片时忘记赋予写权限而......

你可能感兴趣的:(Android学习,问题与解决,android,拍照,相册,文件权限)