我再次提出了一个问题,这个问题已被提出并在之前得到解答,但在我的实施中,它仍然无效。
我在主要活动的 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手动创建文件夹并将文件放入其中时,我可以从我的应用程序中读取这些文件,但我无法在该文件夹中写入任何内容。
请帮忙!我的智慧结束了。
答案 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打开到,这解决了我的问题。