首页 > 解决方案 > 图像保存在 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,但这些图片没有出现在画廊中,即它们不是通过MediaStoreAPI 公开可见的(我的感觉)。
目标 Android: Android 10

我知道,我可以 android:requestLegacyExternalStorage="true"在清单中使用。但我希望该应用程序也与 android 11 完美兼容。所以不想这样做。

标签: mediastoreandroid-10.0scoped-storage

解决方案


推荐阅读