2010年10月5日火曜日

Androidマーケットのライセンスチェック実装サンプル



いよいよ本格的にAndroid2.2(Floyo)が市場に流通しそうな時期になってきました。2.2から処理が速くなったり、Flashがサポートされたりと、いよいよAndroidが盛り上がりそうな予感です。

ただ、「SDカードへのアプリのコピー機能」はアプリ開発者からすると気になりますよね。Androidはアプリが比較的安かったり、ファミコンエミュレータが出回ったりと比較的無法地帯ですので、ライセンス管理が気になります。
そんななかAndroidMarketはライセンスチェックライブラリを正式に提供した模様です。

Google公式ドキュメント(英語)Licensing Your Applications

ただ、まだ日本語のドキュメントがないのが実状ですので、コピペで使いまわせる簡単な実装を公開することにしました。下記のソースコードをActivityから呼び出してください。


AndroidMarketLicenseCheck.java
---------------------------

package com.yourapp.license;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.provider.Settings.Secure;

import com.android.vending.licensing.LicenseChecker;
import com.android.vending.licensing.LicenseCheckerCallback;
import com.android.vending.licensing.ServerManagedPolicy;
import com.android.vending.licensing.AESObfuscator;

public class AndroidMarketLicenseCheck {
private static AndroidMarketLicenseCheck me = new AndroidMarketLicenseCheck();
public static AndroidMarketLicenseCheck getInstance(){
return me;
}

//ここの数字を何となく変えておく
private static final byte[] SALT = new byte[] {
-2, 8, 30, -12, -10, -57, 74, -64, 51, 88, -95,
-2, 98, -17, -36, -11, -11, 2, -64, 89
};
private static final String BASE64_PUBLIC_KEY
= "MIIBIjA....ここに公開鍵を書いておく";

private Activity activity;

private LicenseCheckerCallback mLicenseCheckerCallback;
private LicenseChecker mChecker;

public void onCreate(Activity activity){
this.activity = activity;
mLicenseCheckerCallback = new MyLicenseCheckerCallback();
String deviceId = Secure.getString(activity.getContentResolver(),
Secure.ANDROID_ID);

mChecker = new LicenseChecker(
activity,
new ServerManagedPolicy(
activity,
new AESObfuscator(SALT,
activity.getPackageName(),
deviceId)),
BASE64_PUBLIC_KEY
);

mChecker.checkAccess(mLicenseCheckerCallback);
}

public void onDestroy(){
mChecker.onDestroy();
}

class MyLicenseCheckerCallback implements LicenseCheckerCallback {
public void allow() {
if(false){
//debug
showLicenseErrorDialog("License OK.");
}
}

public void dontAllow() {
showLicenseErrorDialog(
"Not licensed or The network is not connected. "
+ "Please check Google CheckOut or Android Market.");
}

public void applicationError(ApplicationErrorCode errorCode) {
showLicenseErrorDialog("Android Market Server Error: " + errorCode.name());
}

private void showLicenseErrorDialog(String msg){
AlertDialog.Builder dialog = new AlertDialog.Builder(activity);
dialog.setTitle("Error: Android Market License");
dialog.setMessage(msg);
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
activity.finish();
}
});
dialog.show();
}
}
}

---------------------------
ここまで


これを呼び出すときは下記のようにActivityのonCreateとonDestroyから呼び出します。


public class HogeActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
AndroidMarketLicenseCheck.getInstance().onCreate(this);
}

@Override
protected void onDestroy(){
super.onDestroy();
AndroidMarketLicenseCheck.getInstance().onDestroy();
}


なおこのプログラムをコンパイルするには下記の操作が必要です

1. EclipseのAMDマネージャツールでAndroid用のライブラリを全て最新のものに置き換え下記が揃っていることを確認する。

- Market Licesing Package, revision 1 以上
- Google APIs by Google Inc, Android API 8 revision 2 以上

2. Market Licesing PackageのソースコードをEclipseプロジェクトにインポートしてしまう。Linuxの場合、例えば下記にあるソースを一緒にコンパイルする。

android-sdk-linux_86/market_licensing/library/src


3. AndroidManifest.xmlにライセンスチェックをしますよと記述しておく

<uses-permission android:name="com.android.vending.CHECK_LICENSE" />


4. デベロッパーコンソールのプロフィール変更画面から公開鍵をコピーして、プログラムに記述する(画面下の方にあります)


プロフィールの編集 URL(http://market.android.com/publish/editProfile)


5. プログラムも準備できたらテストします。デベロッパーコンソールのプロフィール変更画面の下の方に、「テスト応答」という項目があります。ここを変更すると、エラーが返ったり認証OKが返ったりとテストできます。ちなみにテストで使用するアカウントはAndroidMarketに開発者アカウントとして登録したgmailアカウントがデフォルトで使えるので、特に設定する必要はありません。

0 件のコメント:

コメントを投稿