Dostęp do pliku rozszerzenia APK za pomocą URI (z biblioteką rozszerzeń Google Zip) powoduje awarię, jeśli wersja pliku rozszerzeń różni się od kodu wersji apk

Mój kod wersji apk to wersja 3. Korzystam z głównego pliku rozszerzenia, który został załadowany kodem wersji apk 1 (nazwa pliku jest podobna do głównej wersji 1.ex.etc.eg.obb). Plik rozszerzeń pobiera pliki w porządku na urządzeniu.

Plik rozszerzenia ma plik multimedialny, więc używamAPEZProvider z Biblioteki rozszerzeń Google Zip, aby go odtworzyćVideoView.

PowołanieVideoView.start() powoduje wyjątek Nullpointer.

Co do tej pory znalazłem: InAPEZProvider.initIfNecessary() zwraca główną wersję pliku rozszerzenia jako 3 zamiast 1. Tak więc próbuję otworzyćZipResourceFile (mAPKExtensionFile) zwraca wartość null.APEZProvider.openAssetFile() przyczynyNullPointerException tak jakmAPKExtensionFile jestnull.

Odpowiedni kod zAPEZProvider klasa w bibliotece rozszerzeń 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>

Nie jestem pewien co do tej linii kodu w powyższym:ProviderInfo pi = pm.resolveContentProvider(getAuthority(), PackageManager.GET_META_DATA); Czy to jest poprawne?

Odwołanie do Androida dla PackageManager.resolveContentProvider ().

public abstract ProviderInfo resolveContentProvider (String name, int flags)

Ponieważ: Interfejs API poziomu 1 Znajdź pojedynczego dostawcę treści według jego nazwy ścieżki podstawowej. Parametry

nazwa: nazwa dostawcy do znalezienia.

flagi: dodatkowe flagi opcji. Obecnie zawsze powinno być 0.

Czy ktoś może potwierdzić, że robię coś złego lub jest to błąd.

Edytuj: wszystko działa zgodnie z oczekiwaniami, gdy przesyłam aplikację po raz pierwszy - tylko wtedy, gdy zaktualizuję apk, co spowoduje pojawienie się różnych kodów wersji, w których występuje ten problem.

questionAnswers(3)

yourAnswerToTheQuestion