Acessar o arquivo de expansão do APK com o URI (com a biblioteca de expansão do Google Zip) causa uma falha se a versão do arquivo de expansão for diferente do apkcode
Meu código de versão apk é a versão 3. com ele estou usando o arquivo de expansão principal que foi carregado com o código de versão apk 1 (nome do arquivo é semelhante ao main.1.ex.etc.eg.obb). O arquivo de expansão é baixado corretamente em um dispositivo.
O arquivo de expansão tem arquivo de mídia, então eu usandoAPEZProvider
da Biblioteca de Expansão do Google Zip para reproduzi-lo comVideoView
.
ChamandoVideoView.start()
provoca uma exceção Nullpointer.
O que eu encontrei até agora: emAPEZProvider.initIfNecessary()
retorna a versão do arquivo de expansão principal como 3 em vez de 1. Assim, tentando abrirZipResourceFile
(mAPKExtensionFile) retorna nulo.APEZProvider.openAssetFile()
causasNullPointerException
ComomAPKExtensionFile
énull
.
Código relevante deAPEZProvider
classe na Biblioteca de Expansão do 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>
Não tenho certeza sobre essa linha de código no acima:ProviderInfo pi = pm.resolveContentProvider(getAuthority(), PackageManager.GET_META_DATA);
Isso está correto?
De referência Android para PackageManager.resolveContentProvider ().
Resumo público ProviderInfo resolveContentProvider (nome da string, int flags)
Desde: API Nível 1 Encontre um único provedor de conteúdo por seu nome de caminho base. Parâmetros
name: o nome do provedor a ser encontrado.
flags: sinalizadores de opção adicionais. Atualmente deve ser sempre 0.
Alguém pode confirmar se estou fazendo algo errado ou é um bug.
Edit: tudo funciona como esperado quando eu carregar meu aplicativo pela primeira vez - é só quando eu atualizar o apk resultando em códigos de versão diferente que esse problema ocorre.