如何在 Flutter 中授予访问外部存储的权限

Sar*_*lvi 5 android dart flutter

当我在颤振代码中使用以下行时:

print(Directory("/sdcard").list(recursive: true).listen((event) {print(event);}));
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

"[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: FileSystemException: Directory listing failed, path = '/sdcard/' (OS Error: Permission denied, errno = 13)"
Run Code Online (Sandbox Code Playgroud)

我尝试将这些添加到清单选项卡下的 AndroidManifest.xml 中:

<uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

但它没有用。我也尝试在flutter clean之后重新运行它,但仍然得到相同的结果。

有人可以帮我解决这个问题。

我的主要目标是能够访问(读/写)android/ios 设备存储中存在的所有可访问目录。就像我们普通的手机文件管理器一样。

非常感谢您的回答。

Cla*_*edi 6

我的建议是避免这样做。

\n

自 Android 10 起,通过范围存储的实现,对共享存储的访问受到很大限制。不再允许通过文件系统路径访问文件,除非它是有限范围存储的一部分。

\n

除非绝对需要通过绝对路径访问共享存储,否则您应该使用存储访问框架或 MediaStore API。

\n

Android 11 只会强制实施更多限制。

\n

所有文件访问

\n
\n

大多数需要共享存储访问的应用程序可以遵循范围存储最佳实践,例如存储访问框架或 MediaStore API。然而,某些应用程序的核心用例需要广泛访问设备上的文件,但无法使用隐私友好的存储最佳实践有效地做到这一点。

\n

例如,防病毒应用程序的主要用例可能需要定期扫描不同目录中的许多文件。如果此扫描需要重复的用户交互来使用系统文件选择器选择目录,则可能会提供较差的用户体验。其他用例\xe2\x80\x94(例如文件管理器应用程序、备份和还原应用程序以及文档管理应用程序\xe2\x80\x94)可能需要类似的注意事项。

\n

应用程序可以通过执行以下操作向用户请求名为“所有文件访问”的特殊应用程序访问权限:

\n

在清单中声明 MANAGE_EXTERNAL_STORAGE 权限。\n使用 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION Intent 操作将用户引导至系统设置页面,他们可以在其中为您的应用启用以下选项:允许访问管理所有文件。

\n
\n

考虑应用程序能够使用的要求MANAGE_EXTERNAL_STORAGE,因为它并不适合所有人

\n
\n

Google Play 限制使用高风险或敏感权限,包括名为“所有文件访问”的特殊应用访问权限。

\n

如果您的应用不需要访问所有文件访问权限,则必须将其从应用的清单中删除才能成功发布您的应用。下面还详细介绍了符合政策的替代实施的详细信息。

\n

如果您的应用符合可接受使用的政策要求或符合例外条件,您将需要使用 Play 管理中心中的声明表来声明此权限和任何其他高风险权限。

\n

不符合政策要求或未提交声明表的应用可能会从 Google Play 中删除。\n https://support.google.com/googleplay/android-developer/answer/9956427?hl=en

\n
\n