我正在使用Kivy编写Android应用程序,并希望该应用程序写入android文件系统,一些PUBLIC目录/文件。
目前,如果我的应用程序写一个文件(使用Python),该文件可以由android本地文件管理器读取,但不能被我的计算机mtp读取(这些文件不会出现在InternalStorage中)。 adb shell可以看到文件。
[编辑]解决方案可能是使用MediaScannerConnection和Pyjnius扫描文件中的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",I尝试了几个命令,如" buildozer android release --dir public my_dir" ,或者" buildozer android release --public my_dir"等等......没有成功。
答案 0 :(得分:1)
或多或少已解决:这显然是mtp中的已知错误:某些文件,取决于它们的编写方式(我使用Python" open"指令)不显示直到你重新启动设备。实际上,重启设备确实有所帮助。
答案 1 :(得分:1)
我一直在努力尝试使用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)