我们已经成功地在我们的应用中使用了APK扩展文件技术,将.obb文件扩展到另一个目录中以读取各个部分。我们最终决定尝试使用StorageManager安装它,直接从bob中读取。我们使用的代码在网上看起来很常见。
我们打电话:
if ( storageManager.mountObb( obbFile.getAbsolutePath(), null, obbListener ) )
{
Log.d( "STORAGE_MNT", "SUCCESSFULLY QUEUED" );
}
else
{
Log.d( "STORAGE_MNT", "FAILED" );
}
并且成功为“SUCCESSFULLY QUEUED”。但是之后永远不会调用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)。我想知道它是否足够稳定以用于生产代码。
答案 0 :(得分:1)
好吧,我想我终于弄清楚发生了什么。看起来有问题的obb文件已经安装。该文件是一个APK扩展文件,系统会自动为您安装此文件。
如果在尝试安装之前,我执行:
if (storageManager.isObbMounted( obbFile.getAbsolutePath() ))
{
Log.d("", "obb file mounted at " + storageManager.getMountedObbPath( obbFile.getAbsolutePath() ));
}
没有先显式安装它,我得到一个有效的挂载路径。我真的希望文档(或LogCat消息)对此更加明确。我花了一天时间才发现这一点。直到我在obb上明确使用了(必要的)加密密钥,我在LogCat中看到一条消息说文件已经被挂载。
答案 1 :(得分:0)
监听器未被调用的另一个原因是OBB是无效的 - 例如没有使用正确的包名创建JOBB。在我的情况下,我搞砸了创建测试环境,所以试图安装一个使用zip创建旧方式的预存储管理/ JOBB扩展文件。我曾经有过一次内部错误事件,但在数百次拔毛尝试中只有一次。似乎存储管理器在成功排队挂载后将以静默方式失败,并且永远不会调用侦听器。一旦我回到基础并从头开始重新编写所有内容,我发现了无效的.obb文件,修复了它,并且所有文件都有记录。
请注意,我还有一个后台任务,用于测试正在安装的扩展文件作为每秒运行一次的回退。我从一个网络文章中找到了这个想法。后台任务通常会在调用Storage Manager侦听器回调之前安装OBB扩展。