我正在为Android 8.0开发Android应用程序,我需要打开/读取和删除外部存储/ SD卡中的文件。
我的问题是,File file[] = directory.listFiles()
返回NULL,但目录中有一个文件。
这是我的应用程序的调试器视图:
如您所见,我通过Intent请求(变量resource
)将文件路径作为URI。目前,选择SD卡上的文件夹Test
。
然后我想获取此目录中的所有文件,但函数listFiles()
返回始终为NULL!但文件夹中有1个图像:
有趣的是,此代码适用于Android 4.4,5.0,6.0和7.0,但不适用于Android 8!
权限在Manifest.xml中设置,并在每次启动时被请求/检查:
注意:Android在启动应用时只显示1个权限请求,但它不应该请求2个权限吗?
我希望有人帮我解决问题。
最好的问候,迈克尔
解:
尝试使用:
DocumentFile directory = DocumentFile.fromTreeUri(context, Uri.parse(resources.getUri()));
代替:
File directory = new File(resources.getPath());
ContextCompat.getExternalFilesDirs解决了the access error
普遍真理:
Scoped Directory Access在Android 7.0中,应用程序可以使用新的API来请求访问特定的external storage目录,包括可移动媒体上的目录,如SD卡......
有关更多信息,请参阅Scoped Directory Access training。
Starting in Android O,存储访问框架允许custom documents providers为驻留在远程数据源中的文件创建可搜索的文件描述符...
Permissions,在Android O之前,如果应用程序在运行时请求了权限并且授予了权限,系统也会错误地授予应用程序其他属于同一权限组的权限,并且已在清单中注册。
对于定位Android O的应用,此行为已得到纠正。该应用程序仅被授予其明确请求的权限。但是,一旦用户向应用程序授予权限,则会自动授予该权限组中所有后续权限请求。
例如,
READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
......
希望能帮助到你。