由图可以看出
Environment.getExternalStorageDirectory()
方法存储6.0以后需要用户授权,在该方法下app卸载之后数据还保留在SDCard
中,留下了垃圾数据。
Context.getExternalFilesDir()
、Context.getExternalCacheDir()
、getFilesDir()
、getCacheDir()
相同点:
app卸载后,目录下的数据都会被清空。
Context.getExternalFilesDir()
、Context.getExternalCacheDir()
、getFilesDir()
、getCacheDir()
不同点:
- 目录的路径不同:前两个的目录在外部SD卡上。后两个的目录在app内部存储上。
- 前两个的路径在手机里可以直接看到。后两个的路径需要root以后,用Root Explorer 文件管理器才能看到。
- Context.getExternalFilesDir()和getFilesDir()用来存储一些长时间保存的数据(手机助手在清理垃圾时不会清理掉),Context.getExternalCacheDir()、getCacheDir()用来存储一些临时缓存数据(手机助手在清理垃圾时能清理掉)
/**获取app缓存路径
*/
publicStringgetCachePath(Contextcontext) {
String cachePath;
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) {
cachePath = context.getExternalCacheDir().getPath();//外部存储可用
}else{
cachePath = context.getCacheDir().getPath();//外部存储不可用
}
returncachePath;
}
个人遇到的问题
- 在版本更新是使用getFilesDir或getCacheDir为存储路径出现解析包错误问题,解决办法
//修改apk权限
public static voidchmod(Stringpermission,Stringpath) {
try{
String command ="chmod "+ permission +" "+ path;
Runtime runtime =Runtime.getRuntime();
runtime.exec(command);
}catch(IOExceptione) {
e.printStackTrace();
}
}
private void installApk() {
chmod("777",apkFile.getPath());
Intent intent =new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(apkFile),"application/vnd.android.package-archive");
startActivity(intent);
}
- 使用getCacheDir保存数据,但是用户反馈第二天数据丢失
原因:用户安装了手机助手,开启了定时清理垃圾数据,使用Context.getExternalCacheDir()
或getCacheDir()
保存的数据会被认为是垃圾然后被清理,应使用Context.getExternalFilesDir()
和getFilesDir()
来存储一些长时间保存的数据
网友评论