内部存储
应用可以直接在设备的内部存储中保存文件而无需申请权限。默认情况下,保存到内部存储的文件是应用的私有文件,其他应用(和用户)不能访问。应用被卸载这些文件也会被删除。内部存储一般保存datebase、ShapredPreferences等文件
方法名 | 6.0获取的路径 | 6.0系统是否需要运行时权限 | 5.1 获取的路径 |
---|---|---|---|
Context.getCacheDir() | /data/user/0/包名/cache | 否 | /data/data/包名/cache |
Context.getFilesDir() | /data/user/0/包名/files | 否 | /data/data/包名/files |
Context.getDir(String name,Context.MODE_PRIVATE) | /data/user/0/包名/app_name | 否 | /data/data/包名/app_name |
Context.getPackageCodePath() | /data/app/包名-1/base.apk | 否 | 一样 |
Context.getPackageResourcePath() | /data/app/包名-1/base.apk | 否 | 一样 |
Context.getDatabasePath(String datebaseName) 返回用openOrCreateDatabase()方法创建的datebase在文件系统中的绝对路径 | /data/user/0/包名/databases/datebaseName | 否 | /data/data/包名/datebases |
Environment.getDataDirectory() | /date | 否 | 一样 |
Environment.getDownloadCacheDirectory() | /cache | 否 | 一样 |
Environment.getRootDirectory() | /system | 否 | 一样 |
外部存储
外部存储分为两种,一种是不可移除的内置SD卡,另一种是可移除的外置SD卡或OTG设备。保存到外部存储的文件时全局可读取文件,
要读取或写入外部存储上的文,必须获取 READ_EXTERNAL_STORAGE
或 WRITE_EXTERNAL_STORAGE
,如果同时需要读取和写入文件,则只需请求 WRITE_EXTERNAL_STORAGE
权限,因为此权限也隐含了读取权限要求。
/* 检查是否可读写 */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* 检查是否可读 */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
外部公共文件
方法名 | 6.0获取的路径 | 6.0系统是否需要运行时权限 | 5.1 获取的路径 |
---|---|---|---|
Environment.getExternalStorageDirectory() | /storage/emulated/0 | 是 | /storage/sdcard |
Environment.getExternalStoragePublicDirectory(String type) type既可以自己指定,也可以使用Environment.DIRECTORY_MUSIC等sdk已定义常量 | /storage/emulated/0/type | 是 | /storage/sdcard/type |
例如,以下方法在公共图片目录中创建了一个用于新相册的目录:
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
私有文件
从 Android 4.4 开始,读取或写入应用私有目录中的文件不再需要 READ_EXTERNAL_STORAGE
或 WRITE_EXTERNAL_STORAGE
权限,因此可以通过添加 maxSdkVersion 属性来声明,只能在较低版本的 Android 中请求该权限:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
...
</manifest>
方法名 | 6.0获取的路径 | 6.0系统是否需要运行时权限 | 5.1 获取的路径 |
---|---|---|---|
getExternalCacheDir() | /storage/emulated/0/Android/data/包名/cache | 否 | /storage/sdcard/Android/data/包名/cache |
getExternalFilesDir(String type) | /storage/emulated/0/Android/data/包名/files/type | 否 | /storage/sdcard/Android/data/包名/type |
type既可以自己指定,也可以使用Environment.DIRECTORY_MUSIC等sdk已定义常量,如果为空字符串或null,则返回/storage/emulated/0/Android/data/包名/files
尽管 MediaStore 内容提供程序不能访问 getExternalFilesDir()
和 getExternalFilesDirs()
所提供的目录,但其他具有 READ_EXTERNAL_STORAGE
权限的应用仍可访问外部存储上的所有文件,包括上述文件。
当应用被卸载时,这些目录也会被删除