【问题标题】:getContentResolver().openOutputStream(uri) create blank image on Android 11/API 30getContentResolver().openOutputStream(uri) 在 Android 11/API 30 上创建空白图像
【发布时间】:2026-02-01 08:00:01
【问题描述】:

我正在开发需要从服务器下载图像/视频并将其保存到媒体商店和本地应用程序数据库的应用程序,其 URI 类似于 content://media/external/images/media/10052,在从 URI 下载到应用程序后加载。

当应用从服务器接收到图像时,它首先在 Android 11/API 30 上借助此方法下载。

private Uri mediaStoreInsert(String fileName, String mimeType, String directoryPath){
        Log.d(TAG, "mediaStoreInsert: Values = "+fileName+" "+directoryPath+" "+mimeType);
        ContentResolver resolver = MyApplication.getmContext().getContentResolver();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH,Environment.DIRECTORY_PICTURES+"/"+directoryPath);
        Uri mediaStore;
        if (mimeType.equals(imageType)){
           mediaStore = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
        }else {
           mediaStore = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
        }
        Uri uri = resolver.insert(mediaStore, contentValues);
        Log.d(TAG, "mediaStoreInssert: URI Check = "+uri);
        OutputStream outputStream = null;
        try {
            outputStream = MyApplication.getmContext().getContentResolver().openOutputStream(uri);
            outputStream.flush();
            outputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return uri;
    }

此方法返回图像的URI,但是当我在图库中检查图像时,它显示为 0 字节的空白图像。你能帮我解释一下为什么这个方法不能成功创建图像吗?

【问题讨论】:

    标签: java android inputstream


    【解决方案1】:

    你什么都没写。

                outputStream = MyApplication.getmContext().getContentResolver().openOutputStream(uri);
                outputStream.flush();
                outputStream.close();
    

    在此处打开OutputStream,然后将其关闭。您不会向该流写入任何内容。

    【讨论】:

    • 我应该先写文件然后运行这个代码`resolver.insert(mediaStore, contentValues);`或者代码是完美的我只需要写到流。你能告诉我如何写一个具有相同内容 uri 的图像
    • @Ritu:“完美”是一个非常高的标准。 ? 但是在openInputStream() 调用和该流上对flush() 的调用之间,您需要将内容写入流。这与 Android 无关——Java I/O 已经存在 20 多年了。
    • 你是对的。完美是高标准,但对我来说,它首先应该工作,因为我需要它工作。 bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream); 这是我了解写作 stram 的方式。但我不需要任何位图来创建或压缩(占用额外资源)。有没有更好的方法可以让我返回 uri
    • @Ritu:您的数据必须来自某个地方。我不知道您打算从哪里获取数据,因此我无法告诉您如何将这些数据写入OutputStream
    • 来自互联网的数据。可以是随机网址,https://previews.123rf.com/images/haywiremedia/haywiremedia1001/haywiremedia100100006/6159925-a-closeup-of-a-technology-internet-url-address-being-typed-out-on-a-computer-screen-a-mouse-is-on-th.jpg