外部存储external storage和内部存储internal storage
访问外部存储的权限
从Android 1.0开始,写操作受权限WRITE_EXTERNAL_STORAGE保护。
从Android 4.1开始,读操作受权限READ_EXTERNAL_STORAGE保护。
从Android 4.4开始,应用可以管理在它外部存储上的特定包名目录,而不用获取WRITE_EXTERNAL_STORAGE权限。
比如,一个包名为com.example.foo的应用,可以自由访问外存上的Android/data/com.example.foo/目录。
外部存储对数据提供的保护较少,所以系统不应该存储敏感数据在外部存储上。
特别地,配置和log文件应该存储在内部存储中,这样它们可以被有效地保护。
对于多用户的情况,一般每个用户都会有自己独立的外部存储,应用仅对当前用户的外部存储有访问权限。
申请权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
internal storage 内部存储
内部存储不是内存,是位于位于系统磁盘中一个独特的位置。/data/ 文件夹就是内部存储,内部存储中一般存储一些应用的数据,如apk,shareprefence、database数据,webview缓存和图片缓存等。内部存储中还有一个文件夹每个应用都只有一个,里面中数据在应用卸载之后,就会被删除。结构如:/data/data/你的应用的包名/。其次还有一个 /data/app/ 的文件夹,这里面存储着我们手机上安装的apk文件。
特点
- 内部存储的文件和目录只能被我们的app自己所访问,别的app不能访问。
- 内部存储中的私有目录,当用户卸载app之后,改文件目录中关于该应用的信息就会被删除。
- 内部存储是可用的。
- 内部存储大小有限,不适合存储大量数据。
- 只有root的手机,才能从手机文件管理器看见,否则都是隐藏着的。
Context.getCacheDir(); 该方法返回/data/data/包名/cache的File对象 这个文件里面的数据在设备内存不足的时候,会被系统删除数据。注意:你不能依赖系统帮你删除这些文件,当这个文件夹里面的数据超过1MB的时候,系统会删除这个文件夹里面的数据。
Context.getFilesDir() 该方法返回/data/data/youPackageName/files的File对象
external storage 外部存储
外部存储并不是指拓展的SD卡,不管有无外接设备,每个Android手机都有外部存储。一般的mnt或者storage目录。外部存储中分两类目录,私有目录和公有目录,私有目录的数据会随着应用的卸载而删除,公有目录则不会。
特点
- 公有目录任何程序都可以访问,私有目录自身可以访问。
- 并不一定是可用的,因为SD卡会被挂载。
- 外部存储中的私有目录中的数据会随着应用的卸载而删除,公有目录则不会。
公有目录
公有目录是任何程序都可以访问
需要申请读写权限
可以通过两种方法获取
1.
File sdCard = Environment.getExternalStorageDirectory();
这个sdCard的路径为mnt/sdcard/ 即为SD卡根路径,我们可以指定访问的文件夹名
File sdCard = Environment.getExternalStorageDirectory();
File directory_pictures = new File(sdCard, "Pictures");
Log.i(TAG,"directory_pictures="+directory_pictures);
得到的路径如下: directory_pictures=/mnt/sdcard/Pictures
2.
File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Log.e(TAG, "directory_pictures="+directory_pictures);
得到的路径如下:directory_pictures=/mnt/sdcard/Pictures
第二种方法是一个更加方便的访问Android给我们提供好的一些公共目录的方法,第一种方式更加灵活,可以自己指定目录。
通过Environment.getExternalStoragePublicDirectory(String type)来获取这些目录 /storage/emulated/0/ (/mnt/sdcard/)
type:
DIRECTORY_MUSIC 音乐 /storage/emulated/0/Music
DIRECTORY_PODCASTS 播客 /storage/emulated/0/Podcasts
DIRECTORY_RINGTONES 铃声 /storage/emulated/0/Ringtones
DIRECTORY_ALARMS 闹钟/storage/emulated/0/Alarms
DIRECTORY_NOTIFICATIONS 通知/storage/emulated/0/Notifications
DIRECTORY_PICTURES 图片/storage/emulated/0/Pictures
DIRECTORY_MOVIES 电影/storage/emulated/0/Movies
DIRECTORY_DOWNLOADS 下载文件存储路径/storage/emulated/0/Download
DIRECTORY_DCIM 媒体文件/storage/emulated/0/DCIM
DIRECTORY_DOCUMENTS 文档/storage/emulated/0/Documents
私有目录
外部存储中的私有目录是不会自动创建的,需要开发者自己创建,私有目录应用本身无需申请动态权限,就能直接访问。我们可以在私有目录下新建我们自己的文件夹
getExternalFilesDir(“files目录的子目录名称”)
/storage/emulated/0/Android/data/包名/files/子目录 一般放一些长时间保存的数据
getExternalCacheDir()
/storage/emulated/0/Android/data/包名/cache 一般存放临时缓存数据
从KITKAT 即Android 4.4开始,如果你的应用只是需要存储一些内部数据,可以考虑使用 :
getExternalFilesDir(String)或者getExternalCacheDir(),它们不需要获取权限。
从Android 4.4这两个方法不需要读写权限,是针对于本应用来说,如果要访问其他应用的相关目录,还是需要声明读写权限。
Android 4.4之前的版本要访问的话还是要声明读写权限的,如果没有在manifest中写权限,上面两个get方法都会返回null。
有些时候我们的手机没有安装SD卡,所以我们使用前需要判断一下:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//SD卡已装入
}
https://blog.csdn.net/GD_W001/article/details/84027257
https://blog.csdn.net/nugongahou110/article/details/48154859