8

ということで、Android用の拡張パッケージのサンプルをコピーして、Googleが提供するガイドを元に動作させてみました。ローカルの .obb ファイルを保存することで問題なく動作しましたが、.obb ファイルをダウンロードして動作させることができません。状態は変更されましIDownloaderClient.STATE_COMPLETEDたが、ファイルが見つかりません。

私が経験した手順:

  1. サンプルを実行する ( BASE64_PUBLIC_KEY、 、new package nameで更新version number)
  2. ローカルの .obb ファイルで正常にテストします。
  3. apk を作成し、拡張ファイルと一緒に Play にアップロードします。
  4. 署名済み apk をインストールしてアプリを実行します。<-- ここでは、ダウンロードが成功したと表示されていますが、ダウンロード プロセス中に進行状況が更新されていません。

拡張ファイルのダウンロードを手伝ってください。

編集:ステップ 4 で、リソースが見つからなかったため、ダウンロードに失敗しました。

編集 2:デバッグ後、ステータスがダウンロード不要に変わることがわかりますが、ファイルが見つからないため、ファイルの検証に失敗します。そのため、何らかの理由でファイルがダウンロードされたと考えられます。

編集 3:したがって、DownloaderService.class 内には、getExpansionURLCount()0 を返すa を作成する run() メソッドがありますthis will return zero if there has been no LVL fetch in the current session。さらに掘り下げた後、Google からprocessServerResponse()の応答に応答コード 256 があり、キーがFILE_URL. それで、これの原因は何ですか?

4

3 に答える 3

5

この回答が根本的な問題に対処していないことはわかっていますが、この説明は、ダウンローダ ライブラリからの応答に混乱している私のような他の人に役立つかもしれないと考えました。

STATE_COMPLETEDダウンローダ サービスは、Google ライセンス サーバーがアプリに関連付けられonDownloadStateChanged()た拡張ファイルがないことを通知すると、(やや直感的ではありませんが) に渡します。これを見つけるためにサーバーへの非同期呼び出しを行う必要があるため、NO_DOWNLOAD_REQUIREDから直接戻ることはできませんstartDownloadServiceIfRequired()。サーバーを参照するには、サービスを開始する必要があります。

しかし、これはアプリのインストール後にダウンロード サービスを初めて呼び出したときにのみ行われるようです。その後、ライセンス サーバーからの応答がローカル データベースにキャッシュされ、以降の呼び出しでstartDownloadServiceIfRequired()はすぐに が返されNO_DOWNLOAD_REQUIREDます。

応答コード 256 は に対応しPolicy.LICENSEDます。これは、パッケージ名と公開鍵が有効であることを意味しますが、何もないということは、アプリの拡張ファイルがないFILE_URLと Google Play が認識していることを示しています。

私の場合、拡張ファイルはアプリが下書きの段階では機能していましたが、公開されると事実上ストアから消えてしまいました。理由を特定できませんでした。

于 2014-04-25T06:06:15.290 に答える
1

解決策を数日検索した後、私の場合のエラーが見つかりました。

LicenseChecker を使用して、リスナーがコード 3 の applicationError をコールバックするのを見ました。コードは次のとおりです。

        aep = new APKExpansionPolicy(this,
            new AESObfuscator(ContentDownloaderService.SALT, getPackageName(), deviceId));

        aep.resetPolicy();    

        checker = new LicenseChecker(this, aep,
            BASE64_PUBLIC_KEY // Your public licensing key.
        );

        checker.checkAccess(new LicenseCheckerCallback() {
        @Override
        public void allow(int reason) {
            System.out.println("Allow Reason "+reason);
        }

        @Override
        public void dontAllow(int reason) {
            System.out.println("Don't Allow Reason "+reason);
            try {
                switch (reason) {
                    case Policy.NOT_LICENSED:
                        System.out.println("Not licensed");
                        break;
                    case Policy.RETRY:
                        System.out.println("Retry");
                        break;
                }
            } finally {
            }

        }

        @Override
        public void applicationError(int errorCode) {
            System.out.println("aplication error "+errorCode);
        }

    });

エラー コード 3 は ERROR_NOT_MARKET_MANAGED です。ここでエラーの完全なリストを確認できますhttps://developer.android.com/google/play/licensing/licensing-reference.html#server-response-codes、ここでそれに関する情報を取得できますerror mean LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED エラー コードをどのように処理しますか?

要約すると、これは私のローカル バージョンが Google コンソールのバージョンと同じではないために発生し、versionCode が次のようなスクリプトによって生成されたために発生しました。

def getBuildVersionCode() {
   def date = new Date()
   def formattedDate = date.format('yyMMddHHmm')

   return (formattedDate as int) + 221066279;    
}

def getBuildVersionName() {
return getBuildVersionCode().toString();
}

android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
    applicationId "com.test.testing"
    minSdkVersion 15
    targetSdkVersion 21
    versionCode getBuildVersionCode()
    versionName getBuildVersionName()
}

そのため、コンパイルするたびに新しいバージョンを取得していますが、明らかにそのバージョンは Google コンソールにはありません。

gradle スクリプトを次のように変更しました。

    android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
    applicationId "com.test.testing"
    minSdkVersion 15
    targetSdkVersion 21
    versionCode 1731227595 // My actual version number of apk in google developer console.
    versionName 1731227595 
}

そして、それは私の命を救いました。この答えが誰にとっても役立つことを願っています..

于 2015-10-18T03:34:19.550 に答える
1

完了後のチェックでファイルが「不完全」であることが判明し、削除されたためと考えられます。

1 つの可能性として、ダウンロードしたファイルの長さが に指定した長さと異なる場合がありますandroid.vending/expansion/downloader.Helpers.deosFileExist(Context, String, long, boolean)。最初に、指定された値が実際の値と一致することを確認してください。

これで問題が解決しない場合は、すべてのファイル削除呼び出しにブレークポイントを追加し、いずれかがトリガーされるかどうかを確認してください。

于 2013-08-09T11:14:50.007 に答える