簡體   English   中英

使用 Android 的 MediaStore(ContentResolver/scoped storage)創建圖像文件后文件擴展名和文件名錯誤

[英]Wrong file extension and file name after creating image file with Android's MediaStore (ContentResolver/scoped storage)

我使用的是MediaStore和ContentResolver的API使用,以保存圖像文件(JPG / PNG / GIF) MediaStore.Images 它可以工作,但問題是所有文件都以 .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);
    }

你找到答案了嗎? 我沒有,所以我最終這樣做了:

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);
}

基本上(就像我們在 pre Q 中一樣)我們可以將圖像直接復制到畫廊。 在我的例子中,“imagePath”是“Android/data/[package name]/files/Pictures”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM