Android中使用mkdirs在SD卡上返回false

4

我在我的应用程序中制作了一个小型文件浏览器,希望支持创建新文件夹。

当导航到设备内置存储器中的位置时,一切正常,但当我导航到SD卡并尝试创建新文件夹时,new File(path + File.separator + newFolderName).mkdirs() 返回 false。

我进行了以下调试测试:

String path = "/storage/external_SD";   // Not hard coded - user navigates here
new File(path).isDirectory();            --> true
new File(path).canRead();                --> true
new File(path).canWrite();               --> true

String newFolderPath = path + File.separator + newFolderName;
new File(newFolderPath).isDirectory();   --> false
new File(newFolderPath).mkdir();         --> false
new File(newFolderPath).mkdirs();        --> false

我注意到一些奇怪的事情:我在 File 类中在 mkdirs() 的第一行设置了断点,但应用程序没有停在该行并立即返回 false。这让我认为这是权限问题,即使我在正确的位置拥有正确的权限:

<manifest ...>

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

    <application ...>
    ...
    </application>

</manifest>

我错过了什么?


1
只是一个问题,因为我不确定,你的路径是/storage/external_SD/对吗?现在你的newFolderPath等于path + File.separator + newFolderName。你已经在路径末尾有了一个分隔符,并且通过使用File.separator插入另一个分隔符。这可能是问题所在吗? - George Daramouskas
@GeorgeD 抱歉,路径字符串没有最后一个分隔符。我已经修正了这个问题。 - iMax531
你能发布newFolderPath的值吗? - George Daramouskas
@GeorgeD 的值为 "/storage/external_SD/folder_name"。 - iMax531
1个回答

1
自Android 5.0以来,应用程序只能在外部SD卡的私有位置上进行写入操作。
对于所有其他位置,它需要实现文档提供程序
访问外部存储的策略概述在Google文档中。

根据文档,我可以自由地操作公共位置中的文件和文件夹,这正是我想要做的,不是吗?“保存在外部存储器中的文件可供全球读取”。我所需要的只是我已经拥有的权限。 - iMax531
是的,但自5.0以来,Android不再将ext-SD视为外部存储器,而只是卡内一个带有包名的特殊目录。我会尝试找到一些官方文档来证实这一点,我只是从很多故障跟踪器上的票据中得出的结论。请注意,_内部_模拟SD卡不受此限制。 - Martin C.
@iMax531 这篇Stackoverflow的讨论在我看来非常详细:https://dev59.com/Gl8d5IYBdhLWcg3wgya4 - Martin C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接