kivy android: запись общедоступных файлов

Я кодирую приложение для Android, используя Kivy, и хотел бы, чтобы приложение записывало в файловую систему Android некоторые ПУБЛИЧНЫЕ каталоги/файлы.

В настоящее время, если мое приложение записывает файл (с использованием Python), файл МОЖЕТ быть прочитан локальным файловым менеджером Android, но НЕ МОЖЕТ быть прочитан моим компьютером mtp (эти файлы не отображаются во внутреннем хранилище). Однако оболочка adb МОЖЕТ видеть файлы.

[EDIT] Решением может быть сканирование файлов на наличие mtp с помощью MediaScannerConnection с Pyjnius, однако, как показано в моем следующем ответе, у меня это не сработало. [/РЕДАКТИРОВАТЬ]

Мне кажется, что я ищу эквивалент Java getSharedPreferences, описанного здесь: http://developer.android.com/guide/topics/security/permissions.html.

Я думал, что в спецификации buildozer есть аналогичная опция: поле android.private_storage описано здесь: https://raw.githubusercontent.com/kivy/buildozer/master/buildozer/default.spec.

Однако у меня это не работает... возможно, я неправильно использую команду buildozer: после настроек в спецификации "android.private_storage = False" я попробовал несколько команд, таких как "buildozer android release --dir public my_dir" или "buildozer android release --public my_dir" и т. д... безуспешно.


person MoriB    schedule 16.08.2014    source источник
comment
Более или менее РЕШЕНО: это, по-видимому, известная ошибка в mtp: некоторые файлы, в зависимости от того, как они написаны (я использую инструкцию открытия Python), не отображаются, пока вы не ПЕРЕЗАГРУЗИТЕ устройство. Действительно, перезагрузка устройства помогла. Я все еще не уверен, как использовать опцию buildozer private_storage.   -  person MoriB    schedule 16.08.2014
comment
Частное хранилище — это просто логический переключатель, указывающий, где должны храниться данные приложения — если это правда, они помещаются в /data/data/... как обычное приложение. Если False, материал python помещается во внешний каталог хранилища, чтобы вы могли легче редактировать/получать к нему доступ — первый вариант является нормальным и используется по умолчанию.   -  person inclement    schedule 16.08.2014
comment
Интересно, спасибо   -  person MoriB    schedule 16.08.2014
comment
MoriB публикует свой комментарий в качестве ответа и принимает его. Это считается хорошей практикой в ​​stackoverflow   -  person ndemou    schedule 08.09.2014


Ответы (2)


Я безуспешно пытался сделать файлы доступными для просмотра без сброса, используя MediaScannerConnection в Pyjnius. После записи файлов в файловую систему цель состоит в том, чтобы просканировать их. Вот код, который работает, но не имеет видимого эффекта.

from jnius import autoclass , cast
from jnius import PythonJavaClass, java_method

PythonActivity = autoclass('org.renpy.android.PythonActivity')
activity = cast('android.app.Activity', PythonActivity.mActivity)
context = activity.getApplicationContext()

MediaScannerConnection = autoclass('android.media.MediaScannerConnection')
MediaScannerConnection.scanFile(context,successFiles,None,None)   #successFiles is a list of absolute paths of files on Android

Я также пытался использовать другую перегруженную форму метода scanFile, но я не могу правильно определить необходимый интерфейс:

class OnScanCompletedListener(PythonJavaClass):
    __javainterfaces__ = ['android.media.MediaScannerConnection$OnScanCompletedListener']


    @java_method('(Ljava.lang.String;Landroid.net.Uri;)V')
    def onScanCompleted(self, path, uri):
        pass

    @java_method('()V')
    def onMediaScannerConnected(self):
        pass


MediaScannerConnection = autoclass('android.media.MediaScannerConnection')
mediaScannerConnectionListener = OnScanCompletedListener()
mScanner = MediaScannerConnection(context,mediaScannerConnectionListener)
mScanner.connect()
for thefile in successFiles:
    mScanner.scanFile(thefile,None) 
person MoriB    schedule 12.09.2014

Более или менее РЕШЕНО: это, по-видимому, известная ошибка в mtp: некоторые файлы, в зависимости от того, как они написаны (я использую инструкцию «открыть» Python), не отображаются, пока вы не ПЕРЕЗАГРУЗИТЕ устройство. Действительно, перезагрузка устройства помогла.

person MoriB    schedule 09.09.2014
comment
Это не ошибка, а особенность: базу данных MTP необходимо обновить с помощью медиа-сканера. Загрузка устройства запускает сканер мультимедиа, поэтому это помогает. В Android Java вы бы использовали MediaScannerConnection для обновления базы данных; не знаю, как это сделать в Kivy. - person laalto; 09.09.2014
comment
Спасибо лаалто. Я думаю, вы имеете в виду вызов метода scanFile для новых файлов. Попробую вызвать с помощью Pyjnius из Kivy. - person MoriB; 09.09.2014