【发布时间】:2014-04-17 10:55:15
【问题描述】:
我的开发手机是Nexus 5,运行Android 4.4.2。
在我的应用程序中,我试图在外部存储上创建一个文件夹,用于存储我的应用程序的调试信息。基本上它将包含应用程序执行的所有命令,因此当用户遇到问题时,我可以选择让他们将调试文件夹中的信息发送给我以进行分析。
我开始尝试将文件写入文件夹,但发现创建文件夹时出错。起初我使用mkdir(),然后我转到mkdirs(),这也不起作用。
我的清单中有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />。
创建文件夹的代码如下:
File folder = new File(Environment.getExternalStorageDirectory() + "/DebugData");
String path = folder.getPath();
if(!folder.mkdirs() || !folder.exists()){
Log.e(LOG_TAG, path + " failed");
} else {
Log.d(LOG_TAG, path + " succeeded");
}
这是我也尝试过的:
//Check SD card state
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) || !Environment.MEDIA_MOUNTED.equals(state)) {
Log.e(LOG_TAG, "Error: external storage is read only or unavailable");
} else {
Log.d(LOG_TAG, "External storage is not read only or unavailable");
}
这将返回外部存储非只读或不可用。
我也试过不同的路径,比如File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Folder1");
这才是真正令人困惑的地方。
我尝试在不同的手机上进行开发。首先,我抓住了一个运行Android 4.2.2 的Galaxy S4 GT-i9505,它成功了。我能够创建文件夹并写入它们。这向我表明代码正在运行。在 S4 和 Nexus 5 上运行代码返回的路径也是相同的。
然后我认为它可能是特定于 android 版本的。所以我抓住了Nexus 4 和Android 4.4.2 并且代码也可以使用它。创建文件夹并允许我写信给他们。
没有一部手机是植根的,都是标准的。在 Nexus 5 上没有任何特殊的应用程序或任何我能想到的设置会导致权限问题。连接设置为媒体设备 (MTP)。
编辑:
我应该补充一点,我尝试了以下方法,但也没有用:
- 将文件写入外部存储的根目录
- 在外部存储根目录中创建文件并写入
- 在概述的路径中创建文件夹并向其中写入文件
- 在概述的路径中创建文件并写入文件
我不知道是什么原因造成的,还有什么我可以测试或更改来解决问题的吗?
编辑 2:
原来问题是由于,我认为,索引。
基本上我测试过的所有其他设备都允许我重新连接 USB 连接并查看创建的文件和文件夹。
出于某种原因,我的 Nexus 5 不索引文件夹/文件,即使它们存在。
我下载了一个不同的 3rd 方文件浏览器应用程序,发现所有文件夹和文件都在那里。
所以要通过USB调试查看这些文件夹和文件,我必须重新启动手机才能重新索引它们,这看起来很烦人,但总比完全不工作要好。
谢谢。
【问题讨论】:
-
不要使用串联来创建
File对象。使用正确的File构造函数,例如new File(Environment.getExternalStorageDirectory(), "SmartspeedPTdata")。这可能不是你的困难的根源,但它可能会有所帮助。 -
您无法访问根目录。我遇到过您甚至无法访问外部存储根目录的设备。你的清单文件肯定需要适当的权限,特别是如果你想写的话。
标签: java android storage file-permissions