PlayマーケットからAPK以外をダウンロードしてみる

LVL (Licence Verification Library)は、Playストアから落としたアプリかどうかをチェックする機能。
http://developer.android.com/guide/google/play/licensing/index.html

でもLVL自体が欲しいわけじゃなくて、APK Expansion Fileを使いたいだけだったりします。Expansionは、APK (アプリケーションパッケージ)に入りきらない付属ファイル等をPlayストアに上げさせてくれるもの。

Expansionは、ZIP形式になっていて、複数個を上げるのに対応しています。

いろいろ準備

http://developer.android.com/guide/google/play/licensing/setting-up.html によると、Playストアに開発者登録している場合には、「プロフィール」から「公開鍵」が得られます。これはLVLで必要になるのでメモ。

ライセンスライブラリとダウンロードライブラリは SDK Manager から落とせます。
落としてもjarでなく、ソースが来ます。(SDK)/extras/google/{play_licensing, play_apk_expansion} が必要。自分のワークスペースに複写して、プロジェクトをインポートしてやった方がいいかも知れない。

eclipseを立ち上げた後の作業

src/src と srcフォルダが重なってたり、res/res と resフォルダが重なってたり、といくつかおかしいところがあります。
ここは黙ってファイルを移動させるのがおとなというもの。それでうまくいきます。

次に、プロジェクトごとにライブラリ指定をやりなおします。そのままだとパスがおかしいので、プロジェクトのプロパティの"Android"でいじります。

また、デフォルトではAnrdoid 4のSDKを読むようになっていて、もっと低いのに対応させたいと思って、古いは新しいを兼ねるだろ、とSDKバージョンを落とすと、なんかいろいろ問題が出るので、ここは何もしないでおくのが得策。

ダウンローダライブラリ

ダウンローダライブラリには com.example.expansion.downloader 配下のクラス SampleAlarmReceiver, SampleDownloaderActivity, SampleDownloaderService を参考にというか自分のプロジェクトに放り込みます。
次にSampleDownloaerActivityのxAPKSを適切なのに書き換える。SampleDownloaderServiceのBASE64_PUBLIC_KEYは、さきほどPlayストアの開発者プロフィールに出てきたあれをコピペします。SampleDownloaderServiceのSALTは適当に変えます、ていうか

static {
  SALT = new byte[20];
  SecureRandum rand = new SecureRandum();
  rand.nextBytes(SALT);
}

とやって、都度異なるSALTになるようにしています。…本当にこれで大丈夫なんだろうか…?

AndroidManifest.xml

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

あたりのパーミッションダウンローダには必要。本体ではINTERNETとWRITE_EXTERNAL_STORAGE以外は使ってないじょ。

ライセンス確認ができない

とりあえず自分用に作り変えてコンパイルして、
完全にはまったのが、リソースがみつからんとかなんとか怒られた時。デバッガで追っていくと、ライセンスが取れてないというもの。

で、どこかでHTTPアクセスの記述があるだろうと思ったけれども見つからない。いったいどうやってんだよこれ、と思ったところ、http://y-anz-m.blogspot.jp/2011/03/androidapplication-licensing.html

License Verification Library (LVL) は Android Market クライアントとライセンスサービス間のライセンスに関連したやりとり全てをハンドルする

という記述が。

えー、ときどき手持ちの端末はIS-03だと申しておりますが、こやつはバッテリ容量が少なくて、「バックグラウンドデータ」のチェックボックスを外してるんですね。それで、Playストアを開くと、バックグラウンドデータが無効になってるから実行できません、とか言われるんですね。

これだこれ。バックグラウンドデータが無効になってるから、Playストアアプリが動かないからだ。

ということで、「バックグラウンドデータ」を有効にする。

おー、動いた。