getExternalFilesDir(null)返回null

Dew*_*oel 19 android

我再一次提出了一个问题,这个问题已经被问过并在之前得到了解答,但在我的实施中,它仍然无效.

我在主要活动的onCreate方法的最开始就调用了getExternalFilesDir(null).它每次都返回null,无论是在AVD中运行还是在我的手机上运行(Samsung Galaxy Plus).

是的,我<uses-permission android:name="android.permissions.WRITE_EXTERNAL_STORAGE" />AndroidManifest.xml中有一行,是的,我在拨打电话之前检查外部存储状态并且已挂载.

这是我的onCreate()方法中的前三行.实际上,它只是在super.onCreate()setContentView()调用之后.

String state = Environment.getExternalStorageState();
File extFiles = getExternalFilesDir(null);
File locFiles = getFilesDir();
Run Code Online (Sandbox Code Playgroud)

因此,一旦执行了这三行,这些就是变量的值:

state == "mounted"
extFiles == null
locFiles == "/data/data/com.mypackage.name/files"
Run Code Online (Sandbox Code Playgroud)

谁会有任何想法,为什么这可能是?

- - -编辑 - - -

所以我尝试了另一种方法; 而不是使用getExternalFilesDir(null),我尝试使用File basePath = new File(Environment.getExternalStorageDirectory(), "myAppName");

这不是理想的,我知道Android文档说,我同意它,你应该使用getExternalFilesDir().虽然我不得不尝试别的东西,但这看起来并不适合我.这次函数确实返回一个有效的File对象,因此,在上面一行之后,basePath的路径是/ mnt/sdcard/myAppName.到现在为止还挺好.当我用DDMS检查时,我可以看到/ mnt/sdcard存在但不是/ mnt/sdcard/myAppName.这是可以预料的.所以我打电话boolean result = basePath.mkdirs();

但这会返回false,当我检查文件系统时,我可以确认尚未创建myAppName子文件夹.当我通过DDMS手动创建文件夹并将文件放入其中时,我可以从我的应用程序中读取这些文件,但我无法在该文件夹中写入任何内容.

请帮忙!我的智慧结束了.

Fun*_*onk 30

如果你发布问题时这不是拼写错误,你可能会因此而讨厌自己:

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

应该

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

  • 先生,您是我最好的朋友!我爱你:-)天哪,我已经失去了一整天这个愚蠢的错字.感兴趣的是,在你的帖子前几分钟我发现我没有得到我要求的许可,但我无法弄清楚原因.我添加了这行代码:`(checkCallingOrSelfPermission("android.permission.WRITE_EXTERNAL_STORAGE")== PackageManager.PERMISSION_GRANTED)`,其值为**false**.编译器是否生成任何类型的输出,以指示清单中何时出现这些类型的错误? (4认同)
  • 不是我知道的,在Android工作室中持有ctrl(cmd on mac)会在鼠标悬停时强调已知权限,但由于您可以请求其他可能没有代码的应用程序的权限,因此很难确定给定的权限是否实际上是拼写错误 (4认同)

Ale*_*kov 15

这是来自Android文档:

返回在外部存储上保存应用程序文件的目录的路径.如果当前未安装外部存储,则返回null,因此无法确保路径存在; 您需要在可用时再次调用此方法.

另一个选项是您可以检查外部存储是否可用:

String state = Environment.getExternalStorageState();
File filesDir;

// Make sure it's available
if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    filesDir = getExternalFilesDir(null);
} else {
    // Load another directory, probably local memory
    filesDir = getFilesDir();
}
Run Code Online (Sandbox Code Playgroud)

  • 注意!API8 +上有`getExternalFilesDir()`,API19 +(KitKat)也无法访问`getFilesDir()`.谨慎行事:) (4认同)
  • 我正在检查媒体是否已安装.如果函数因为"当前未安装外部存储器"而返回null,那么为什么我上面代码中**状态**的值将被"挂载"**? (2认同)