22

再一次,我遇到了一个之前已经提出并回答过的问题,但在我的实施中它仍然无法正常工作。

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

是的,我的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"

有人对为什么会这样有任何想法吗?

- - -编辑 - - -

所以我尝试了另一种方法;而不是使用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

4 回答 4

35

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

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

应该

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

于 2013-08-22T08:33:53.253 回答
22

这是来自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();
}
于 2013-08-21T19:07:38.830 回答
0

删除一行

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"   

AndroidManifest.xml.

在eclipse中使用“权限”选项卡将xml编辑器切换到“Android Manifest Permissions”,并添加一个

uses-permission "android.permission.WRITE_EXTERNAL_STORAGE" 

点击几下。

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


似乎 eclipse(可能取决于版本或状态或设置的差异)可以忽略AndroidManifest.xml.


感谢您的建议。你是对的,我的回答看起来像是在闲聊中同意。

于 2013-11-23T06:32:55.237 回答
0

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

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

于 2019-04-11T16:18:33.047 回答