如何从弹出窗口(Intent.ACTION\u OPEN\u DOCUMENT\u TREE)获取绝对路径kivy,andoid 11

2024-09-30 22:20:31 发布

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

我是一个初学者程序员,用kivy编写我的第一个应用程序。并且遇到了android-11(API 30)的有限存储问题。当用户选择要保存应用程序数据的文件夹时,如何从弹出窗口获取绝对路径,我将在其中存储一些数据。我的应用程序在9 anroid上没有这个选项也可以正常工作,但问题是

下面是该窗口中的最小代码。如何获取绝对路径“root_id”,以便对该文件夹进行进一步操作。通过在其中创建文件并在kivy中打开SaveDialoga

from kivy.uix.label import Label
import os
from android import activity, mActivity
from jnius import autoclass
from kivy.app import App
from jnius import cast
from android.storage import app_storage_path, primary_external_storage_path, secondary_external_storage_path

Intent = autoclass('android.content.Intent')
DocumentsContract = autoclass('android.provider.DocumentsContract')
Document = autoclass('android.provider.DocumentsContract$Document')

class Demo(App):
    REQUEST_CODE = 42 # unique request ID
   
    def set_intent(self):
        intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        mActivity.startActivityForResult(intent, self.REQUEST_CODE)        

    def intent_callback(self, requestCode, resultCode, intent):
        if requestCode == self.REQUEST_CODE:
            msg = ""
            root_uri = intent.getData()
            print(root_uri.getPath())
            #  /tree/primary:CarInWay

            root_id = DocumentsContract.getTreeDocumentId(root_uri)
            print( root_id)
            #  primary:CarInWay

            from pathlib import Path
            p = Path(root_uri.getPath()).resolve()
            print(p, p.is_dir(), p.is_absolute())
            #  /tree/primary:CarInWay False True

            p = Path(root_id).resolve()
            print( p, p.is_dir(), p.is_absolute())
            #   /data/data/car.carinway/files/app/primary:CarInWay False True


            primary_ext_storage = primary_external_storage_path()

            data_dir = str(os.path.join(primary_ext_storage, 'CarInWay'))
            check_data_dir = os.path.exists(data_dir)
            print(data_dir , check_data_dir)
            #  /storage/emulated/0/CarInWay === True

            p = Path(primary_ext_storage + '/CarInWay')
            print('===', p, '===', p.stat().st_mode)
            #  /storage/emulated/0/CarInWay === 16832

            settings_path = app_storage_path()
            secondary_ext_storage = secondary_external_storage_path()
            print(settings_path, primary_ext_storage, secondary_ext_storage)
            #  /data/user/0/car.carinway/files /storage/emulated/0 None

    def on_start(self):
        self.set_intent()

    def build(self):
        activity.bind(on_activity_result=self.intent_callback)
        self.label = Label()

        return self.label

if __name__ == '__main__':
    Demo().run()

Tags: pathfromimportselfdatadirstorageroot
1条回答
网友
1楼 · 发布于 2024-09-30 22:20:31

对不起,这个邮政问题不太准确。但我的问题是将数据保存在非应用程序文件夹中,以便在更新应用程序时不会覆盖它们。 这个问题的解决办法原来很简单

context = autoclass('android.content.Context')
path_file = context.getExternalFilesDir(None)
path = path_file.getAbsolutePath()

这使得在ANDROID/DATA中创建文件夹成为可能。我可以在哪里创建和存储数据

相关问题 更多 >