Доступ к файлу расширения APK с помощью URI (с помощью библиотеки расширения Google Zip) вызывает сбой, если версия файла расширения отличается от версии кода apk

Мой код версии apk - версия 3. вместе с ним я использую основной файл расширения, который был загружен с кодом версии apk 1 (имя файла аналогично main.1.ex.etc.eg.obb). Файл расширения скачивается нормально на устройстве.

Файл расширения имеет медиа-файл, поэтому я используюAPEZProvider из библиотеки расширения Google Zip, чтобы играть сVideoView.

призваниеVideoView.start() вызывает исключение Nullpointer.

Что я нашел до сих пор: ВAPEZProvider.initIfNecessary() возвращает версию основного файла расширения как 3 вместо 1. Таким образом, пытаясь открытьZipResourceFile (mAPKExtensionFile) возвращает ноль.APEZProvider.openAssetFile() причиныNullPointerException какmAPKExtensionFile являетсяnull.

Соответствующий код отAPEZProvider класс в библиотеке расширения 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>

Я не уверен в этой строке кода выше:ProviderInfo pi = pm.resolveContentProvider(getAuthority(), PackageManager.GET_META_DATA); Это правильно?

Из ссылки на Android для PackageManager.resolveContentProvider ().

public abstract ProviderInfo resolContentProvider (имя строки, int flags)

С тех пор: API Уровень 1 Найдите одного поставщика контента по его базовому пути.  параметры

name: имя провайдера для поиска.

флаги: дополнительные опции флагов. В настоящее время всегда должно быть 0.

Может кто-нибудь подтвердить, если я делаю что-то не так или это ошибка.

Изменить: все работает, как ожидалось, когда я загружаю свое приложение в первый раз - только когда я обновляю apk, в результате чего разные коды версий, эта проблема возникает.

Ответы на вопрос(3)

Ваш ответ на вопрос