私の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
。
APEZProvider
Google 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 を更新してバージョン コードが異なる場合のみです。