上下文 - 无法创建外部文件目录

Context - unable to create external files directory

当您在 Nexus 4 上启动应用程序时,我的应用程序出现了一个非常奇怪的问题。

我在应用程序 class:

中有以下代码
public class MyApp extends Application {

@Override
public void onCreate() {
    super.onCreate();
    File dir = this.getExternalFilesDir(null);
    if (dir == null) {
        Log.e("App", "Problem with my dir!");
    }
}

在 LogCat 我看到消息:

12-11 14:09:05.402 11739-11739/com.company.app W/ContextImpl: Unable to create external files directory
12-11 14:09:05.402 11739-11739/com.company.app E/App: Problem with my dir!

我的 AndroidManifest.xml 中已有 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

此外,此问题仅在我重新安装我的应用程序并且不重启我的设备时出现。如果我重新启动 Nexus,问题就会消失。

这个简单的代码片段有什么问题?..

预先感谢您的回复。

你必须这样做

File dir = new File (this.getExternalFilesDir(null) + "/NewDirectory");  
if(!dir.exists()){
  f.mkdirs();// if there is no directory then create new
}

使用getExternalFilesDir()时无需添加权限。只有在使用 getExternalStorageDirectory()

时才需要

我终于找到了这种奇怪行为的原因。

在我的应用程序中,在 Application class 中进行一些初始化后,我已经开始这样的记录过程:

String[] cmd = new String[] {
    "logcat", "-f", myFileNameFromExternalDir, "-v", "time"
};
Runtime.getRuntime().exec(cmd);

而且我没有在任何地方破坏这个过程。这就是为什么在重新安装我的应用程序后,Android 无法创建外部文件目录或缓存目录。

总结:

  1. 如果你启动了某个进程,不要忘记销毁它,例如:

    进程进程=Runtime.getRuntime().exec(cmd); ... process.destroy();

  2. 要检查,如果您的设备上有一些异常进程运行,您可以使用adb shell。例如:

在Windowscmd

adb shell

在Androidshell

ps - 它将列出您设备上的所有进程。

如果您发现了一些有趣的东西,您可以使用 lsof 命令检查此进程是否属于您的应用程序:

lsof -p process_name | grep app_package