1. 设备的内部存储空间有限,读写外部存储器可以让应用程序能够存取更大更多的文件。
2. 应用程序在对外部存储器进行读写之前,需要获得对外部存储器操作的权限。一般情况下需要添加的权限有两条:
在外部存储器上创建/删除文件的权限:<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
向外部存储器上写入数据的权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
添加完向外部存储器中写入数据的权限时,也同时包含了从外部存储器中读取数据的权限。
从Android4.4开始,读写外部存储器上应用程序私有文件夹中文件不再需要在AndroidMenifest.xml文件中添加读写权限。
3. 保存在外部存储器上的文件全局可读,只要一个应用程序添加有WRITE_EXTERNAL_STORAGE权限,就可以读取外部存储器上的任何文件,包括外部存储器上应用程序的私有文件夹的文件。当用户允许USB大容量存储器连接到计算机上后,用户也可以修改存储在外部存储器上的文件。如果用户把外部存储器mount到计算机上或拔出,外部存储器将不可访问。
4. 在对外部存储器进行读写之前需要调用Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)判断对外部存储器是否可读写,如果设备中插有SD卡且在AndroidMenifest.xml中已经添加了操作外部存储器的权限,上面函数会返回true.
5. 调用Environment.getExternalStorageDirectory()获取指向外部存储器目录的文件,调用文件的getCanonicalPath()方法获取外部存储器的绝对路径。
6. 向外部存储器中写入数据:首先,获得要写入数据的文件的绝对路径,其次,从文件的绝对路径得到对应该绝对路径的文件targetFile,然后,从targetFile创建RandomAccess对象,调用RandomAccess对象的seek(int)方法和write(byte[])方法写入内容,最后,关闭输出流。当应用程序被卸载时,保存在这里的文件不会被删除。
7. 从外部存储器中读取数据:首先,获得要读取数据的文件的绝对路径,其次,从文件绝对路径得到FileInputStream,并把FileInputStream包装成InputStreamReader,继而包装成BufferedReader,然后,调用BufferedReader的readLine()方法读取文件内容,最后,关闭输入流。
8. 应用程序在外部存储器上新建的文件,如果它们是供用户和其它应用程序可以访问的,且它们是多媒体文件,应该把它们保存在公共目录下,如Music/, Pictures/,这样其它应用程序可以方便地访问它们,用户也可以方便地操作它们。把文件保存在这些媒体相关的公共目录下后,系统的媒体管理器可以在系统中分类管理这些文件。调用getExternalStoragePublicDirectory()并传入文件夹类型参数可以获得该类型对应的公共文件夹目录文件,获得公共文件夹后,就可以在其下创建目录或文件。若想让系统的媒体管理器扫描不到你的文件,在你的文件所在的文件夹中添加一个名为".nomedia"的文件,这样媒体管理器就扫描不到你的文件,但如果这些文件是应用程序私有的,这种方式并不是最好的,应该把它们保存在应用程序的私有文件夹中。当应用程序卸载时,保存在公共文件夹下的文件不会被删除。
9. 应用程序在外部存储器上新建的文件,如果不想让MediaStore content provider识别,应该保存在外部存储器上的私有文件夹中。调用getExternalFilesDir(String)方法返回指向应用程序在外部存储器上的私有文件夹或其子文件夹的文件,应用程序在外部存储器上私有文件夹的根路径在.../sdcard/Android/data/<package nage>/files/,方法中参数表示应用程序在外部存储器上私有文件夹的子文件夹的类型,若为空,方法返回一个指向应用程序在外部存储器上私有文件夹根目录的文件,若传入参数DIRECTORY_MOVIES等,方法返回一个指向根目录下Movies/文件夹的文件,其它类推。当程序被卸载时,存储在外部存储器上的私有文件夹也会被卸载。虽然保存在外部存储器私有文件夹下的文件不会被MediaStore content provider识别, 但是其它具有READ_EXTERNAL_STORAGE权限的应用程序,都可以访问外部存储器上的所有文件,包括外部存储器上的私有文件,所以如果想让自己的数据完全私有,不被其它应用程序访问到,应该把它们保存在内部存储器上自己的私有文件夹中,即保存在路径/data/data/<package name>/路径下。
当向应用程序在外部存储器的私有文件夹中添加文件后,.../sdcard/Android/data/<package nage>/files/如下图所示: