一、 功能介绍
开启小米相册的安全分享功能后,从相册分享图片会自动抹除位置、手机型号、拍摄参数等信息。
安全分享开关: 相册->右上角菜单->设置->安全分享
二、分享图片路径变化
小米相册中打开安全分享中任意一个开关(默认抹除照片位置、默认抹除照片拍摄信息)后,从相册分享时会将抹除相关信息的照片保存到相册的私有目录,然后通过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,获取到绝对路径,再直接通过访问绝对路径的方式来读取照片,App生成器会发生读取异常。
例如以下错误
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().openIapp自动生成器nputStream(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/
部分内容来自网络投稿,如有侵权联系立删