スレッドのネクロマンシーは少しありますが、OBBのダウンロードを機能させるのに非常に苦労したので、すべての問題を1か所にまとめたかったのです。グーグルがインターネットからファイルをダウンロードすることをなんとかして、これほど複雑なことは私を超えています。
AndroidStudioへのライブラリの追加
誤った情報の省( https://developer.android.com/google/play/expansion-files.html )によって誇らしげにあなたにもたらされた公式の指示は単に間違っています。
ライブラリをインポートする前に、sdk \ extras \ google \ market_apk_expansion \ downloader_libraryに移動し、project.propertiesを編集して、「android.library.0」行を完全に削除します。また、既存のプロジェクトのターゲットバージョンと一致するように、同じファイルのandroidターゲットバージョン行を更新する必要がある場合もあります。
上記のリンク先のページにあるインストール手順に従って、「ダウンローダーライブラリを使用するための準備」ステップ2は、「ファイル>新規>新しいモジュール」ではなく「ファイル>新規>インポートモジュール」である必要があります。
両方のモジュールをインポートした後、[ファイル]> [プロジェクト構造]に移動し、依存関係を追加します。
- アプリには、ライセンスライブラリとダウンローダーライブラリの両方に「モジュール依存関係」が必要です
- ダウンローダーライブラリには、ライセンスライブラリに対する「モジュール依存関係」が必要です。
「BASE64_PUBLIC_KEY値を更新して、発行元アカウントに属する公開鍵にする必要があります」という手順。また間違っています。アカウントではなく、この特定のアプリの公開鍵が必要です。この公開鍵は、アプリを選択した後、オンラインの開発者コンソールの[サービスとAPI]の下にあります。
ライセンス検証ライブラリとダウンローダーライブラリはどちらも、削除されたパッケージ「org.apache.http」に依存しています。
「decodeExtras」メソッドの2つのインスタンス(APKExpansionPolicy.javaに1つ、ServerManagedPolicy.javaに1つ)を次のように置き換えます。
private Map<String, String> decodeExtras(String extras) {
Map<String, String> results = new HashMap<String, String>();
UrlQuerySanitizer sanitizer = new UrlQuerySanitizer();
sanitizer.setAllowUnregisteredParamaters(true);
sanitizer.setUnregisteredParameterValueSanitizer(new UrlQuerySanitizer.IllegalCharacterValueSanitizer(
UrlQuerySanitizer.IllegalCharacterValueSanitizer.URL_LEGAL));
sanitizer.parseQuery(extras);
for (UrlQuerySanitizer.ParameterValuePair item : sanitizer.getParameterList()) {
String name = item.mParameter;
int i = 0;
while (results.containsKey(name)) {
name = item.mParameter + ++i;
}
results.put(name, item.mValue);
}
return results;
}
「サービスインテントは明示的でなければならない」と言って実行時にクラッシュする
https://stackoverflow.com/questions/24480069で回答を参照してください。
W / LicenseValidator:ライセンスサーバーへの接続中にエラーが発生しました
ライセンス検証ライブラリはエミュレータでは機能しません。これは、エミュレータがスローするエラーです。実際のデバイスを使用している場合は、本物のタイムアウトである可能性があります。
デバッグバージョンは署名チェックに失敗するため(署名検証に失敗)、アクセスが拒否されます。
ライセンス検証サービスを呼び出しているバイナリは、正しく署名されたリリースバージョンである必要があります。そうではないデバッグコピーを実行している場合、ライセンスチェックは失敗します。
- オンラインの開発者コンソール、設定、アカウントの詳細に移動します
- 「LicenseTestResponse」を「LICENSED」(またはテストしているもの)に変更します
- [アクセスをテストするGmailアカウント]にメールアドレスを入力します。
ダウンローダーは「STATE_COMPLETED」を返しますが、ダウンロードは行われません。
これは、前の変更の副作用です。ライセンスは付与されていますが、実際にはライセンスが付与されていないため、APK拡張ファイルはまだ提供されていません。この手順により、ファイルをテストデバイスに手動で配置する代わりに、配布後にダウンロードが発生したときに実際にダウンロードをテストできます。
- アプリのプロモーションコードを作成します。
- まったく新しいGMailアカウント用に、デバイスに新しいユーザーを作成します。
- 新しいユーザーとしてデバイスにログインし、プロモーションコードを利用します。これで、本物のアプリの所有者になりました。
- 前のセクションと同様に、[アクセスをテストするGmailアカウント]の下に新しいGmailアカウントを追加します。
購入または引き換えが失敗するため、開発者のアカウントでこれを行うことはできません。つまり、自分の製品のコピーを所有することはできません。つまり、OBBのダウンロードは機能しません。
アプリの本物のPlayストアコピーを持ち、「偽の」LICENSEDステータスのテストアカウントとして登録されている2番目のアカウントがあるので、コードのデバッグコピーを実行し、LICENSEDステータスを取得して、ダウンロードは期待どおりに機能します。
W / LVLDL:ダウンロードwhavever .obbの要求を中止します:宛先ファイルの書き込み中:java.io.FileNotFoundException:
Android v23以降、SDカードであるかどうかに関係なく、マニフェストにアクセス許可がリストされていることに加えて、「外部ストレージ」に書き込むためのアクセス許可を明示的に要求する必要がありました。https://developer.android.com/guide/topics/permissions/requesting.htmlを参照してください。
「ファイルが見つかりません」とは、ダウンローダーライブラリがOBBファイルを配置する外部ストレージ上のディレクトリを指しますが、作成できませんでした。ファイルを作成できない場合は例外が発生しますが、ディレクトリを作成できない場合はサイレントに失敗します。processResponseHeaders()
DownloadThread.javaを参照してください。
W / LVLDL:ダウンロードメインのリクエストを中止します。.obb:httpエラー410
アプリのバージョン番号は、Googleが認識している現在のAPKのバージョン番号と一致する必要があります。一致しない場合、ダウンロードリクエストはエラー410で拒否されます。
一度有効であることが判明した場合、ライブラリはライセンスを再チェックしません。
テストしている場合は、数回やり直す必要がある可能性があります。ライセンス検証ライブラリは、ライセンスが検出された後の状態をキャッシュします。アプリを完全にアンインストールせずにこれをクリアできます。
DownloadsDB db = DownloadsDB.getDB(my_app_context);
db.updateMetadata(0, 0);
また、ダウンロードしたOBBを所定の位置に保持します。これは、次を使用して検索およびクリアできます。
final String dlName = Helpers.getExpansionAPKFileName(my_app_context, true, expansionVersion);
final String dlFullPath = Helpers.generateSaveFileName(my_app_context, dlName);
File dlFile = new File(dlFullPath);
if (dlFile.exists())
{
dlFile.delete();
}
さて、失礼しますが、私は一ヶ月かそこらの精神的な隠れ家に行きます。