1

我正在使用 Kivy 编写一个 Android 应用程序,并希望该应用程序写入 android 文件系统、一些 PUBLIC 目录/文件。

目前,如果我的应用程序写入一个文件(使用 Python),该文件可以由 android 本地文件管理器读取,但不能由我的计算机 mtp 读取(这些文件不会出现在 InternalStorage 中)。adb shell 可以看到这些文件。

[编辑] 解决方案可能是使用带有 Pyjnius 的 MediaScannerConnection 扫描文件以查找 mtp,但是如我的下一个答案所示,它对我不起作用。[/编辑]

在我看来,我正在寻找此处描述的 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" 等...,但没有成功。

4

2 回答 2

2

我一直在尝试使用 Pyjnius 中的 MediaScannerConnection 使文件无需重置即可查看,但没有成功。在文件系统中写入文件后,目标是扫描它们。这是运行但没有任何明显效果的代码。

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) 
于 2014-09-12T14:58:13.430 回答
1

或多或少已解决:这显然是 mtp 中的一个已知错误:某些文件,取决于它们的编写方式(我使用的是 Python“打开”指令)在您重新启动设备之前不会显示。事实上,重启设备确实有帮助。

于 2014-09-09T13:16:06.633 回答