Android外部存储

2017-03-09  本文已影响278人  CP9

外部存储文件的特点

如何使用外部存储?

第一步,检查sd卡是否可用 —— Environment.getExternalStorageState()

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

第二步,添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

从 Android 4.4 开始,读取或写入应用私有目录中的文件不再需要 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限

第三步,创建文件

如何在外部存储创建公共文件?——Environment.getExternalStoragePublicDirectory()

        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
            return;
        File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
        File file = new File(path, "first.mp3");
        try {
            // 确认Music目录存在
            path.mkdirs();

            InputStream in = getResources().openRawResource(R.raw.guangliang_first);
            FileOutputStream out = new FileOutputStream(file);

            byte[] bytes = new byte[in.available()];
            in.read(bytes);
            out.write(bytes);
            in.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

运行上述代码后,如果出现FileNotFoundException:/storage/emulated/0/****()(Permission denied)的问题,请参阅Andorid的权限控制 或者手动设置(应用管理—>Your App—>权限—>存储),否则会在/storage/emulated/0/Music目录下多出first.mp3文件:

external_music_path.png

注意/storage/emulated/0是模拟器中的目录,在真机中的目录,例如ES文件浏览器中的目录是本地\sdcard

外部存储私有文件的特点

如何在外部存储创建私有文件?—— ContextWrapper.getExternalFilesDir()

和创建公共文件类似,我们只需要更改一行代码

File path = getExternalFilesDir(Environment.DIRECTORY_MUSIC);

运行上述代码后,会在/storage/emulated/0/Android/data/your package/files/Music目录下多出first.mp3文件:

external_private_music_path.png

外部存储私有文件的特点

第四步,通知media scanner文件更新 —— MediaScannerConnection

.....
MediaScannerConnection.scanFile(this,
                    new String[] { file.toString() }, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });

如果不调用此方法,需要手动刷新才能看到创建的文件。

上一篇 下一篇

猜你喜欢

热点阅读