Der Zugriff auf die APK-Erweiterungsdatei mit URI (mit der Google Zip-Erweiterungsbibliothek) führt zu einem Absturz, wenn sich die Version der Erweiterungsdatei vom apk-Versionscode unterscheidet
Mein Apk-Versionscode ist Version 3. Ich verwende eine Haupterweiterungsdatei, die mit Apk-Versionscode 1 geladen wurde (Dateiname ist ähnlich wie main.1.ex.etc.eg.obb). Die Erweiterungsdatei kann problemlos auf ein Gerät heruntergeladen werden.
Die Erweiterungsdatei hat Mediendatei, also benutze ichAPEZProvider
aus der Google Zip-Erweiterungsbibliothek, um es zu spielenVideoView
.
BerufungVideoView.start()
verursacht eine Nullpointer-Ausnahme.
Was ich bisher gefunden habe:APEZProvider.initIfNecessary()
gibt die Version der Haupterweiterungsdatei als 3 statt als 1 zurück. Daher wird versucht, sie zu öffnenZipResourceFile
(mAPKExtensionFile) gibt null zurück.APEZProvider.openAssetFile()
UrsachenNullPointerException
wiemAPKExtensionFile
istnull
.
Relevanter Code vonAPEZProvider
Klasse in der Google Zip-Erweiterungsbibliothek:
<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>
Ich bin mir bei dieser Codezeile nicht sicher:ProviderInfo pi = pm.resolveContentProvider(getAuthority(), PackageManager.GET_META_DATA);
Ist das richtig?
Aus der Android-Referenz für PackageManager.resolveContentProvider ().
public abstract ProviderInfo resolveContentProvider (String name, int flags)
Seit: API-Ebene 1 Suchen Sie einen einzelnen Inhaltsanbieter anhand seines Basispfadnamens. Parameter
name: Der Name des zu suchenden Anbieters.
flags: Zusätzliche Optionsflags. Derzeit sollte immer 0 sein.
Kann jemand bestätigen, ob ich etwas falsch mache oder ob es ein Fehler ist.
Bearbeiten: alles funktioniert wie erwartet, wenn ich meine App zum ersten Mal hochlade - nur wenn ich die apk aktualisiere, was zu unterschiedlichen Versionscodes führt, tritt dieses Problem auf.