Android 装载.obb时未调用OnobStateChangeListener

Android 装载.obb时未调用OnobStateChangeListener,android,mount,apk-expansion-files,Android,Mount,Apk Expansion Files,一段时间以来,我们一直在应用程序中成功地使用APK扩展文件技术,将.obb文件扩展到另一个目录中,以便读取各种片段。我们最终决定尝试使用StorageManager直接读取bob。我们正在使用的代码在网络上似乎很常见 我们呼吁: if ( storageManager.mountObb( obbFile.getAbsolutePath(), null, obbListener ) ) { Log.d( "STORAGE_MNT", "SUC

一段时间以来,我们一直在应用程序中成功地使用APK扩展文件技术,将.obb文件扩展到另一个目录中,以便读取各种片段。我们最终决定尝试使用StorageManager直接读取bob。我们正在使用的代码在网络上似乎很常见

我们呼吁:

        if ( storageManager.mountObb( obbFile.getAbsolutePath(), null, obbListener ) )
        {
            Log.d( "STORAGE_MNT", "SUCCESSFULLY QUEUED" );
        }
        else
        {
            Log.d( "STORAGE_MNT", "FAILED" );
        }
这将以“成功排队”的形式成功。然而,事后从不调用obbListener。如果查看LogCat,您会看到以下内容:

Calling a method in the system process without a qualified user: 
android.app.ContextImpl.bindService:1543 
com.android.server.MountService$ObbActionHandler.connectToService:2458 
com.android.server.MountService$ObbActionHandler.handleMessage:2337 
android.os.Handler.dispatchMessage:102 android.os.Looper.loop:136 
我认为这与问题有关,但我无法找到关于为什么没有“合格用户”的更多信息。有人能解释一下这里发生了什么吗

我们已验证obbFile.exists()为真。这个文件在那里


在寻找答案的过程中,我看到了很多关于损坏JOBB工具的参考资料。看起来安卓4.4也有一个bug阻止了它的工作(尽管我现在正在使用4.4.2)。我想知道这是否足够稳定,可以用于生产代码。

好吧,我想我终于知道发生了什么。看起来问题中的obb文件已经装入。该文件是一个APK扩展文件,系统会自动为您装载该文件

如果在尝试装载之前,我执行:

        if (storageManager.isObbMounted( obbFile.getAbsolutePath() ))
        {
            Log.d("", "obb file mounted at " + storageManager.getMountedObbPath( obbFile.getAbsolutePath() ));
        }

如果不先显式挂载它,我将获得一个有效的挂载路径。我真希望文档(或LogCat消息)能更明确地说明这一点。我花了大约一天的时间才发现这一点。直到我在obb上明确使用了(必要的)加密密钥,我才在LogCat中看到一条消息,说文件已装入。

未调用侦听器的另一个原因是obb无效-例如未使用正确的包名创建JOBB。在我的例子中,我把创建测试环境搞砸了,因此试图挂载一个使用zip旧方法创建的预存储管理/JOBB扩展文件。我曾经遇到过一次内部错误事件,但在数百次尝试中只有一次。似乎存储管理器在成功地将装载排队后会无声地失败,并且永远不会调用侦听器。当我回到基础并从头开始重新编辑所有内容时,我发现了无效的.obb文件,并对其进行了修复,所有这些都按照文档记录的方式工作


请注意,我还有一个后台任务,用于测试作为备用装载的扩展文件,该文件每秒运行一次。我从某个地方的一篇网络文章中发现了这个想法。后台任务通常会在调用Storage Manager侦听器回调之前发现OBB扩展已装载。

这对我不起作用。它不会在mountObb()调用之前或之后装入,也不会调用listener,但在设备管理器中,我可以看到/mnt/obb中装入的目录,很明显它会装入它。生成装入请求后,装入大约需要1/2秒。我现在进入一个循环休眠1/2秒,然后检查它是否已安装。它通常在第一次1/2秒睡眠后安装。我想你需要返回到事件线程,通过OnobStateChangeListener获得通知。它现在对我有效。不知道是什么改变了它,因为我从头开始。哈-刚刚花了2个小时,犯了完全相同的错误,在obb文件中使用了不正确的包名,试图变得聪明(实际上很愚蠢),从不同的应用程序复制一个obb文件,只是为了做一个“快速”测试。