java - 无法在Android上的外部存储上创建文件夹

标签 java android storage file-permissions

我的开发电话是Nexus 5 ,正在运行 Android 4.4.2 .

在我的应用程序中,我试图在外部存储上创建一个文件夹,用于存储我的应用程序的调试信息。基本上它将包含应用程序执行的所有命令,因此当用户遇到问题时,我可以选择让他们将调试文件夹中的信息发送给我进行分析。

我开始尝试将文件写入文件夹,但发现创建文件夹时出错。一开始我用的是mkdir() ,然后我搬到了mkdirs()这也没有用。

我有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />在我的 list 中。

下面是创建文件夹的代码:

    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");

这就是真正令人困惑的地方。

我尝试在不同的手机上进行开发。首先,我抓了一个 Galaxy S4 GT-i9505运行 Android 4.2.2它奏效了。我能够创建文件夹并写入它们。这向我表明代码正在运行。在 S4 和 Nexus 5 上运行代码返回的路径也是相同的。

然后我认为它可能是特定于android版本的。所以我抓了一个Nexus 4Android 4.4.2并且代码也适用于它。创建文件夹并允许我写信给他们。

所有手机均未获得 root 权限且均为标准配置。在 Nexus 5 上没有特殊应用程序或任何我能想到的明智设置会导致权限问题。连接设置为媒体设备 (MTP)。

编辑:

我应该补充一点,我已经尝试了以下方法,但也没有用:

  • 写文件到外部存储的根目录
  • 在外部存储根目录创建文件并写入
  • 在概述的路径中创建文件夹并向其中写入文件
  • 在列出的路径中创建文件并写入

我对导致此问题的原因感到困惑,是否还有其他任何我可以测试或更改的内容来解决此问题?

编辑 2:

原来这个问题是由于,我认为,索引。

基本上我测试过的所有其他设备都允许我重新连接 USB 连接并查看创建的文件和文件夹。

出于某种原因,我的 Nexus 5 没有索引文件夹/文件,即使它们存在。

我下载了一个不同的第 3 方文件资源管理器应用程序,发现所有文件夹和文件都在那里。

所以要通过 USB 调试查看这些文件夹和文件,我必须重新启动手机才能重新索引它们,这看起来很烦人,但总比根本不起作用好。

谢谢。

最佳答案

就 Nexus 的索引问题而言,这对我有用:

MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null,
        new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Log.i("ExternalStorage", "Scanned " + path + ":");
                Log.i("ExternalStorage", "-> uri=" + uri);
            }
});

您应该在创建并保存文件后直接调用它。通过使用扫描仪,我只需重新插入设备即可看到新创建的文件和目录。

根据docs :

MediaScannerConnection provides a way for applications to pass a newly created or downloaded media file to the media scanner service. The media scanner service will read metadata from the file and add the file to the media content provider.

希望这对其他人有帮助。

关于java - 无法在Android上的外部存储上创建文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366217/

相关文章:

java - 将 JSON 字符串处理为 Java 数组

java - 在 Eclipse 中打开与另一个程序关联的文件

java - 如何使用 Android 相机显示两个相同的相机预览?

安卓工作室 : Error converting bytecode to dex:Multiple dex files define Ljavax/mail/internet/ParameterList$ToStringBuffer;

安卓在线动态数据库

java - 将 .war 文件部署到 linux 上的 tomcat 服务器

Android IAP v3,消费项目列表

android - 使用 monodroid 将图像共享到应用程序

android - Android 的内部存储;创建文件

mysql - 如何设置mysql MaxNoOfConcurrentOperations的值