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

本文讲述了在Android系统权限变化的背景下,如何处理拍照和相册选图过程中遇到的照片翻转和文件读写权限问题。从4.4到7.0,Google对文件安全进行了多次调整,导致开发者需要手动兼容不同版本。文章重点讨论了如何解决照片翻转及Android 7.0以上版本的文件权限问题,包括获取照片旋转角度、翻转图片以及使用FileProvider和临时权限来处理文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值