使用Android的MediaStore创建图像文件后,文件扩展名和文件名错误(ContentResolver /作用域存储)

问题描述 投票:1回答:1

我正在使用MediaStore and ContentResolver API通过MediaStore.Images保存图像文件(jpg / png / gif)。它可以工作,但是问题是所有文件都以.jpg扩展名保存,并且文件名始终为“ millis.jpg中的当前时间”

这里是我放入ContentValues中的示例:

date_added=1575480356 _display_name=2067623.gif date_modified=1575480356 mime_type=image/gif

但是将其插入ContentResolver并写入文件后,显示名称将更改为2067623.jpg,文件名称将更改为1575480356.jpg

如何获取它以保留文件名和扩展名

代码:

    ContentResolver resolver = activity.getContentResolver();
    Uri mediaCollection;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        mediaCollection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
    } else {
        mediaCollection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    }

    ContentValues mediaDetails = new ContentValues();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        final String relativeLocation = Environment.DIRECTORY_PICTURES + File.separator + "my_folder";
        mediaDetails.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
        mediaDetails.put(MediaStore.Images.Media.IS_PENDING, 1);
        mediaDetails.put(MediaStore.MediaColumns.RELATIVE_PATH, relativeLocation);
    }
    String mimeType = "image" + "/" + getExtension(p); // jpg/png/gif
    mediaDetails.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
    mediaDetails.put(MediaStore.Images.Media.MIME_TYPE, mimeType);
    mediaDetails.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
    mediaDetails.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000);

    Uri contentUri = resolver.insert(mediaCollection, mediaDetails);

    write(contentUri, resolver, p, fileName); // Write the file content using resolver.openOutputStream(contentUri)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        mediaDetails.clear();
        mediaDetails.put(MediaStore.Images.Media.IS_PENDING, 0);
        resolver.update(contentUri, mediaDetails, null, null);
    }
java android android-contentresolver mediastore scoped-storage
1个回答
0
投票

您找到了情感吗?我没有,所以我最终这样做:

private void addImageToGalleryLegacy(@NonNull final String imagePath, @NonNull final String fileName) throws IOException {
    File fIn = new File(imagePath);
    String outPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
    File fOut = new File(outPath, fileName);
    FileInputStream in = new FileInputStream(fIn);
    FileOutputStream out = new FileOutputStream(fOut);
    copy(in, out);
}

基本上(就像在Q上一样),我们可以将图像直接复制到图库中。就我而言,“ imagePath”是“ Android /数据/ [程序包名称] /文件/图片”。

© www.soinside.com 2019 - 2024. All rights reserved.