问题描述
我正在尝试实现一些清理工具。出于某些“安全原因”,越来越多的制造商已禁止生根设备,禁止不要求解锁。
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()
将返回存储路径,但是路径不可读或不可写。
-
对于Android 10,如果您在清单文件中的应用程序标签中添加
android:requestLegacyExternalStorage="true"
,则可以继续使用Environment.getExternalStorageDirectory()和Environment.getExternalStoragePublicDirectory()提供的路径。在运行时,您的应用可以调用Environment.isExternalStorageLegacy()
来检查请求是否已完成。 -
另一种(未知的)可能性(仅适用于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。 -
针对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商店,就可以了。
在