我正在尝试实现一些清理工具。由于某些“安全原因”,越来越多的制造商已禁止生根设备,禁止不要求解锁。
在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()
它将返回存储路径,但是路径不可读或不可写。
对于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商店,就可以了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句