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

2022-09-04 01:35:13

我的开发手机是 ,正在运行。Nexus 5Android 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");

这就是它变得非常令人困惑的地方。

我尝试在不同的手机上进行开发。首先,我抓住了一个跑步,它起作用了。我能够创建文件夹并写入它们。这向我表明代码正在工作。此外,在S4和Nexus 5上运行代码返回的路径是相同的。Galaxy S4 GT-i9505Android 4.2.2

然后我认为它可能是Android版本特定的。所以我抓住了一个,代码也处理了它。创建了文件夹并允许我写入它们。Nexus 4Android 4.4.2

没有一部手机是扎根的,都是库存标准。在Nexus 5上,没有特殊的应用程序或任何我能想到的会导致权限问题的设置。连接设置为“媒体设备 (MTP)”。

编辑:

我应该补充一点,我已经尝试了以下方法,但同样不起作用:

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

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

编辑2:

事实证明,我认为这个问题是由于索引造成的。

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

由于某种原因,我的Nexus 5不会索引文件夹/文件,即使它们存在。

我下载了一个不同的第三方文件浏览器应用程序,并注意到所有的文件夹和文件都在那里。

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

谢谢。


答案 1

就这是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);
            }
});

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

根据文档

MediaScannerConnection 为应用程序提供了一种将新创建或下载的媒体文件传递到媒体扫描程序服务的方法。媒体扫描程序服务将从文件中读取元数据,并将该文件添加到媒体内容提供程序。

希望这有助于其他人。


答案 2

事实证明,我认为这个问题是由于索引造成的。

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

由于某种原因,我的Nexus 5不会索引文件夹/文件,即使它们存在。

我下载了一个不同的第三方文件浏览器应用程序,并注意到所有的文件夹和文件都在那里。

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


推荐