アプリにLVLでライセンスを追加する
有料アプリなどをマーケット以外で不正利用されるのを防ぎたい場合はアプリにライセンスを追加する必要があります。
手順は次の通りです。
- 開発環境の準備
- LVL(Licensing Verfication Library)の導入
- アプリへのライセンスの付加
- ライセンスのテスト
- デベロッパーコンソールへのアプリのアップロード
開発環境の準備
アプリ内でライセンスの認証を行うにはLVLというライブラリを導入するのですが、その前に開発環境でそのライブラリが使えるようにします。
まずeclipseで「Android SDK Manager」を開き、次のように「Google Play Licensing Library」にチェックをつけてライブラリをインストールします。
インストールが完了すればエミュレーター内でLVLが利用できるようになります。
また、もしエミュレーターのAPIレベルが8未満だった場合はLVLが利用できないのでなるべくAPIレベルが8以上のエミュレーターを作成するようにしてください。
自分が使っているエミュレーターのAPIレベルがいくつかを調べるには下の画像のように「Android Virtual Device Manager」を開いてその中からエミュレーターの編集画面の「Target : 」の項目を見れば分かります。(下の例ではAPIレベルは18)
もしAPIレベルが8以上だったら特別な設定をする必要はありません。もし8未満なら「Android SDK Manager」の「Google APIs」の中からAPIレベルが8以上のものをインストールしてください。
LVLの使い方
次にeclipse側でLVLが使用できるようにします。LVLはSDKがインストールされているフォルダのextas/google/play_licensingフォルダ以下にまとめられています。
その中のlibraryフォルダを自分のアプリのワークスペースにコピーするかライブラリとして追加するなどして自分のアプリに組み込みます。
アプリに組み込んだらアプリのプロパティ画面を開き、「java Build Path」にLVLを追加し、「Order and Export」にもライブラリのチェックをつけておきます。
これでLVLをコード中で使用できるようになります。
アプリにライセンス処理を付け加える
まずライセンス認証をする前にAndroidManifest.xmlに次のようにライセンスチェックを行うための権限を追加します。
</application>
<uses-sdk android:minSdkVersion="3" />
<!--APIレベルは3以上-->
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
<!--ライセンスチェックの権限を追加-->
</manifest>
コード側ではアプリを使用しているユーザーがgooglアカウントを持っているか、つまり買ったのかどうかを判断してアプリの実行を続行するか中断するかの処理を書きます。
public class MainActivity extends Activity { private static final String BASE64_PUBLIC_KEY = "ここを公開鍵で置き換え"; //ライセンス認証のための公開鍵 private static final byte[] SALT = new byte[] { -46, 65, 30, -128, -103, -57, 74, -64, 51, 88, -95, -45, 77, -117, -36, -113, -11, 32, -64, 89 }; //ランダムな20個のbyte配列 private LicenseChecker licenseChecker; private MyLicenseCheckerCallback myLicenseCheckerCallback; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String device_ID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); //端末のID ServerManagedPolicy policy = new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), device_ID)); myLicenseCheckerCallback = new MyLicenseCheckerCallback(); licenseChecker = new LicenseChecker(this, policy, BASE64_PUBLIC_KEY); doLicenseCheck(); //ライセンス認証 } /**アプリを使用できるかどうか判断する。*/ private void doLicenseCheck() { licenseChecker.checkAccess(myLicenseCheckerCallback); } /**ライセンスをチェックするクラス*/ private class MyLicenseCheckerCallback implements LicenseCheckerCallback { @Override public void allow(int reason) { //アプリの使用が許可されたときの処理 if(isFinishing()){ return; } Toast.makeText(MainActivity.this, "アプリは使用可能", Toast.LENGTH_LONG).show(); } @Override public void dontAllow(int reason) { //アプリが不正利用されていた時の処理 if(isFinishing()){ return; } Toast.makeText(MainActivity.this, "アプリを使用できません。", Toast.LENGTH_LONG).show(); finish(); } @Override public void applicationError(int errorCode) { //アプリにエラーがあった時の処理 if(isFinishing()){ return; } } } @Override public void onDestroy() { super.onDestroy(); licenseChecker.onDestroy(); } }
この例ではアプリを実行して不正利用されていたならアプリをすぐに閉じ、そうでないなら実行を継続するような処理をしています。
コード中にBASE64_PUBLIC_KEYという変数がありますが、この変数にデベロッパー画面でAPKをアップロードするときに表示されるライセンスキーをコピーして貼り付けます。
下の画像がライセンスキーを表示している画面でライセンスキーは灰色で囲まれた部分の文字列です。
ライセンスのテスト
エミュレーター上で正しくライセンス認証が行われているかを確かめるにはデベロッパー画面の「設定」を開きその中のライセンステストに「テスト用のアクセス権があるGmailアカウント」を追加します。
上の画像のようにテスト用のGmailアカウントのメールアドレスを最大400個まで追加することができます。
ライセンス応答には「LICENCED」を選んでおくとテスト用のGmailアカウントが設定されているエミュレーターだけでアプリの起動が許可されるようになります。
デベロッパーコンソールへのアプリのアップロード
ライセンステストするにはデベロッパーコンソールにアプリがアップロード(公開はしなくてもOK)されていることが必須です。
デベロッパーコンソールに設定しなくてはいけない項目は次の3つです。
- GooglePlayにAPK(署名付き)がアップロードされているか
- デベロッパーコンソールでアプリが有料に設定されているか
- ストアの掲載情報の必須情報が入力されているか
これだけは設定しておかないとライセンステストできないので注意です。
また、デベロッパーコンソールにAPKをアップロードしても設定反映には1時間くらいかかるのでそれまで待ちましょう。
これでアプリのライセンスチェックができるはずです。
お疲れ様でした。では、また!