1

我们已经在我们的应用程序中成功使用 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 工具的参考。Android 4.4 似乎也有一个错误阻止它工作(尽管我现在使用的是 4.4.2)。我想知道这是否足够稳定以用于生产代码。

4

2 回答 2

1

好吧,我想我终于弄清楚发生了什么。看起来有问题的 obb 文件已经挂载了。该文件是一个 APK 扩展文件,看起来这是系统自动为您安装的。

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

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

没有首先明确安装它,我得到一个有效的安装路径。我真的希望文档(或 LogCat 消息)对此更加明确。我花了大约一天的时间才发现这一点。直到我在 obb 上明确使用(必要的)加密密钥时,我才在 LogCat 中看到一条消息,说文件已经挂载。

于 2014-01-14T16:52:44.693 回答
0

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

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

于 2015-02-27T16:58:07.670 回答