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