我一直在使用" Environment.getExternalStorage()
&#34;存储和管理文件。 <{1}}使用该方法没有任何警告信息,并且工作得很好。
但是,我的项目需要使用方法&#34; logcat
&#34;并且有一条警告信息
ContextImpl:无法确保目录:/ storage / external_SD / Android / data /(包名称)/ files
幸运的是,File对象工作正常(读取或写入或使文件夹工作)。
但我想知道如何解决该警告信息。我想念一下吗?
答案 0 :(得分:10)
你应该知道警告信息是如何出现的。
getExternalFilesDir(String type)
会致电getExternalFilesDirs(String type)
(请注意第二个方法名称最后的&#39;)
getExternalFilesDirs(String type)
将找到该类型的所有目录,并在末尾调用ensureDirsExistOrFilter()
以确保目录存在。
如果无法到达目录,则会打印警告!
Log.w(TAG, "Failed to ensure directory: " + dir);
dir = null;
因此,如果您的设备有两个SD卡路径,它将生成两个目录。如果没有,则会出现警告。
结论是警告不需要修复。
答案 1 :(得分:1)
如果您的代码是迭代文件,多次调用此API,此警告可能会导致日志污染。要解决此问题(因为警告实际上是良性的),您可以创建一个包装类,该类存储调用getExternalFilesDir / getExternalCacheDir的结果,然后返回存储的值而不是调用API。这样,至少你只会看到一次这条消息。
答案 2 :(得分:0)
我按照 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;
}
}