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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage