Android:无法确保目录

我一直在使用“ Environment.getExternalStorage() ”来存储和pipe理文件。 而且这个方法没有logcat警告信息,并且工作得很好。

但是,我的项目需要使用方法“ Context.getExternalFilesDir(String type) ”,并有一个警告消息

ContextImpl:无法确保目录:/ storage / external_SD / Android / data /(包名称)/文件

幸运的是,File对象工作正常(读或写或制作文件夹的作品)。

但是我想知道如何解决这个警告信息。 我想念什么?

Solutions Collecting From Web of "Android:无法确保目录"

你应该知道警告信息是如何出现的。

getExternalFilesDir(String type)将调用getExternalFilesDirs(String type) (在第二个方法名的最后注意's')。

getExternalFilesDirs(String type)将查找所有types的目录,并在最后调用ensureDirsExistOrFilter()以确保目录存在。

如果无法达到目录,则会打印警告!

 Log.w(TAG, "Failed to ensure directory: " + dir); dir = null; 

所以,如果你的设备有两个SD卡path,它将产生两个dir。 如果没有,警告就会出现。

结论是警告不需要固定。

如果您有代码迭代文件,多次调用此API,此警告可能会导致日志污染。 为了解决这个问题(因为警告实际上是良性的),你可以创build一个包装类来存储调用getExternalFilesDir / getExternalCacheDir的结果,然后返回存储的值而不是调用API。 这样,至less你只会看到这个消息一次。

我遵循getExternalFilesDir ()源

 /** * Ensure that given directories exist, trying to create them if missing. If * unable to create, they are filtered by replacing with {@code null}. */ private File[] ensureExternalDirsExistOrFilter(File[] dirs) { File[] result = new File[dirs.length]; for (int i = 0; i < dirs.length; i++) { File dir = dirs[i]; if (!dir.exists()) { if (!dir.mkdirs()) { // recheck existence in case of cross-process race if (!dir.exists()) { // Failing to mkdir() may be okay, since we might not have // enough permissions; ask vold to create on our behalf. final IMountService mount = IMountService.Stub.asInterface( ServiceManager.getService("mount")); try { final int res = mount.mkdirs(getPackageName(), dir.getAbsolutePath()); if (res != 0) { Log.w(TAG, "Failed to ensure " + dir + ": " + res); dir = null; } } catch (Exception e) { Log.w(TAG, "Failed to ensure " + dir + ": " + e); dir = null; } } } } result[i] = dir; } return result; } 

立即使用Environment.getExternalStorageDirectory ()获取ExternalDirs

 public final class StorageUtil { public static final String DIR_ANDROID = "Android"; private static final String DIR_DATA = "data"; private static final String DIR_FILES = "files"; private static final String DIR_CACHE = "cache"; @Nullable public static synchronized File getExternalStorageAppFilesFile(Context context, String fileName) { if (context == null) return null; if (fileName == null) return null; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File dirs = buildExternalStorageAppFilesDirs(Environment.getExternalStorageDirectory().getAbsolutePath(), context.getPackageName()); return new File(dirs, fileName); } return null; } public synchronized static File buildExternalStorageAppFilesDirs(String externalStoragePath, String packageName) { return buildPath(externalStoragePath, DIR_ANDROID, DIR_DATA, packageName, DIR_FILES); } public synchronized static File buildPath(String base, String... segments) { File cur = new File(base); for (String segment : segments) { cur = new File(cur, segment); } return cur; } 

}