在Android中挂载加密的obb apk扩展文件

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");
        }
    }



}

我看到的输出是: 文件:filePath 存在 已成功排队 但是,在 onObbStateChangeListener 中没有任何内容被调用。我正在从自定义视图中调用此函数,并在 Nexus 4/ KitKat 上进行测试。
这种行为的原因是什么?
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挂载的这种特殊问题至少从蜂巢版本开始就存在了。

安装 OBB 文件后,我能否在目录 /Android/obb/(包名) 中看到所有的资源文件?那么,我该如何在我的项目中使用这些资源文件? - Krunal Shah
我面临着类似的情况(请参见我的类似问题:https://dev59.com/s5jga4cB1Zd3GeqPIU9d),并尝试了此答案中建议的方法,但状态仍然为20。您最近找到解决方案了吗? - ez4nick
这应该是被接受的答案!这个问题已经困扰我一段时间了,而且它只是随机的;有时它可以工作,有时它会失败。成为不确定性GC的主题是最有意义的。我还没有看到结果(因为它是随机的),但如果它失败了,我会再次报告。 - hasen

1

是的,修复程序已经在KitKat 4.4.1中发布了。 - chochim
2
仍然无法在搭载Android 4.4.4的Nexus 4上运行。 - Mathias Conradt
@MathiasLin - 我在Android 4.4.4上也遇到了类似的问题。你能解决这个问题吗? - chochim
@chochim 不好意思,目前我正在使用未加密的obb。 - Mathias Conradt
如何创建未加密的OBB文件? - Krunal Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接