1.internal or external storage
内部存储和外部存储的对比:
1.内部存储永远可以访问,由于外部存储可能是SD卡,可能无法访问;
2.内部存储文件只有本App才能访问,外部存储文件可以共享给其他APP;
3.卸载APP,相应的内部存储文件被系统删除;对于外部存储,除非使用getExternalFilesDir()方法,APP删除,相应的文件不被删除;
4.访问内部存储文件,不需要申请权限;
2.存储文件到内部存储
在没有root的前提下,内部存储目录是隐藏不可见的;访问内部存储目录时,不需要申请系统权限;由于从Android6.0开始支持多用户,内部存储目录路径从之前的/data/data变成了/data/user/0 。
1.getFilesDir();
/data/user/0/packname/files
2.getCacheDir();
/data/user/0/packname/cache
3.存储文件到外部存储
3.1 申请权限
同时申请读写外部存储权限:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
从Android4.4开始,getExternalFilesDir()和getExternalCacheDir()方法不需要申请权限;所以如果你的App支持4.3或者更低版本,并且你要访问私有文件,你需要这么申请权限:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
...
</manifest>
3.2 判断外部存储是否可用
因为外部存储可能不可用——例如当用户将存储挂载到PC上或删除SD卡时——在访问卷之前,您必须验证外部存储是否可用。您可以通过调用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;
}
3.3 Public files
在申请权限并且确定外部存储可用后,外部存储文件有两种类型:
Public files:公共文件其他App可以访问,路径例如/storage/emulated/0/Documents;卸载当前App后,这些文件仍然保留。例如:DCIM,MUSIC等。
3.4 Private files
Private files:因为这些文件本身属于外部存储文件,所以通过一些方法能被其他App访问;但是这些文件属于对应的APP,路径例如/storage/emulated/0/Android/data/packagename/cache当App删除后,这些文件也被删除。
4.测试Demo
package com.example.davidhuang.storagepath;
import android.content.Context;
import android.net.Uri;<