【问题标题】:Unable to create folder in android internal storage无法在 android 内部存储中创建文件夹
【发布时间】:2019-10-27 11:27:37
【问题描述】:

我正在尝试在手机的内部存储中创建一个文件夹,但无论我做什么都不会创建它

我尝试过的事情:

  • 从电脑上拔下手机

  • 在清单中和以编程方式为 API 23+ 设置权限

  • 我能找到的每个文件夹变体: Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) Environment.getDataDirectory() 等等。

  • 在每篇文章或文章的变体中搜索类似问题

  • 尝试了 mkdir() 和 mkdirs() 的两种变体

  • 检查手机是否存在文件夹

此代码也绑定到一个按钮,因此在我第二次按下它时应该已经授予权限请求。

File sdir = new File (Environment.getExternalStorageDirectory().getpath(), "/DBTEST/");

String[] PERMISSIONS_STORAGE = {
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};
ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_STORAGE, 1);

System.out.println("DIRECTORY CREATED: " + sdir.mkdirs());
System.out.println("EXISTS: " + sdir.exists());
System.out: DIRECTORY CREATED: false
System.out: EXISTS: false
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.testM">

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

【问题讨论】:

  • 没有尝试创建目录的代码。
  • 看看 sdir.mkdir() 和 sdir.mkdirs()。
  • 是的,我已经绑定了 mkdir 和 mkdirs 的两种变体,但它们都不起作用:/
  • 你当然应该发布完整的代码。
  • System.out.println("DIRECTORY CREATED: " + sdir.mkdirs()); 如果目录已经存在,则返回 false。仅当目录不存在时才调用 mkdir() 和 mkdirs()。

标签: java android android-permissions


【解决方案1】:

尝试更改此行:

File sdir = new File (Environment.getExternalStorageDirectory().getpath(), "/DBTEST/");

File sdir = new File (Environment.getExternalFilesDir(null) + "/DBTEST/");

根据开发者文档:

getExternalStorageDirectory() - 此方法在 API 级别 29 中已弃用。 为了提高用户隐私,不推荐直接访问共享/外部存储设备。当应用程序以 Build.VERSION_CODES.Q 为目标时,从此方法返回的路径不再可供应用程序直接访问。通过迁移到 Context#getExternalFilesDir(String)、MediaStore 或 Intent#ACTION_OPEN_DOCUMENT 等替代方案,应用程序可以继续访问存储在共享/外部存储上的内容。

getExternalFilesDir(null) 将返回您的应用程序存储文件夹(内部存储)/Android/data/your.app.name/file/

如果您想访问某些操作系统定义的文件夹,您只需传递此处定义的环境常量:

https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String)

这里

https://developer.android.com/reference/android/os/Environment

在“字段”部分下。

例如。下载地址为:getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

【讨论】:

  • 我知道了,你会不会碰巧知道如何访问下载或一般存储文件夹,而不是仅仅能够访问你的应用数据文件夹?
  • 更新了我的答案以包含它!
  • 我确实尝试过,它不会访问设备下载文件夹,它只是在您的应用程序中创建一个下载文件夹此 PC\Pixel 2 XL\Internal shared storage\Android\data\com。 example.testM\files\Download\DBTEST
  • 我不知道为什么它不起作用。在我的虚拟应用程序中进行了测试,结果与您的相同。不知道怎么做
【解决方案2】:

这是 Android-Q 中引入的隐私限制。当应用程序以 API 29 为目标并且从getExternalStorageDirectory 方法返回的路径不再可供应用程序直接访问时,不推荐直接访问共享/外部存储设备。使用特定于应用程序的目录来写入和读取文件。

默认情况下,针对 Android 10 及更高版本的应用会分配给scoped access into external storage,或范围存储。此类应用可以在外部存储设备中查看以下类型的文件,而无需请求任何与存储相关的用户权限:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 2015-02-24
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多