как получить путь из всплывающего окна (Intent.ACTION_OPEN_DOCUMENT_TREE) kivy , andoid -11

форумчане! Я начинающий програмист, пишу свое первое приложение на kivy. И столкнлся с проблемой с ограниченным хранилищем для android - 11 ( API 30). Как получить абсолютный путь из всплывающего окна при выборе пользователя папки для сохранения данных приложения, в котором я собираюсь хранить кое какие данные. Мое приложение прекрасно работает и без этого выбора на 9 anroid, но тут проблема.

вот минимальный код от этого окна. Как получить абсолютный путь 'root_id' для дальнейших манипуляций с этой папкой. Созданием в ней файлов и открытия SaveDialoga в kivy

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:
            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()

Ответы (1 шт):

Автор решения: djus

Извините за не совсем точно посталеннй вопрос. Но моя проблема заключась в сохранении даннных в не папки приложения, что бы при обновлении приложения они не перезаписывались. Решением проблемы оказалось простым.

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

Что позволило создать папку в ANDROID/DATA . Где я уже могу создавать и хранить данные.

→ Ссылка