Android Oreo (API 26) - 在外部存储中创建目录

Posted

技术标签:

【中文标题】Android Oreo (API 26) - 在外部存储中创建目录【英文标题】:Android Oreo (API 26) - Create dir in external storage 【发布时间】:2018-03-11 09:51:48 【问题描述】:

我一直在开发一个在牛轧糖上的应用程序,它在外部存储中创建一个目录。

我以前是这样的:

final File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Chords/Processed Audio");
dir.mkdirs();

此代码似乎不适用于 API 26 (android Oreo)。目录未创建。

我怎样才能实现同样的目标,最好是在从 API 21 到 API 26 的所有 android 版本上工作?

【问题讨论】:

详细解释,“似乎不起作用”是什么意思。请注意,您不应使用字符串连接来创建文件路径。使用final File dir = new File(new File(Environment.getExternalStorageDirectory(), "Chords"), "Processed Audio"); 我会按照您的建议尝试。我所说的“不起作用”的意思只是没有创建目录,而在 Nougat 上它确实 一些 logcat 会很有用。权限呢?您是否已授予为您的应用程序写入外部存储的权限? ok 只需按照@CommonsWare 的建议购买更改File 声明即可。谢谢。请写下答案,我会接受的。我认为它对其他人也有用。 【参考方案1】:

@Daniele,见https://***.com/a/44455957/966789 和https://***.com/a/33031091/966789(Android 为 Android 6.0(Marshmallow)添加了新的权限模型。如果您的 targetSdkVersion >= 23 并且您在 Marshmallow(或更高版本)设备上运行,您可能需要启用运行时权限。您还应该阅读更多关于运行时权限更改。如果您使用的是 targetSdkVersion >= 24,则还必须按照本节所示配置 FileProvider。下面的示例使用 com.codepath.fileprovider 并且应与指定的权限 XML 标记匹配)

【讨论】:

【参考方案2】:

在运行 Android 8.0 的 Nexus 5X 上运行您现有的代码没有任何问题。使用adb shell ls /storage/emulated/0,我看到Chores/,在里面我看到Processed Audio/。这是针对具有WRITE_EXTERNAL_STORAGE 权限的应用程序,包括运行时权限。

话虽如此,理想情况下,不要使用字符串连接来创建File 对象。相反,使用:

final File dir = new File(new File(Environment.getExternalStorageDirectory(), "Chords"), "Processed Audio");

【讨论】:

我也设置了所有权限,我检查了多次。不过,更改为您的声明方式而不是字符串连接对我有用。再次感谢。 嗨,我在 cordova 应用程序中使用这个插件 (github.com/JoschkaSchulz/cordova-plugin-image-resizer)。我面临同样的问题(github.com/JoschkaSchulz/cordova-plugin-image-resizer/issues/42)。我看到这个代码文件夹 = new File(Environment.getExternalStorageDirectory() + "/" + folderName);并按照您的说法进行了更改,但仍然无法正常工作。如果您发现其中有任何错误,请告诉我们。 @NKurapati:我建议您编辑您的 GitHub 问题并提供可重现的测试用例以及一组完整的输出(例如堆栈跟踪)。 @CommonsWare:当我通过 javascript 访问时,我收到“尝试在空对象引用上调用虚拟方法 'java.lang.String android.net.Uri.toString()'”消息仅限。 @CommonsWare:我已经更新了 github 问题。它无法创建目录。如果您发现任何错误,请检查并告知我们。谢谢。

以上是关于Android Oreo (API 26) - 在外部存储中创建目录的主要内容,如果未能解决你的问题,请参考以下文章

从 API 级别 < Android 26 (Oreo) 的 RGB 值创建颜色对象

JobIntentService 不适用于 Oreo 以下的 API (API <= 26)

Xamarin - Oreo (API 26) Firebase Cloud Messaging 背景通知未显示在通知抽屉中

Android Oreo 字体系列 NPE 崩溃

Android 8 (Oreo) 中的后台位置限制是啥?

Android 版本API对应表