mediastore - 图像保存在 Scoped Storage Android 10 中,未出现在图库中
问题描述
必需的行为:我使用以下代码保存图像,并希望将它们显示在画廊中(因为我们可以看到来自 whatsapp 的图像)。
boolean downloadImage(Bitmap image) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Download started..", Toast.LENGTH_SHORT).show();
}
});
ContentResolver resolver = getApplicationContext().getContentResolver();
Uri imageCollection;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
imageCollection = MediaStore.Images.Media
.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
} else {
imageCollection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
String imgName = "IMG_"+System.currentTimeMillis()+".jpg";
ContentValues imgDetails = new ContentValues();
imgDetails.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
imgDetails.put(MediaStore.Images.Media.DISPLAY_NAME, imgName);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
imgDetails.put(MediaStore.Images.Media.IS_PENDING, 1);
imgDetails.put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/DownloaderApp");
}
Uri imgUri = resolver.insert(imageCollection, imgDetails);
try {
OutputStream outputStream = resolver.openOutputStream(imgUri);
boolean saveResult = image.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
outputStream.close();
imgDetails.clear();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
imgDetails.put(MediaStore.Images.Media.IS_PENDING, 0);
}
resolver.update(imageCollection, imgDetails, null, null);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(
MainActivity.this,
(saveResult) ?"Image Path: "+imgUri.getPath() :"Failed to save image!",
Toast.LENGTH_SHORT).show();
}
});
outputStream.close();
return saveResult;
} catch(Exception e) {
e.printStackTrace();
return false;
}
}
当前情况:我可以看到图像被保存在文件管理器中的确切位置DCIM/DownloaderApp
,但这些图片没有出现在画廊中,即它们不是通过MediaStore
API 公开可见的(我的感觉)。
目标 Android: Android 10
我知道,我可以 android:requestLegacyExternalStorage="true"
在清单中使用。但我希望该应用程序也与 android 11 完美兼容。所以不想这样做。
解决方案
推荐阅读
- c# - 打开 Skype for business 而不是团队 CALLTO 协议
- javascript - 如何从 HTML、CSS、Js 和 Python 文件创建 APK 文件?
- xamarin - 是否可以在 Shell 运行时在单个菜单项中添加子菜单?
- reactjs - 在 laravel 8 中使用 react.js 发布数据时,有没有办法修复内部服务器错误
- swift - 在 SwiftUI 中在父视图和子视图之间共享状态变量的正确方法是什么
- r - 我的闪亮应用程序在我调用它时删除了我的 Markdown 的内容并且不保存为 pdf
- webpack - 如何在与 webpack 捆绑时将 SASS 变量转换为原生 CSS 变量?
- wiremock - 如何发送由标头值驱动的wiremock存根响应
- android - 发布新更新时未在 Play 商店中获取应用更新
- node.js - 加载资源失败:服务器响应状态为 404(未找到) ENOENT:没有这样的文件或目录,stat '/client/build/index.html'