2012-04-07 9 views
2

私の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()は、NullPointerExceptionmAPKExtensionFileとすると、nullとなります。

Googleのジップ拡張ライブラリで 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を更新するときだけです。

答えて

13

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> 
+0

作品!ありがとう。これはもっと明確に文書化されてはいけませんか?また、pm.resolveContentProvider()については、flagsはゼロでなければならないと書かれていますが、これはAPEZProviderクラスではそうではありません。これについての明確化? – user1318455

2

あなたは独自のプロバイダを作成する必要がありますし、あなたのマニフェスト

から撮影
<provider android:authorities="com.myCompany.myAppName.provider.ZipFileContentProvider" android:name=".ZipFileContentProvider"></provider> 

でそれを宣言します。あなたがよく言うように、拡張ファイルのバージョン番号がの異なる場合があります

Where is the SampleZipfileProvider class?

+0

私の質問はリンクされたものと同じではありません。プロバイダは既に宣言されています。 VideoView.setVideoURI()では、apkのバージョンコードと拡張ファイルのバージョンが同じであれば、ビデオは正常に動作します。 apkのバージョンコードが拡張ファイルのバージョンと異なる場合は動作しません。 – user1318455

+0

それはしないでください。バージョンコードは、拡張ファイル名と一致する必要があります。 – Blundell

+0

更新されたapkをアップロードする場合、以前のapkでアップロードされた拡張ファイルを使用できます。この場合、ファイル拡張のバージョンはapkのバージョンコードとは異なりますが、URIを介してこのビデオにアクセスする以外はすべて動作します。私には、APEZProviderの問題が増えています。 – user1318455

0

アプリのバージョン。だから問題は、どのように私は拡張ファイルのバージョン番号を知っているのですか?ここで

は、複数の可能な答えの一つだ:

APK Expansion Files guideから:

あなたが拡張ファイルのバージョン番号 決定することができる多くの方法があります。1つの簡単な方法は、APKExpansionPolicyクラスのgetExpansionFileName(int index) メソッドを使用して、拡張ファイル名 を照会して、ダウンロードが開始されるとSharedPreferences ファイルにバージョンを保存することです。拡張ファイルにアクセスする場合は、 SharedPreferencesファイルを読んでバージョンコードを取得できます。

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

関連する問題