私のapkバージョンコードはバージョン3です。apkバージョンでロードされたメイン拡張ファイルを使用していますコード1(ファイル名はmain.1.ex.etc.eg.obbに似ています)。拡張ファイルはデバイス上で正常にダウンロードされます。URIを持つAPK拡張ファイルにアクセスすると(Google Zip拡張ライブラリを使用)、拡張ファイルのバージョンがapkのバージョンコードと異なる場合にクラッシュします。
拡張ファイルにはメディアファイルが含まれているため、Google Zip拡張ライブラリのAPEZProvider
を使用してVideoView
で再生しています。
VideoView.start()
を呼び出すと、Nullpointer例外が発生します。
私がこれまでに発見したもの:3の代わりに、1として APEZProvider.initIfNecessary()
に戻りメイン拡張ファイルのバージョンをこのようにZipResourceFile
(mAPKExtensionFile)を開こうとはnullを返します。 APEZProvider.openAssetFile()
は、NullPointerException
をmAPKExtensionFile
とすると、null
となります。
APEZProvider
クラスから
関連するコード:
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リファレンスから は、そのベースパス名で単一のコンテンツ・プロバイダーを検索APIレベル1:ので
パブリック抽象ProviderInfo resolveContentProvider(文字列名、int型のフラグ)
。 パラメータ
name:検索するプロバイダの名前。
フラグ:追加のオプションフラグ。現在は常に0にする必要があります。
私は何か間違っているのか、それともバグか誰かが確認できますか?
編集:初めてこのアプリケーションをアップロードするときに、すべてが正常に機能します。これは、この問題が発生するさまざまなバージョンのコードでapkを更新するときだけです。
作品!ありがとう。これはもっと明確に文書化されてはいけませんか?また、pm.resolveContentProvider()については、flagsはゼロでなければならないと書かれていますが、これはAPEZProviderクラスではそうではありません。これについての明確化? – user1318455