天天看点

Android数据存储之External Storage外部存储

前言:

所有 Android 设备都有两个文件存储区域:“内部”和“外部”存储。这些名称在 Android 早期产生,当时大多数设备都提供内置的非易失性内存(内部存储),以及移动存储介质,比如micro SD 卡(外部存储)。一些设备将永久性存储空间划分为“内部”和“外部”分区,即便没有移动存储介质,也始终有两个存储空间,并且无论外部存储设备是否可移动,API 的行为均一致。

外部存储的特点:

  1. 它并非始终可用,因为用户可采用 USB 存储设备的形式装载外部存储,并在某些情况下会从设备中将其移除。
  2. 它是全局可读的,因此此处保存的文件可能不受您控制地被读取。
  3. 当用户卸载您的应用时,保存在Environment.getExternalStoragePublicDirectory()目录里的文件不会被删除,保存在getExternalFilesDir()或getExternalCacheDir()目录里的文件会被删除
  4. 对于无需访问限制以及您希望与其他应用共享或允许用户使用计算机访问的文件,外部存储是最佳位置。
  5. 如果您的应用需要只需读取外部存储,需在清单文件申请android.permission.READ_EXTERNAL_STORAGE权限
  6. 如果您的应用需要写入(隐含读取)外部存储,只需在清单文件申请android.permission.WRITE_EXTERNAL_STORAGE权限

使用说明:

import android.content.Context;
import android.os.Environment;
import android.util.Log;

import java.io.File;

public class ExternalStorage {
    /**
     * 检查外部存储是否可读写(可写隐含可读)
     */
    public static boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        }
        return false;
    }

    /**
     * 检查外部存储是否至少可读
     */
    public static boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return true;
        }
        return false;
    }

    /**
     * 在外部存储上保存公共文件:创建公共相册的目录
     * @return /外部存储根目录/Pictures/albumName
     */
    public static File getAlbumStorageDir(String albumName) {
        // getExternalStoragePublicDirectory()的参数只能是Environment API常数提供的目录名称
        // 这些目录名称可确保系统正确处理文件。 例如,保存在 DIRECTORY_RINGTONES 中的文件由系统媒体扫描程序归类为铃声,而不是音乐。
        File file = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), albumName);
        if (!file.mkdirs()) {
            Log.e("LOG_TAG", "Directory not created");
        }
        return file;
    }

    /**
     * 在外部存储上保存私有文件:创建个人相册的目录
     * @return /外部存储根目录/Android/data/package_name/Pictures/albumName
     */
    public static File getAlbumStorageDir(Context context, String albumName) {
        // getExternalFilesDir()的参数只能是Environment API常数提供的目录名称
        // 如果没有适合您的名称,可以传null,这将返回外部存储上您的应用的专用目录的根目录
        File file = new File(context.getExternalFilesDir(
                Environment.DIRECTORY_PICTURES), albumName);
        if (!file.mkdirs()) {
            Log.e("LOG_TAG", "Directory not created");
        }
        return file;
    }

    /**
     * 获得外部存储上私有缓存根目录
     * @return /外部存储根目录/Android/data/package_name/cache
     */
    public static File getCacheDir(Context context) {
        return context.getExternalCacheDir();
    }

    /**
     * 获得外部存储根目录
     */
    public static File getRoot() {
        return Environment.getExternalStorageDirectory();
    }

}