我需要一个应用程序特定的文件夹来存储我的应用程序是从互联网下载的pdf文件。应用程序需要完全访问该文件夹。我不想使用通过SAF提供的系统内置选择器。
那么在"Root"目录下创建文件夹的正确方法是什么呢?设备文件夹。
您在评论中说PDF文件必须对用户公开(例如在文件资源管理器中或在PDF阅读器中),所以我更新了我的回答。
在2020年的Android R之前,应用程序很容易在(公共)外部存储目录中创建文件。"external"只表示该目录不是应用程序的内部目录。例如,这并不意味着目录是外部SD卡的一部分。这个目录下的文件(和子目录,除了"Android"例如,图库应用程序或PDF阅读器会显示文件夹)。
在我的Android API level 33模拟器中,(公共)外部存储目录的路径是/storage/emulated/0
。该目录还包含一些名为"文档"、"下载"的默认子目录。或";Pictures"为例。因为路径不能保证总是相同的,所以您可以使用getExternalStorageDirectory或getExternalStoragePublicDirectory对其中一个子目录进行检索。
所以在Android R之前,你所要做的就是请求WRITE_EXTERNAL_STORAGE权限,并把你的文件放到getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS)返回的目录中。
不幸的是,Android的每一个版本都变得更加严格,现在WRITE_EXTERNAL_STORAGE
已经没有效果了,getExternalStoragePublicDirectory
也被弃用了。
所以把你的文件放到Android R的(公共)外部文档目录中,后来似乎有多种方法。
一种方法是在manifest中声明权限MANAGE_EXTERNAL_STORAGE:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
然后要求用户手动启用:
Uri u = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, u);
startActivity(intent);
在此之后,您可以写入由getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS)
返回的文件夹,该文件夹指向我的模拟器上的/storage/emulated/0/Documents
。
这个答案中还描述了另外两种方法。一种方法是使用ACTION_CREATE_DOCUMENT,另一种方法是使用MediaStore。
我还想说,将文件放入(公共)外部存储目录后,可能需要一段时间才能出现在PDF阅读器中。你可以发送intent ACTION_MEDIA_SCANNER_SCAN_FILE,这样会更快。请看这个答案