getExternalFilesDir(null)返回null

时间:2013-08-21 19:01:09

标签: android

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

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

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

以下是 onCreate()方法中的前三行。实际上,它就在 super.onCreate() setContentView()之后。

String state = Environment.getExternalStorageState();
File extFiles = getExternalFilesDir(null);
File locFiles = getFilesDir();

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

state == "mounted"
extFiles == null
locFiles == "/data/data/com.mypackage.name/files"

有人会对这可能是什么有任何想法吗?

----- ----- EDIT

所以我尝试了另一种方法;我尝试使用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手动创建文件夹并将文件放入其中时,我可以从我的应用程序中读取这些文件,但我无法在该文件夹中写入任何内容。

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

4 个答案:

答案 0 :(得分:29)

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

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

应该是

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

答案 1 :(得分:14)

这是来自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();
}

答案 2 :(得分:0)

删除一行

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"   
AndroidManifest.xml中的

在eclipse中使用“Permission”选项卡将xml编辑器切换为“Android Manifest Permissions”,然后添加

uses-permission "android.permission.WRITE_EXTERNAL_STORAGE" 

点击一下。

然后尝试运行您的应用程序。


似乎eclipse(可能取决于版本或状态或设置的偏差)可以忽略AndroidManifest.xml中直接xml描述的某些词。


感谢您的建议。你是对的,我的回答似乎是在小谈中同意。

答案 3 :(得分:0)

我的问题是我打开了FileOutputStream,然后在关闭FileOutputStream之前,我打开了FileInputStream来查看文件中已有的内容。

我将在打开FileOutputStream之前将FileInputStream打开到,这解决了我的问题。