Android

React Native 获取Android文件路径

2019-06-27  本文已影响0人  KooHead

前言

Android代码

/**
 * android 文件路径获取类
 * 参考
 * https://www.cnblogs.com/zxxiaoxia/p/6857466.html
 * https://www.cnblogs.com/mengdd/p/3742623.html
 */
import android.os.Build;
import android.os.Environment;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;

import java.util.HashMap;
import java.util.Map;

public class FileDirModule extends ReactContextBaseJavaModule {
    private static final String DIRECTORY_MUSIC_KEY = "DIRECTORY_MUSIC";
    private static final String DIRECTORY_PODCASTS_KEY = "DIRECTORY_PODCASTS";
    private static final String DIRECTORY_RINGTONES_KEY = "DIRECTORY_RINGTONES";
    private static final String DIRECTORY_ALARMS_KEY = "DIRECTORY_ALARMS";
    private static final String DIRECTORY_NOTIFICATIONS_KEY = "DIRECTORY_NOTIFICATIONS";
    private static final String DIRECTORY_PICTURES_KEY = "DIRECTORY_PICTURES";
    private static final String DIRECTORY_MOVIES_KEY = "DIRECTORY_MOVIES";
    private static final String DIRECTORY_DOWNLOADS_KEY = "DIRECTORY_DOWNLOADS";
    private static final String DIRECTORY_DCIM_KEY = "DIRECTORY_DCIM";
    private static final String DIRECTORY_DOCUMENTS_KEY = "DIRECTORY_DOCUMENTS";
    private static final String DOWNLOAD_CACHE_DIRECTION_KEY = "DOWNLOAD_CACHE_DIRECTION";
    private static final String DATA_DIRECTION_KEY = "DATA_DIRECTION";
    private static final String EXTERNAL_STORAGE_DIRECTION_KEY = "EXTERNAL_STORAGE_DIRECTION";
    private static final String EXTERNAL_FILES_DIR_KEY = "EXTERNAL_FILES_DIR";
    private static final String CACHE_DIR_KEY = "CACHE_DIR";
    private static final String FILES_DIR_KEY = "FILES_DIR";
    private static final String EXTERNAL_CACHE_DIR_KEY = "EXTERNAL_CACHE_DIR";

    private ReactContext reactContext;
    public FileDirModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
    }

    @Override
    public String getName() {
        return "FileDirAndroid";
    }

    /**
     * 下载缓存内容目录
     * @return 路径
     */
    public String getDownloadCacheDirectory () {
        return Environment.getDownloadCacheDirectory().getPath();
    }

    /**
     * 用户数据目录
     * @return 路径
     */
    public String getDataDirectory () {
        return Environment.getDataDirectory().getPath();
    }

    /**
     * 应用外部存储空间(数据文件非私有,可以被手机的系统程序访问(如MP3格式的文件,会被手机系统检索出来),同样,该目录下的文件,所有的APP程序也都是可以访问的,)
     * 这个目录是用来存放各种类型的文件的目录,在这里用户可以分类管理不同类型的文件(例如音乐、图片、电影等);
     * @return 路径
     */
    public String getExternalStoragePublicDirectory (String type) {
        switch (type) {
            case DIRECTORY_MUSIC_KEY:
                return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();
            case DIRECTORY_PODCASTS_KEY:
                return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS).getPath();
            case DIRECTORY_RINGTONES_KEY:
                return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES).getPath();
            case DIRECTORY_ALARMS_KEY:
                return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS).getPath();
            case DIRECTORY_NOTIFICATIONS_KEY:
                return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS).getPath();
            case DIRECTORY_PICTURES_KEY:
                return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath();
            case DIRECTORY_MOVIES_KEY:
                return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getPath();
            case DIRECTORY_DOWNLOADS_KEY:
                return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();
            case DIRECTORY_DCIM_KEY:
                return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();
            case DIRECTORY_DOCUMENTS_KEY:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getPath();
                }
            default:
                return null;
        }
    }

    /**
     * 应用外部存储空间(数据文件私有,系统媒体文件无法访问(例如存了一个MP3文件,通过系统的文件夹管理系统,无法找到)),
     * 当应用被卸载的时候,目录下的文件会被删除,但是这里和getCacheDir()还有不同之处:
     * 只有手机系统使用的是虚拟外部存储(虚拟SD卡,现在绝大多数的手机,都不用外挂物理SD卡了)的时候,
     * 才可以在卸载应用的同时,自动删除该目录下的文件,如果是之前的物理存储(物理SD卡)则不会自动删除该目录,及目录下的文件。
     * 在使用的时候,需要判断外部存储的挂载状态(getExternalStorageState(File)),还需要申请读写权限(READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE)
     * 注:当其他应用拥有SD卡读写权限的时候,可以访问该目录下的文件
     * @return 路径
     */
    public String getExternalStorageDirectory() {
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
            return Environment.getExternalStorageDirectory().getPath();        else
            return reactContext.getFilesDir().getPath();
    }

    /**
     * 获取私有存储空间
     * @return 路径
     */
    public String getExternalFilesDir () {
        return reactContext.getExternalFilesDir(null).getPath();
    }

    /**
     * 应用内部存储空间(数据文件私有)文件存储到这个路径下,不需要申请权限,当应用被卸载的时候,目录下的文件会被删除。
     * 需要注意的是,这个文件的目录和应用的存储位置有关,
     * 当应用被移动到外部存储设备的时候,文件的绝对路径也是变化的,所以建议当数据存储到这个目录的时候,用相对路径。
     * 这个目录和getFilesDir()目录最大的不同在于:当安卓设备的存储空间少,或者不够用的时候,系统会自动删除这个目录下的文件。
     * 官方建议是,超过1MB的文件,建议存储到getExternalCacheDir()目录下
     * @return 路径
     */
    public String getCacheDir () {
        return reactContext.getCacheDir().getPath();
    }

    /**
     * 应用内部存储空间(数据文件私有)文件存储到这个路径下,不需要申请权限,当应用被卸载的时候,目录下的文件会被删除。
     * 需要注意的是,这个文件的目录和应用的存储位置有关,
     * 当应用被移动到外部存储设备的时候,文件的绝对路径也是变化的,所以建议当数据存储到这个目录的时候,用相对路径
     * 系统提供的访问此路径文件的方法是:context.openFileOutput(String,int);context.openFileInput(String name);
     * @return 路径
     */
    public String getFilesDir () {
        return reactContext.getFilesDir().getPath();
    }

    /**
     * 应用外部存储空间(数据文件私有,系统媒体文件无法访问(例如存了一个MP3文件,通过系统的文件夹管理系统,无法找到)),
     * 当应用被卸载的时候,目录下的文件会被删除,但是这里和getCacheDir()还有不同之处:
     * 只有手机系统使用的是虚拟外部存储(虚拟SD卡,现在绝大多数的手机,都不用外挂物理SD卡了)的时候,
     * 才可以在卸载应用的同时,自动删除该目录下的文件,如果是之前的物理存储(物理SD卡)则不会自动删除该目录,及目录下的文件。
     * 在使用的时候,需要判断外部存储的挂载状态(getExternalStorageState(File)),还需要申请读写权限(READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE)
     * 注:当其他应用拥有SD卡读写权限的时候,可以访问该目录下的文件
     * @return 路径
     */
    public String getExternalCacheDir () {
        return reactContext.getExternalCacheDir().getPath();
    }

    @Override
    public Map<String, Object> getConstants() {
        final Map<String, Object> constants = new HashMap<>();
        constants.put(DIRECTORY_MUSIC_KEY, getExternalStoragePublicDirectory(DIRECTORY_MUSIC_KEY));
        constants.put(DIRECTORY_PODCASTS_KEY, getExternalStoragePublicDirectory(DIRECTORY_PODCASTS_KEY));
        constants.put(DIRECTORY_RINGTONES_KEY, getExternalStoragePublicDirectory(DIRECTORY_RINGTONES_KEY));
        constants.put(DIRECTORY_ALARMS_KEY, getExternalStoragePublicDirectory(DIRECTORY_ALARMS_KEY));
        constants.put(DIRECTORY_NOTIFICATIONS_KEY, getExternalStoragePublicDirectory(DIRECTORY_NOTIFICATIONS_KEY));
        constants.put(DIRECTORY_PICTURES_KEY, getExternalStoragePublicDirectory(DIRECTORY_PICTURES_KEY));
        constants.put(DIRECTORY_MOVIES_KEY, getExternalStoragePublicDirectory(DIRECTORY_MOVIES_KEY));
        constants.put(DIRECTORY_DOWNLOADS_KEY, getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS_KEY));
        constants.put(DIRECTORY_DCIM_KEY, getExternalStoragePublicDirectory(DIRECTORY_DCIM_KEY));
        constants.put(DIRECTORY_DOCUMENTS_KEY, getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS_KEY));
        constants.put(DOWNLOAD_CACHE_DIRECTION_KEY, getDownloadCacheDirectory());
        constants.put(DATA_DIRECTION_KEY, getDataDirectory());
        constants.put(EXTERNAL_STORAGE_DIRECTION_KEY, getExternalStorageDirectory());
        constants.put(EXTERNAL_FILES_DIR_KEY, getExternalFilesDir());
        constants.put(CACHE_DIR_KEY, getCacheDir());
        constants.put(FILES_DIR_KEY, getFilesDir());
        constants.put(EXTERNAL_CACHE_DIR_KEY, getExternalCacheDir());
        return constants;
    }

}


import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class FileDirReactPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules;
        modules = new ArrayList<>();
        modules.add(new FileDirModule(reactContext));
        return modules;
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

React Native 代码

import {
  NativeModules,
  Platform
} from 'react-native'
let FileDir = NativeModules.FileDirAndroid

let FileDirAndroid = Platform.OS === 'android' ? {
  directoryMusic: FileDir.DIRECTORY_MUSIC,
  directoryPodcasts: FileDir.DIRECTORY_PODCASTS,
  directoryRingtones: FileDir.DIRECTORY_RINGTONES,
  directoryAlarms: FileDir.DIRECTORY_ALARMS,
  directoryNotifications: FileDir.DIRECTORY_NOTIFICATIONS,
  directoryPictures: FileDir.DIRECTORY_PICTURES,
  directoryMovies: FileDir.DIRECTORY_MOVIES,
  directoryDownloads: FileDir.DIRECTORY_DOWNLOADS,
  directoryDcim: FileDir.DIRECTORY_DCIM,
  directoryDocuments: FileDir.DIRECTORY_DOCUMENTS,
  downloadCacheDirection: FileDir.DOWNLOAD_CACHE_DIRECTION,
  dataDirection: FileDir.DATA_DIRECTION,
  externalStorageDirection: FileDir.EXTERNAL_STORAGE_DIRECTION,
  externalFilesDir: FileDir.EXTERNAL_FILES_DIR,
  cacheDir: FileDir.CACHE_DIR,
  filesDir: FileDir.FILES_DIR,
  externalCacheDir: FileDir.EXTERNAL_CACHE_DIR
} : {}

export default FileDirAndroid

使用方式

import FileDirAndroid from '../components/file_dir'

const externalStorageDirection = FileDirAndroid.externalStorageDirection

上一篇下一篇

猜你喜欢

热点阅读