每个Android设备都支持共享“外部存储” 你可以用它来保存文件。 它可能是一个可移动的存储(如SD卡)也可能是一个固定的内部存储。 文件保存在外部存储中是公开的,当它使USB大容量转移到电脑上时,用户可以修改他们。
警告:如果用户在计算机上安装外部存储或删除媒体,则外部文件可能会消失,而文件保存到外部存储的文件没有安全性。所有应用程序都可以读取和写入文件放置在外部存储和用户可以删除它们。
在外部存储做一些工作之前,你应一致调用getExternalStorageState()方法来检测外部设备是否可用。 设备可能安装在电脑,丢失,只读或其他状态。 例如: 这里如何检测设备是否可用:
/**
* 检测外部存储状态
*/
public void checkExternalStorage(){
boolean mExternalSotrageAvailable = false;
boolean mExternalStorageWriteable = false;
// 获取外部存储状态
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// if the media is present and mounted at its mount point with read/write access.
mExternalSotrageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
// if the media is present and mounted at its mount point with read only access.
mExternalSotrageAvailable = true;
mExternalStorageWriteable = false;
} else {
mExternalSotrageAvailable = mExternalStorageWriteable = false;
}
}
使用SdCard存储数据的方式与内部存储的方式基本一致,但是有三点需要注意的:
- 第一点,需要首先判断是否存在可用的Sdcard,这个可以使用一个访问设备环境变量的类Environment进行判断,这个类提供了一系列的静态方法,用于获取当前设备的状态,在这里获取是否存在有效的Sdcard,使用的是Environment.getExternalStorageState()方法,返回的是一个字符串数据,Environment封装好了一些final对象进行匹配,除了Environment.MEDIA_MOUNTED外,其他均为有问题,所以只需要判断是否是Environment.MEDIA_MOUNTED状态即可。
- 第二点,既然转向了Sdcard,那么存储的文件路径就需要相对变更,这里可以使用Envir.getExternalStorageDirectory()方法获取当Sdcard的根目录,可以通过它访问到相应的文件。
- 第三点,需要赋予应用程序访问Sdcard的权限,Android的权限控制尤为重点,在Android程序中,如果需要做一些越界的操作,均需要对其进行授权才可以访问。在AndroidManifest.xml中添加代码:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
访问外部存储
保存应共享文件
如果你想保存文件没有特定你的应用程序,当你应用程序卸载时它将不会被删除。 保存他们在一个公共的外部存储目录之一中, 这个目录在外部存储根源,如Music/, Pictures/, Ringtones/ 或 其他。
在API版本 8 或更高, 使用getExternalStoragePublicDirectory()方法,你想要传递给它你想要的公共目录类型,如DIRECTORY_MUSIC, DIRECTORY_PICTYRES, 或其他。 该方法将在必要时创建适当的目录。
保存Cache文件
如果你使用的API版本 8 或更高 , 使用 getExternalCacheDir() 打开文件用来代替外部存储目录,在哪里你可以保存临时文件。 如果用户卸载你的应用程序,文件将自动地删除。 然而,在你的应用程序存活的期间,你可以管理这个临时文件,不需要它时为了保护文件空间可以删除它。
如果你使用的API级别7或更低,使用getexternalstoragedirectory()打开一个文件,代表外部存储的根,然后把你的缓存数据在以下目录:
/Android/data/<package_name>/cache/
System.out.println(" getExternalFilesDir.getAbsolutePath() -- >>> " + getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath());
System.out.println(" Environment.getExternalStorageDirectory().getAbsolutePath() -- >>> " + Environment.getExternalStorageDirectory().getAbsolutePath());
System.out.println(" public directory music -- >>> " + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC));
System.out.println(" public directory pictures -- >>> " + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
输出结果:
09-08 16:36:23.170: I/System.out(4407): getExternalFilesDir.getAbsolutePath() -- >>> /storage/emulated/0/Android/data/com.mytest.activity/files/Music
09-08 16:36:23.170: I/System.out(4407): Environment.getExternalStorageDirectory().getAbsolutePath() -- >>> /storage/emulated/0
09-08 16:36:23.170: I/System.out(4407): public directory music -- >>> /storage/emulated/0/Music
09-08 16:36:23.170: I/System.out(4407): public directory pictures -- >>> /storage/emulated/0/Pictures