簡體   English   中英

將媒體文件保存在 android

[英]Saving media files in android

我剛開始使用 android 開發,我對如何將媒體文件保存到外部存儲中的自定義文件夾感到非常困惑。 我已經閱讀了有關范圍存儲、Mediastore 的信息,但我仍然不明白。

我正在嘗試將文件保存到外部存儲中我自己的文件夾中(就像外部存儲中的 Whatsapp 文件夾一樣)。 我希望結構是這樣的:

(EXTERNAL STORAGE ROOT)
 |--- (RandomFolder)
 |--- (Whatsapp)
 |--- (MyFolder)
        |---(Images)
        |---(Videos)
 |--- ...

我不希望媒體文件存儲在默認媒體目錄(例如 Pictures/ 或 DCIM/)中。 我有一些問題:

  1. 使用哪一個? 范圍存儲或媒體存儲 API?
  2. 如何實現上述內容?

附加信息:

  1. 即使卸載應用程序,我也希望文件保留
  2. 我的應用程序針對 Android 10 (API 29),但 minSdkVersion 是 Android 8.0 (API 26)
  3. 我將使用 OutputStream 來保存我的文件。

那么我應該采取哪種方法呢?

您可以將圖像和其他媒體文件保存到外部存儲中,但是,為了讓這些文件顯示在其他應用程序中,例如圖庫應用程序,您需要在 MediaStore 中注冊它們。 你是如何保存文件的? 您是從頭開始創建文件還是只是從另一個目錄復制它們?

下面是如何將 Bitmap object(jpg 或 png)保存到外部存儲並在 MediaStore 中注冊的示例。 首先從 MediaStore 中刪除文件的任何現有記錄,然后使用 ContentResolver.insert() 方法將 Bitmap 保存到外部存儲中。

請注意,MediaStore 中的 DATA 列是指文件的完整路徑。

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import java.io.File;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Objects;

public class SaveImageToMediaStore
{
    public static boolean saveImage(
            Context context, Bitmap bitmap,
            int jpgQuality, int pngQuality, String fileFullPath)
    {
        try
        {
            deleteFileFromMediaStore(context, fileFullPath);

            saveImageAndInsertIntoMediaStore(context, fileFullPath, bitmap, jpgQuality, pngQuality);

            return true;
        }
        catch (Exception ex) { return false; }
    }

    public static boolean saveImageAndInsertIntoMediaStore(
            Context context, String fileFullPath,
            Bitmap bitmap, int jpgQuality, int pngQuality)
    {
        try
        {
            Bitmap.CompressFormat format;
            int quality;
            String mimeType;

            if (fileFullPath.toLowerCase().endsWith(".jpg") ||
                    fileFullPath.toLowerCase().endsWith(".jpeg"))
            {
                format = Bitmap.CompressFormat.JPEG;
                quality = jpgQuality;
                mimeType = "image/jpg";
            }
            else if (fileFullPath.toLowerCase().endsWith(".png"))
            {
                format = Bitmap.CompressFormat.PNG;
                quality = pngQuality;
                mimeType = "image/png";
            }
            else
            {
                return false;
            }

            ContentValues contentValues = new ContentValues();
            contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, getShortName(fileFullPath));
            contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
            contentValues.put(MediaStore.MediaColumns.DATA, fileFullPath);

            ContentResolver resolver = context.getContentResolver();
            Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
            OutputStream out = resolver.openOutputStream(Objects.requireNonNull(uri));
            bitmap.compress(format, quality, out);
            Objects.requireNonNull(out).close();

            return true;
        }
        catch (Exception ex) { return false; }
    }

    public static boolean deleteFileFromMediaStore(
            Context context, String fileFullPath)
    {
        File file = new File(fileFullPath);

        String absolutePath, canonicalPath;
        try { absolutePath = file.getAbsolutePath(); }
        catch (Exception ex) { absolutePath = null; }
        try { canonicalPath = file.getCanonicalPath(); }
        catch (Exception ex) { canonicalPath = null; }

        ArrayList<String> paths = new ArrayList<>();

        if (absolutePath != null) paths.add(absolutePath);
        if (canonicalPath != null && !canonicalPath.equalsIgnoreCase(absolutePath))
            paths.add(canonicalPath);

        if (paths.size() == 0) return false;

        ContentResolver resolver = context.getContentResolver();
        Uri uri = MediaStore.Files.getContentUri("external");

        boolean deleted = false;

        for (String path : paths)
        {
            int result = resolver.delete(uri,
                    MediaStore.Files.FileColumns.DATA + "=?",
                    new String[] { path });

            if (result != 0) deleted = true;
        }

        return deleted;
    }

    public static String getShortName(String path)
    {
        if (path.endsWith("/")) path = path.substring(0, path.length() - 1);

        int pos = path.lastIndexOf('/');

        if (pos == -1) return path;

        return path.substring(pos + 1);
    }

}

暫無
暫無

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

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