在Android API中访问外部存储29

问题描述

我正在尝试实现一些清理工具。出于某些“安全原因”,越来越多的制造商已禁止生根设备,禁止不要求解锁。

在API 28之后,此代码将导致错误


ActivityCompat.requestPermissions(this,new String[]{
  Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE
},1); // Request permission or not,Will got same result

File rootFolder = Environment.getExternalStorageDirectory(); // That is working fine
rootFolder.listFiles(); // That will return null

好的,我可以使用它:

android:requestLegacyExternalStorage="true"

但是我相信将来会被杀死的。

那么,有什么优雅的方法来管理SDCard吗?

解决方法

在Android 10上,Environment.getExternalStorageDirectory()Environment.getExternalStoragePublicDirectory()将返回存储路径,但是路径不可读或不可写。

  1. 对于Android 10,如果您在清单文件中的应用程序标签中添加android:requestLegacyExternalStorage="true",则可以继续使用Environment.getExternalStorageDirectory()和Environment.getExternalStoragePublicDirectory()提供的路径。在运行时,您的应用可以调用Environment.isExternalStorageLegacy()来检查请求是否已完成。

  2. 另一种(未知的)可能性(仅适用于Android 10)是将<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />添加到清单文件中。 用户必须进入应用程序的高级设置并从Advanced settings Install unknown apps | Allow from this source启用。 这样做的好处是用户可以切换访问权限。如果您实现了以下目的,则可以使用户更轻松 Settings.ACTION_APPLICATION_DETAILS_SETTINGS,他可以在其中更改设置。 有趣的是,Environment.isExternalStorageLegacy()也会返回true。

  3. 针对Android 11进行编译这两个选项在Android 11设备上均不起作用。 (但它们继续适用于Android 10设备)。 Environment.getExternalStorageDirectory()和Environment.getExternalStoragePublicDirectory()的路径为usable again in read mode and very often in write mode too。这很棒,因为可以使用File类再次简单地列出目录(如Download或Pictures或DCIM / Camera)的内容。 但是在清单文件中添加<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />并实现以下意图 Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION将为您的应用程序提供对所有文件的读/写访问权限,即使是在可移动Micro SD卡上也是如此。 (最后,您可以删除Google禁止,无法使用自己的应用在自己的Android设备上读取/写入自己的Micro SD卡)。 Environment.isExternalStorageManager()可用于检查权限是否为开/关。 只要您不尝试将应用上传到Play商店,就可以了。

,

下面的 Manifest 中使用 android:requestLegacyExternalStorage="true"