gpt4 book ai didi

android - Python 中的存储访问框架

转载 作者:行者123 更新时间:2023-12-04 12:15:48 25 4
gpt4 key购买 nike

我有 this小应用程序,我想要
重写它以使用对隐私更友好的最佳实践,例如存储访问框架。
怎么做 Python (基维)?我在网上搜索并没有找到任何关于 Python 的教程或示例.我知道的很少JavaKotlin一点也不。所以,我想阅读 Python 中的示例.
我想替换这段代码:

request_permissions([Permission.WRITE_EXTERNAL_STORAGE,
Permission.READ_EXTERNAL_STORAGE])
try:
if autoclass('android.os.Build$VERSION').SDK_INT >= 29:
Context = autoclass('android.content.Context')
self.working_directory = os.path.join(Context.getExternalFilesDir(None).getAbsolutePath(), "tdg_articles")
self.data_dir = os.path.join(Context.getExternalFilesDir(None).getAbsolutePath(), "nltk")
else:
Environment = autoclass('android.os.Environment')
self.working_directory = os.path.join(Environment.getExternalStorageDirectory().getAbsolutePath(), "tdg_articles")
self.data_dir = os.path.join(Environment.getExternalStorageDirectory().getAbsolutePath(), "nltk")
except:
self.working_directory = os.path.join(App.get_running_app().user_data_dir, "tdg_articles")
self.data_dir = os.path.join(App.get_running_app().user_data_dir, "nltk")

if not os.path.exists(self.working_directory):
os.makedirs(self.working_directory)

if not os.path.exists(self.data_dir):
os.makedirs(self.data_dir)

os.chdir(self.working_directory)

最佳答案

Scoped Storage 带来了两大变化:

  • 首先,您不再可以通过其路径访问文件。相反,您需要使用它的 Uri。
  • 其次,如果你想修改一个不是你的应用创建的文件,你需要征求用户的许可。

  • 默认情况下,您有权访问其他应用程序无法访问的特定于应用程序的文件夹。但是,如果您需要在另一个位置读取/写入文件,则必须明确要求它们。范围存储类似于访问数据库。您请求 Android API 执行操作,系统会为您执行此操作。
    类似问题:
    Github 中有一个类似情况的未解决问题。
    https://github.com/kivy/buildozer/issues/1304
    有用资源:
    我找不到任何官方文档,但 Robert Flatt 有一个使用范围存储的实验性存储库。
    https://github.com/Android-for-Python/Storage-Example
    他提供了 storage.py实现用于访问此应用的公共(public)存储的数据库的 API 的类。提供的共享存储操作是 insert() , delete() , 和 recieve() ,这些在此应用的私有(private)和共享存储之间复制文件。
    代码重构建议:
    Scoped Storage 不仅限于询问文件权限,因此您需要以这种方式迁移所有文件操作。
  • 从 Android API 29+ 开始,“WRITE_EXTERNAL_STORAGE”权限是多余的。由于您将通过 MediaStore/SAF 使用存储,因此您不再需要此权限。
  • 每当您进行文件操作时,请检查 Android 版本,如果低于 29,请继续使用现有代码。否则,使用 storage.py 类来读/写文件。
  • 如果您已经将数据存储在应用程序目录之外,您还需要将它们移动到应用程序目录内的文件夹中。

  • 使用 storage.py 类的示例:
    #######################
    #
    # Examples:
    # Where txt_file could be PrivateStorage().getFilesDir() + 'text.txt'
    # and so on.
    # All methods take a required file name, and optional directory parameters.
    #
    # Insert:
    # SharedStorage().insert(txt_file, 'Documents')
    # SharedStorage().insert(txt_file, sub_dir= 'a/b')
    # SharedStorage().insert(txt_file, 'Downloads')
    # SharedStorage().insert(jpg_file, 'Pictures')
    # SharedStorage().insert(mp3_file)
    # SharedStorage().insert(ogg_file, 'Music')
    #
    # Retrieve:
    # path = SharedStorage().retrieve('test.txt')
    # path = SharedStorage().retrieve('test.txt', 'Documents', 'a/b')
    #
    # Delete:
    # SharedStorage().delete('test.mp3', 'Music')
    #
    # Retrieve from another app's storage (requires READ_EXTERNAL_STORAGE) :
    # SharedStorage().retrieve('10_28_14.jpg', 'DCIM', '2021_03_12',
    # 'CameraXF')
    # SharedStorage().retrieve('10_33_48.mp4', 'DCIM', '2021_03_12',
    # 'CameraXF')
    #
    #######################
    详细说明 here .

    关于android - Python 中的存储访问框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67129296/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com