Android文件存储

Android文件存储_第1张图片
网上找的截图

由图可以看出
Environment.getExternalStorageDirectory()方法存储6.0以后需要用户授权,在该方法下app卸载之后数据还保留在SDCard中,留下了垃圾数据。

Context.getExternalFilesDir()Context.getExternalCacheDir()getFilesDir()getCacheDir()相同点:

app卸载后,目录下的数据都会被清空。

Context.getExternalFilesDir()Context.getExternalCacheDir()getFilesDir()getCacheDir()不同点:

  1. 目录的路径不同:前两个的目录在外部SD卡上。后两个的目录在app内部存储上。
  1. 前两个的路径在手机里可以直接看到。后两个的路径需要root以后,用Root Explorer 文件管理器才能看到。
  2. 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()来存储一些长时间保存的数据

你可能感兴趣的:(Android文件存储)