3

私のapkバージョンコードはバージョン3です.apkバージョンコード1でロードされたメイン拡張ファイルを使用しています(ファイル名はmain.1.ex.etc.eg.obbに似ています)。拡張ファイルはデバイスに正常にダウンロードされます。

拡張ファイルにはメディア ファイルが含まれているためAPEZProvider、Google Zip Expansion Library から使用して再生しVideoViewます。

呼び出すVideoView.start()と、Nullpointer 例外が発生します。

これまでにわかったこと: InAPEZProvider.initIfNecessary()はメイン拡張ファイルのバージョンを 1 ではなく 3 として返します。したがって、ZipResourceFile(mAPKExtensionFile) を開こうとすると null が返されます。APEZProvider.openAssetFile()原因はNullPointerExceptionそのままmAPKExtensionFileですnull

APEZProviderGoogle Zip Expansion Library のクラスからの関連コード:

  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);      
}

上記のコード行についてよくわかりません:ProviderInfo pi = pm.resolveContentProvider(getAuthority(), PackageManager.GET_META_DATA);これは正しいですか?

PackageManager.resolveContentProvider() の Android リファレンスから。

public abstract ProviderInfo resolveContentProvider (文字列名、int フラグ)

導入されたバージョン: API レベル 1 ベース パス名で単一のコンテンツ プロバイダを検索します。パラメーター

name: 検索するプロバイダーの名前。

flags: 追加のオプション フラグ。現在、常に 0 である必要があります。

私が何か間違ったことをしているのか、それともバグなのか、誰かが確認できますか。

編集: アプリを初めてアップロードしたときにすべてが期待どおりに機能します。この問題が発生するのは、apk を更新してバージョン コードが異なる場合のみです。

4

3 に答える 3

14

Zip ファイル プロバイダー クラスには、APK 拡張ファイルのバージョン番号が APK のバージョン番号と一致しない場合に AndroidManifest.zip ファイルに配置できるメタデータが含まれています。

<provider android:name=".APEZProvider"
              android:authorities="my.application.authority"
              android:exported="false"
              android:multiprocess="true"
    >
   <meta-data android:name="mainVersion"
              android:value="1"></meta-data>
   <meta-data android:name="patchVersion"
              android:value="2"></meta-data>
</provider>
于 2012-06-05T23:39:44.503 に答える
2

独自のプロバイダーを作成し、マニフェストで宣言する必要があります

 <provider android:authorities="com.myCompany.myAppName.provider.ZipFileContentProvider" android:name=".ZipFileContentProvider"></provider>

出典:

SampleZipfileProvider クラスはどこにありますか?

于 2012-04-20T21:54:54.577 に答える
0

よくおっしゃる通り、拡張ファイルのバージョン番号はアプリのバージョンとは異なる場合があります。問題は、拡張ファイルのバージョン番号を知るにはどうすればよいかということです。

考えられる複数の答えの 1 つを次に示します。

APK 拡張ファイル ガイドから:

拡張ファイルのバージョン番号を確認するには、さまざまな方法があります。 簡単な方法の 1 つは、APKExpansionPolicy クラスの getExpansionFileName(int index) メソッドで拡張ファイル名を照会して、ダウンロードの開始時にバージョンをSharedPreferencesファイルに保存することです。その後、拡張ファイルにアクセスするときにSharedPreferencesファイルを読み取ることで、バージョン コードを取得でき ます。

共有ストレージからの読み取りの詳細については、 データ ストレージのドキュメントを参照してください。

于 2012-05-22T20:53:58.750 に答える