4

jobb ツールを使用して、暗号化された .obb ファイルを作成しました。次のコードを使用して、obb ファイルをマウントします。

    public void mountExpansion() {
    final StorageManager storageManager  = (StorageManager) getContext()
        .getSystemService(Context.STORAGE_SERVICE);


    String packageName = "name.of.the.package";
    String filePath = Environment.getExternalStorageDirectory()
            + "/Android/obb/" + packageName + "/" + "main."
            + version + "." + packageName + ".obb";
    final File mainFile = new File(filePath);
    if (mainFile.exists()) {
        Log.d("STORAGE", "FILE: " + filePath + " Exists");
    } else {
        Log.d("STORAGE", "FILE: " + filePath + " DOESNT EXIST");
    }

    String key = "thisIsMyPassword";
    if (!storageManager.isObbMounted(mainFile.getAbsolutePath())) {
        if (mainFile.exists()) {
            if(storageManager.mountObb(mainFile.getAbsolutePath(), key,
                    new OnObbStateChangeListener() {
                        @Override
                        public void onObbStateChange(String path, int state) {
                            super.onObbStateChange(path, state);
                            Log.d("PATH = ",path);
                            Log.d("STATE = ", state+"");
                            expansionFilePath = storageManager.getMountedObbPath(path);
                            if (state == OnObbStateChangeListener.MOUNTED) {
                                expansionFilePath = storageManager
                                        .getMountedObbPath(path);
                                Log.d("STORAGE","-->MOUNTED");
                            } 
                            else {
                                Log.d("##", "Path: " + path + "; state: " + state);
                            }
                        }
                    }))
            {
                Log.d("STORAGE_MNT","SUCCESSFULLY QUEUED");
            }
            else
            {
                Log.d("STORAGE_MNT","FAILED");
            }

        } else {
            Log.d("STORAGE", "Patch file not found");
        }
    }



}

次の出力が得られます: FILE: filePath Exists SUCCESSFULLY QUEUED

しかし、onObbStateChangeListener内では何も呼び出されていません。カスタム ビューからこの関数を呼び出し、Nexus 4/KitKat でこれをテストしています。

この動作の理由は何でしょうか?

4

2 に答える 2

7

私はこの質問が古いことを知っていますが、これは他の誰かを助けるかもしれません.

StorageManager はリスナーを弱参照に格納します。つまり、サンプル コード (メソッド呼び出しで作成された匿名インスタンス) を考えると、作成するとすぐに、通常はマウントが完了するかなり前に削除されます。不要になるまで、リスナー オブジェクトへの参照を独自のコードで維持する必要があります。

このようなものが動作するはずです:

public class MyClass {

    ...
    private OnObbStateChangeListener mListener =
                new OnObbStateChangeListener() {
                    @Override
                    public void onObbStateChange(String path, int state) {
                       // your code here
                    }
                };

    public void mountExpansion() {
        ...
        if (storageManager.mountObb(mainFile.getAbsolutePath(), key, mListener)
        {
            Log.d("STORAGE_MNT","SUCCESSFULLY QUEUED");
        }
        else
        {
            Log.d("STORAGE_MNT","FAILED");
        }
        ...
     }
     ...
}

obb マウントのこの特定の癖は、私の知る限り、少なくともハニカム以来存在していました。

于 2015-01-09T06:24:46.877 に答える
1

KitKatで導入されたOBBの取り付けにバグがあるようです。現在、回避策は知られていませんが、次の増分アップデートで修正される予定です。

http://code.google.com/p/android/issues/detail?id=61881

于 2013-12-06T21:20:07.737 に答える