Доступ к файлу расширения APK с помощью URI (с помощью библиотеки расширения Google Zip) вызывает сбой, если версия файла расширения отличается от версии кода apk
Мой код версии apk - версия 3. вместе с ним я использую основной файл расширения, который был загружен с кодом версии apk 1 (имя файла аналогично main.1.ex.etc.eg.obb). Файл расширения скачивается нормально на устройстве.
Файл расширения имеет медиа-файл, поэтому я используюAPEZProvider
из библиотеки расширения Google Zip, чтобы играть сVideoView
.
призваниеVideoView.start()
вызывает исключение Nullpointer.
Что я нашел до сих пор:
ВAPEZProvider.initIfNecessary()
возвращает версию основного файла расширения как 3 вместо 1. Таким образом, пытаясь открытьZipResourceFile
(mAPKExtensionFile) возвращает ноль.APEZProvider.openAssetFile()
причиныNullPointerException
какmAPKExtensionFile
являетсяnull
.
Соответствующий код отAPEZProvider
класс в библиотеке расширения Google Zip:
<code> private boolean initIfNecessary() { if ( !mInit ) { Context ctx = getContext(); PackageManager pm = ctx.getPackageManager(); ProviderInfo pi = pm.resolveContentProvider(getAuthority(), PackageManager.GET_META_DATA); PackageInfo packInfo; try { packInfo = pm.getPackageInfo(ctx.getPackageName(), 0); } catch (NameNotFoundException e1) { e1.printStackTrace(); return false; } int patchFileVersion; int mainFileVersion; int appVersionCode = packInfo.versionCode; if ( null != pi.metaData ) { mainFileVersion = pi.metaData.getInt("mainVersion", appVersionCode); patchFileVersion = pi.metaData.getInt("patchVersion", appVersionCode); } else { mainFileVersion = patchFileVersion = appVersionCode; } try { mAPKExtensionFile = APKExpansionSupport.getAPKExpansionZipFile(ctx, mainFileVersion, patchFileVersion); return true; } catch (IOException e) { e.printStackTrace(); } } return false; } @Override public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { initIfNecessary(); String path = uri.getEncodedPath(); if ( path.startsWith("/") ) { path = path.substring(1); } return mAPKExtensionFile.getAssetFileDescriptor(path); } </code>
Я не уверен в этой строке кода выше:ProviderInfo pi = pm.resolveContentProvider(getAuthority(), PackageManager.GET_META_DATA);
Это правильно?
Из ссылки на Android для PackageManager.resolveContentProvider ().
public abstract ProviderInfo resolContentProvider (имя строки, int flags)
С тех пор: API Уровень 1 Найдите одного поставщика контента по его базовому пути. параметры
name: имя провайдера для поиска.
флаги: дополнительные опции флагов. В настоящее время всегда должно быть 0.
Может кто-нибудь подтвердить, если я делаю что-то не так или это ошибка.
Изменить: все работает, как ожидалось, когда я загружаю свое приложение в первый раз - только когда я обновляю apk, в результате чего разные коды версий, эта проблема возникает.