如何从弹出窗口获取绝对路径(Intent.ACTION_OPEN_DOCUMENT_TREE)kivy,andoid-1



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

这是该窗口中的最小代码。如何获取绝对路径"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()

很抱歉收到不太准确的邮寄问题。但我的问题是将数据保存在非应用程序文件夹中,这样当应用程序更新时,它们就不会被覆盖。这个问题的解决方法原来很简单。

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

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

最新更新