Android 如何创建文件夹";安卓/数据/你的“软件包/缓存”;在SD卡上的“后”;“清晰数据”;从背景开始?

Android 如何创建文件夹";安卓/数据/你的“软件包/缓存”;在SD卡上的“后”;“清晰数据”;从背景开始?,android,caching,Android,Caching,在我使用getExternalCacheDir()获取缓存图像的ext cache dir路径之前,但有时我从设置AppInfo中单击“清除数据”,然后getExternalCacheDir()返回null,因为所有包文件夹都已从“Android/data”中删除,所以我想我可以先生成它,但我尝试了一些方法,但我无法成功地做到这一点,有人能教我怎么做吗?为什么我不能创建此目录?而在这种情况下,如何做会更优雅的解决方案呢 谢谢 public static String getAppCa

在我使用getExternalCacheDir()获取缓存图像的ext cache dir路径之前,但有时我从设置AppInfo中单击“清除数据”,然后getExternalCacheDir()返回null,因为所有包文件夹都已从“Android/data”中删除,所以我想我可以先生成它,但我尝试了一些方法,但我无法成功地做到这一点,有人能教我怎么做吗?为什么我不能创建此目录?而在这种情况下,如何做会更优雅的解决方案呢

谢谢

      public static String getAppCacheStorageDir(Context context,String folder) {

//      http://stackoverflow.com/questions/10123812/diff-between-getexternalfilesdir-and-getexternalstoragedirectory
//      http://stackoverflow.com/questions/16562165/getexternalcachedir-returns-null-after-clearing-data        

//      final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ?
//      context.getExternalCacheDir().getPath() : context.getCacheDir().getPath();
////    return cachePath + File.separator + context.getPackageName()+ File.separator +folder;
//    return cachePath + File.separator +folder;

      boolean isExtStorageMounted = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ?
                                    true: false;
      if(isExtStorageMounted){
          if(checkOrRebaseAppExtCacheDir(context)){
              return context.getExternalCacheDir().getPath()+ File.separator +folder; 
          }else{
              return context.getCacheDir().getPath() + File.separator +folder; 
          }
      }

      return context.getCacheDir().getPath() + File.separator +folder; 

    }



    public static boolean checkOrRebaseAppExtCacheDir(Context context){

      String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ?
              Environment.getExternalStorageDirectory().getPath()
              +File.separator+"Android"
              +File.separator+"data"
              +File.separator+context.getPackageName()
              +File.separator+"cache"
              : 
              null;
      if(cachePath!=null){
          File file = new File(cachePath);
          if (!file.exists()) {
              getPermissionForAppExtCacheDir(context);
              return file.mkdirs();
          }else{ return true; }
      }else{
          return false;
      }



    }
    public static void getPermissionForAppExtCacheDir(Context context)
    {
          String command = "chmod 777 " 
                  +  
                  Environment.getExternalStorageDirectory().getPath()
                  +File.separator+"Android"
                  +" "+
                  Environment.getExternalStorageDirectory().getPath()
                  +File.separator+"Android"
                  +File.separator+"data"
                  +" "+
                  Environment.getExternalStorageDirectory().getPath()
                  +File.separator+"Android"
                  +File.separator+"data"
                  +File.separator+context.getPackageName()
                  +" "+
                  Environment.getExternalStorageDirectory().getPath()
                  +File.separator+"Android"
                  +File.separator+"data"
                  +File.separator+context.getPackageName()
                  +File.separator+"cache"
                  ;
          Runtime runtime = Runtime.getRuntime();
          try {
            runtime.exec(command);
          } catch (IOException e) {
            e.printStackTrace();
          }
    }
在我补充之前

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

我在我的Android项目中使用它

public static void createDirectory(File dir) throws IllegalStateException{
  if (!dir.exists()){
    if(!dir.mkdirs()){
      throw new IllegalStateException(
        "Check if you've added permissions in AndroidManifest.xml: \n" +
        "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/> \n"
      );
    }
  }
}

context是视图中的活动、应用程序或getContext()

将以下代码添加到checkOrRebaseAppExtCacheDir()方法中


谢谢,在我添加这个权限之前,你知道我为什么不能创建那个目录吗?这就是权限的含义:如果你不信任这个开发者,你可以避免安装他的应用程序。因此,作为开发人员,您应该在AndroidManifest.xml文件中明确定义应用程序权限。在那里可以找到所有权限:第二个可能的答案是:如果失败,root.mkdirs()只返回false,但不抛出异常。这是无声失败的例子。它不起作用。If failed root.mkdirs()只返回false,但不抛出异常
File sdDir = Environment.getExternalStorageDirectory();
String packageName = context.getPackageName();
File dir = new File(sdDir, "/Android/data/"+packageName+"/cache/");
createDirectory(dir);
         try{
          File root = new File(Environment.getExternalStorageDirectory(), "/Android/data/"+packageName+"/cache/");
               if (!root.exists()) {
                   root.mkdirs();
                }
                //Do your stuff.
          }
          catch(Exception e){
                  Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show();
          }