小米APP相册安全分享适配文档

开启小米相册的安全分享功能后,从相册分享图片会自动抹除位置、手机型号、拍摄参数等信息。

一、 功能介绍

开启小米相册的安全分享功能后,从相册分享图片会自动抹除位置、手机型号、拍摄参数等信息。

安全分享开关: 相册->右上角菜单->设置->安全分享

小米APP相册安全分享适配文档

二、分享图片路径变化

小米相册中打开安全分享中任意一个开关(默认抹除照片位置、默认抹除照片拍摄信息)后,从相册分享时会将抹除相关信息的照片保存到相册的私有目录,然后通过FileProvider的方式生成content://Uri分享给应用

开启安全分享后分享的照片路径:

storage/emulated/0/Android/data/com.miui.gallery/cache/SecurityShare/XXX.jpg

未开启安全分享功能分享的照片路径:

storage/emulated/0/DCIM/Screenshots/XXX.jpg

三、应用不可以直接访问私有目录

由于从Android11开始,应用的私有目录不能被外部访问,即使获取了“所有文件管理”权限也不行。具体参见https://developer.android.google.cn/about/versions/11/privacy/storage。因此如果在用户打开安全分享的情况下,应用接收到相册传递给应用的URL,获取到绝对路径,再直接通过访问绝对路径的方式来读取照片,会发生读取异常。

例如以下错误

BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.miui.gallery/cache/SecurityShare/1655174005823.jpg: open failed: ENOENT (No such file or directory)

四、适配方式推荐FileProvider

针对开启安全分享的情况下,分享照片到应用,建议应用使用fileprovider(https://developer.android.com/reference/androidx/core/content/FileProvider)的方式访问照片,参考代码如下:

Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();

if (Intent.ACTION_SEND.equals(action) && type != null) {
     if (type.startsWith("image/")) {
         Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
         InputStream is = null;
        try {
            is = getContentResolver().openInputStream(imageUri);
            Bitmap bmp = BitmapFactory.decodeStream(is);
            imageView.setImageBitmap(bmp);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     }
    } 

编辑:yimen,如若转载,请注明出处:https://www.yimenapp.com/kb-yimen/12528/

部分内容来自网络投稿,如有侵权联系立删

(0)
上一篇 2022年11月24日 下午2:02
下一篇 2022年11月24日 下午2:05

相关推荐