How to get absolute path from popup (Intent.ACTION_OPEN_DOCUMENT_TREE) kivy , andoid -11

528 Views Asked by At

I am a beginner programmer, writing my first application in kivy. And ran into limited storage issue for android - 11 (API 30). How to get the absolute path from the pop-up window when the user selects the folder to save the application data in which I am going to store some data. My application works fine without this choice on 9 anroid, but here's the problem.

here is the minimal code from that window. How to get the absolute path 'root_id' for further manipulations with this folder. By creating files in it and opening SaveDialoga in 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:
            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()
1

There are 1 best solutions below

0
On

Sorry for the not quite accurate postal question. But my problem is saving the data in non-application folders, so that when the application is updated, they are not overwritten. The solution to the problem turned out to be simple.

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

Which made it possible to create a folder in ANDROID / DATA. Where can I already create and store data.