2014-01-13 19 views
1

我们已经在我们的应用程序中成功使用APK扩展文件技术一段时间,将.obb文件扩展到另一个目录以读取各个部分。我们最终决定尝试通过使用StorageManager进行挂载来直接读取。我们使用的代码在网络上看起来很常见。安装时未调用OnObbStateChangeListener .obb

我们拨打电话:

 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()为true。这个文件在那里。

在寻找答案时,我已经看到很多引用来破坏JOBB工具。它似乎也像Android 4.4有一个错误,阻止这个工作(虽然我现在使用4.4.2)。我想知道这是否足够稳定以用于生产代码。

回答

1

嗯,我想我终于明白发生了什么。它看起来像有问题的OBB文件已经挂载。该文件是一个APK扩展文件,看起来它会自动为系统安装。

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

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

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

+0

这不适合我。它在mount_bb()调用之前或之后没有被安装,监听器没有被调用,但是在设备管理器中,我可以在/ mnt/obb中看到挂载的目录,所以显然它会挂载它。 –

+0

生成安装请求后,需要1/2秒左右的时间进行安装。我现在进入一个睡眠1/2秒的循环,然后检查它是否被安装。它通常在第一次1/2秒睡眠后安装。我认为你需要返回到事件线程才能通过OnObbStateChangeListener获得通知。 – btschumy

+0

现在它适用于我。不知道是什么改变了它,因为我从头开始。 –

0

监听程序未被调用的另一个原因是OBB无效 - 例如未使用正确的程序包名称使用JOBB创建OBB。在我的情况下,我搞砸了创建测试环境,所以试图安装一个使用zip创建旧存储管理/ JOBB扩展文件。我曾经有过一次内部错误事件,但在数百次拉毛尝试中只有一次。看起来,存储管理器在成功排队挂载并从不调用监听器之后将自动失败。一旦我回到基础知识并从头开始重新整理所有内容,我发现了无效的.obb文件,并修复了它,并且它们都按照记录进行工作。

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

+0

Ha - 仅仅为了做一个“快速”测试而错过了2个小时,在obb文件中使用不正确的软件包名称的错误,试图变得聪明(实际上很愚蠢),并从另一个应用复制OBB文件。 – Colin