1

私はKivyを使用してAndroidアプリをコーディングしています.Androidファイルシステム、いくつかのPUBLICディレクトリ/ファイルにアプリを書き込みたいです。

現在、アプリが (Python を使用して) ファイルを書き込む場合、そのファイルは Android のローカル ファイル マネージャーで読み取ることができますが、コンピューターの mtp では読み取ることができません (これらのファイルは InternalStorage には表示されません)。ただし、adbシェルはファイルを見ることができます。

[編集] 解決策は、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 の「open」命令を使用しています)、デバイスを再起動するまで表示されません。実際、デバイスを再起動すると効果がありました。

于 2014-09-09T13:16:06.633 に答える