我正在尝试实现一些清理工具。越来越多的制造商已经禁止生根设备由于一些“安全原因”,他们甚至不允许你发送OEM解锁请求.
在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"
但我相信将来会被杀死。
那么,任何优雅的方式来管理SD卡?
2条答案
按热度按时间guz6ccqo1#
在Android 10上,
Environment.getExternalStorageDirectory()
和Environment.getExternalStoragePublicDirectory()
将返回存储路径,但路径不可读或不可写。1.对于Android 10,如果您将
android:requestLegacyExternalStorage="true"
添加到清单文件中的应用程序标记,则可以继续使用Environment. getExternalDirectory()和Environment. getExternalDirectory PublicDirectory()提供的路径。在运行时,您的应用可以调用Environment.isExternalStorageLegacy()
来检查请求是否已完成。1.另一种(未知)可能性(仅适用于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
实现一个Intent,用户可以在其中更改设置,那么您可以让用户更轻松。有趣的是,Environment. isExternalLegacy()也会返回true。1.为Android 11编译这两个选项在Android 11设备上都不起作用。(但它们仍然适用于Android 10设备)。Environment. getExternalDirectory()和Environment. getExternalDirectory PublicDirectory()的路径是
usable again in read mode and very often in write mode too
。这是伟大的,因为人们可以简单地列出目录的内容,如下载或图片或DCIM/相机再次使用文件类。但是将<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
添加到manifest文件并实现Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
的Intent将给予您的应用程序对所有文件的读/写权限,即使是在可移动的micro sd卡上。(最后,你可以删除谷歌禁令不能读/写自己的微型SD卡在自己的Android设备上使用自己的应用程序)。Environment.isExternalStorageManager()
可以用来检查权限是否打开/关闭。只要你不试图上传你的应用程序到播放商店你是好的。goqiplq22#
使用android:requestLegacyExternalStorage=“true”在您的清单下面<application