外部存储文件的特点
- 可能是可移除的存储介质(例如 SD 卡)或内部(不可移除)存储
- 所有应用都能读取和写入放置在外部存储上的文件,并且用户可以移除这些文件
- 如果用户在计算机上装载了外部存储或移除了介质,则外部存储可能变为不可用状态
如何使用外部存储?
第一步,检查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_STORAGE 或 WRITE_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
文件:
注意:
/storage/emulated/0
是模拟器中的目录,在真机中的目录,例如ES文件浏览器中的目录是本地\sdcard
外部存储私有文件的特点
- 当用户卸载您的应用时,此目录及其内容不会被删除。
- 系统媒体扫描程序会读取这些目录中的文件,因此能从 MediaStore 内容提供程序访问这些文件,例如华为手机的文件管理能在分类中的音频找到该文件。
- 应将这些目录用于最终属于用户的媒体,例如使用您的应用拍摄或编辑的照片或用户使用您的应用购买的音乐等 — 这些文件应保存在公共目录中。
如何在外部存储创建私有文件?—— ContextWrapper.getExternalFilesDir()
和创建公共文件类似,我们只需要更改一行代码
File path = getExternalFilesDir(Environment.DIRECTORY_MUSIC);
运行上述代码后,会在/storage/emulated/0/Android/data/your package/files/Music
目录下多出first.mp3
文件:
外部存储私有文件的特点
- 当用户卸载您的应用时,此目录及其内容将被删除。
- 系统媒体扫描程序不会读取这些目录中的文件,因此不能从 MediaStore 内容提供程序访问这些文件。
- 不应将这些目录用于最终属于用户的媒体,例如使用您的应用拍摄或编辑的照片或用户使用您的应用购买的音乐等 — 这些文件应保存在公共目录中。
第四步,通知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);
}
});
如果不调用此方法,需要手动刷新才能看到创建的文件。