OnObbStateChangeListener не вызывается при монтировании.obb
В течение некоторого времени мы успешно использовали технологию файлов расширения APK в нашем приложении, развернув файл.obb в другой каталог для чтения различных фрагментов. В конце концов мы решили попробовать читать прямо из боба, смонтировав его с помощью StorageManager. Код, который мы используем, кажется довольно распространенным в сети.
Мы делаем звонок:
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). Мне интересно, достаточно ли это стабильно для использования в производственном коде.
2 ответа
Ну, думаю, я наконец-то понял, что происходит. Похоже, рассматриваемый файл obb уже был смонтирован. Этот файл был файлом расширения APK, и кажется, что он автоматически смонтирован для вас системой.
Если, прежде чем пытаться смонтировать его, я выполняю:
if (storageManager.isObbMounted( obbFile.getAbsolutePath() ))
{
Log.d("", "obb file mounted at " + storageManager.getMountedObbPath( obbFile.getAbsolutePath() ));
}
без предварительного явного монтирования я получаю правильный путь монтирования. Я действительно хотел бы, чтобы документы (или сообщения LogCat) были более явными об этом. Мне понадобилось около дня, чтобы обнаружить это. Только когда я явно использовал (необходимый) ключ шифрования на obb, я увидел сообщение в LogCat о том, что файл уже смонтирован.
Другой причиной того, что слушатель не вызывается, является то, что OBB является недействительным - например, если он не создан с JOBB с использованием правильного имени пакета. В моем случае я испортил создание тестовой среды и поэтому пытался смонтировать файл расширения pre-Storage Manage / JOBB, созданный по старому пути с помощью zip. Однажды я получил событие внутренней ошибки, но только один раз из сотен попыток потянуть волосы. Похоже, что Storage Manager завершит сбои после установки очередей монтирования и никогда не вызовет слушателя. Как только я вернулся к основам и переделал все с нуля, я обнаружил недействительный файл.obb, исправил его, и все заработало так, как задокументировано.
Обратите внимание, что у меня также есть фоновая задача, которая проверяет монтируется ли файл расширения как запасной вариант, выполняющийся раз в секунду. Я нашел эту идею из веб-статьи где-то. Часто фоновые задачи обнаруживают, что расширение OBB монтируется задолго до вызова обратного вызова слушателя Storage Manager.