как получить путь из всплывающего окна (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 шт):
Извините за не совсем точно посталеннй вопрос. Но моя проблема заключась в сохранении даннных в не папки приложения, что бы при обновлении приложения они не перезаписывались. Решением проблемы оказалось простым.
context = autoclass('android.content.Context')
path_file = context.getExternalFilesDir(None)
path = path_file.getAbsolutePath()
Что позволило создать папку в ANDROID/DATA . Где я уже могу создавать и хранить данные.