Alc*_*raz 16 android android-permissions android-external-storage android-10.0
我正在尝试实现一些清理工具。由于某些“安全原因”,越来越多的制造商禁止生根设备,禁止不要求解锁。
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
Run Code Online (Sandbox Code Playgroud)
当然,我可以使用这个:
android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)
但我相信将来会被杀死。
那么,有什么优雅的方式来管理 SDCard 吗?
bla*_*pps 28
在 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 类简单地列出下载或图片或 DCIM/Camera 等目录的内容。但是添加<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />到清单文件并实现意图
Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION将为您的应用程序提供对所有文件的读/写访问权限,即使是在可移动 micro SD 卡上。(最后,您可以使用您自己的应用程序取消无法在您自己的 Android 设备上读/写您自己的 micro SD 卡的谷歌禁令)。
Environment.isExternalStorageManager()可用于检查权限是否打开/关闭。只要您不尝试将您的应用上传到 Play 商店,就可以了。
| 归档时间: |
|
| 查看次数: |
16122 次 |
| 最近记录: |