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.