Java Can';在android10中创建目录

Java Can';在android10中创建目录,java,android,Java,Android,我无法在android 10中创建目录。在android Oreo之前,它一直在设备上工作 我尝试了两种创建文件夹的方法 使用File.mkdir(): 在这里,变量success总是false,这意味着没有创建目录 使用文件。createDirectory(): 导致此异常的原因: pzy64.pastebinpro W/System.err: java.nio.file.AccessDeniedException: /storage/emulated/0/Pastebin pzy64.pas

我无法在android 10中创建目录。在android Oreo之前,它一直在设备上工作

我尝试了两种创建文件夹的方法

使用
File.mkdir()

在这里,变量
success
总是false,这意味着没有创建目录

使用文件。createDirectory():

导致此异常的原因:

pzy64.pastebinpro W/System.err: java.nio.file.AccessDeniedException: /storage/emulated/0/Pastebin
pzy64.pastebinpro W/System.err:     at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:391)
pzy64.pastebinpro W/System.err:     at java.nio.file.Files.createDirectory(Files.java:674)
我已经实现了运行时权限和

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


都设置好了。

正如2019年3月首次披露的那样,默认情况下,您不再能够访问Android 10+上的任意位置。这包括
Environment.getExternalStorageDirectory()
Environment
上的其他方法(例如
getExternalStoragePublicDirectory()

对于Android 10和11,您可以将
Android:requestLegacyExternalStorage=“true”
添加到清单中的
元素中。这将使您进入传统存储模型,并且您现有的外部存储代码将正常工作

否则,您的选择是:

  • 使用
    Context
    上的方法,例如
    getExternalFilesDir()
    ,获取应用程序可以写入的外部存储上的目录。在Android 4.4+上使用这些目录不需要任何权限。但是,卸载应用程序时,存储在那里的数据将被删除

  • 使用存储访问框架,例如
    ACTION\u OPEN\u DOCUMENT
    ACTION\u CREATE\u DOCUMENT

  • 如果您的内容是媒体,您可以使用
    MediaStore
    将媒体放置在标准媒体位置


    • 对于Android 10,您可以添加

      android:requestLegacyExternalStorage=“true”


      添加到清单中的元素。这将使您进入传统存储模型,并且您现有的外部存储代码将起作用。但此修复程序在Android R及更高版本上不起作用,因此这只是一个短期修复程序。

      自Q beta 4以来,可以通过以下方式选择退出该功能:

      目标api 28(或更低) 使用requestLegacyExternalStorage清单属性:

      <manifest ... >
        <!-- This attribute is "false" by default on apps targeting Android Q. -->
        <application android:requestLegacyExternalStorage="true" ... >
          ...
        </application>
      </manifest>
      
      
      ...
      
      这对我很有用,我认为它在安卓10上很有用>

      ContentResolver resolver=getContentResolver();
      ContentValues ContentValues=新ContentValues();
      contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH,Environment.DIRECTORY_PICTURES+“/文件夹示例”);
      String path=String.valueOf(resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues));
      文件夹=新文件(路径);
      布尔值isCreada=folder.exists();
      如果(!isCreada){
      folder.mkdirs();
      }
      
      仅限使用

      android:requestLegacyExternalStorage="true"
      

      在清单中,Android
      API 30有更多的限制

      您只能在
      应用程序特定的文件中写入

       File dir_ = new File(context.getFilesDir(), "YOUR_DIR");
       dir_.mkdirs();
      
      或者在应用程序的外部存储中
      Android/data

      File dir_ = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
      
      更新

      这个答案提供了另一个解决办法

      更新

      另一种方法是在
      manifest

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

      就像这个答案一样

      你是说在Android Q上没有办法创建我自己的目录吗?@Xihuny:欢迎你创建
      getExternalFilesDir()的子目录
      上下文提供的类似位置。
      不能使用文件系统API直接从外部或可移动存储的根创建子目录。我不想这样做,因为当用户卸载应用程序时,文件将被删除。@Xihuny:然后使用存储访问框架,允许用户选择打开的位置用户的设备您可以放置用户的内容。@Xihuny:您可以使用
      操作\u打开\u文档\u树
      来允许用户选择文档树。从那里,使用
      文档文件.fromTreeUri()
      来获取该文档树的
      文档文件
      。然后您可以创建子文档(文档和树)在该树中,使用您想要的任何名称。它是否为“目录”取决于用户选择的基本文档树——不要求他们在文件系统上选择某个内容。您正在查询
      文件,因此必须添加
      android:requestLegacyExternalStorage=“true”
      当目标是Android 10>时。在这种情况下,您最好继续使用
      getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES)
      .getExternalStoragePublicDirectory在API级别29Yes中不推荐使用,并且?正如文档中所述,当应用程序以Build.VERSION\u CODES.Q为目标时,
      此方法返回的路径不再可直接访问
      ,因此如果您有
      android:requestLegacyExternalStorage=“true”
      在您的清单中,您仍然可以使用它。首先,不是我投了反对票。要回答您的问题,您正在查询一个文件,这在Android 10>上是不允许的,除非您请求旧版存储。要正确执行此操作,您应该获取
      Uri
      ,如下所示
      Uri mUri=resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues)
      然后直接使用该
      Uri
      而不是将其传递给
      文件
      对象。您不必创建文件夹。当您写入
      Uri
      时,文件夹将自动创建。这仅适用于android版本上,
      文件
      路径访问再次被允许。因此,
      安卓:requestLegacyExternalStorage=“true”
      是为了确保它在安卓10上工作。除非你的targetSDK>=30,否则它在安卓11及以后仍能工作。它对我有效,谢谢安卓11的长期修复方案是什么?这很好,谢谢
      File dir_ = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
      
      <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />