在Android API 29中访问外部存储

2024-09-28 03:14:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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卡吗


Tags: 工具代码apinewthat原因storagethis
2条回答

在下面的清单中使用android:requestLegacyExternalStorage=“true”<;应用

在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类简单地再次列出目录的内容,如下载、图片或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 store,你就可以了

相关问题 更多 >

    热门问题