購入済みのアプリ内アイテムの調べ方

アプリ内でアイテムを販売して購入されるとその履歴は端末上に保存されます。

購入済みのアイテム一覧を取得するにはgetPurchasedメソッドを使います。

例えば購入済みのアイテムのIDを調べたい場合はこうします。

class MainActivity extends Activity
{	
	IInAppBillingService billingService; 
	
	///課金サービスに接続
	ServiceConnection serviceConn = new ServiceConnection()
	{  
        @Override  
        public void onServiceConnected(ComponentName name, IBinder service)
        {  
            billingService = IInAppBillingService.Stub.asInterface(service); 
            
            ///購入済みのアプリ内アイテムのIDを調べる。
            Bundle ownedItems = billingService.getPurchases(
                     3, getPackageName(), "inapp", null);
            ArrayList<String> purchaseDataList =   
                      ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
            for(String purchaseData : purchaseDataList){
                JSONObject obj = new JSONObject(purchaseData);
                    ///1つのアイテムのJSONオブジェクトを取得
                String inAppItemId = obj.optString("productId", "");
                    ///アプリ内アイテムIDを取得
                Log.d("MainActivity", "productId = " + productId);
            }
	    } 
	   @Override  
	   public void onServiceDisconnected(ComponentName name) 
	   {  
	       billingService = null;
	   }   
	};
	
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		/// 課金サービス開始
        bindService(
            new Intent("com.android.vending.billing.InAppBillingService.BIND"),
            billingServiceConn, Context.BIND_AUTO_CREATE);
	}
}

getPurchasedは次のような引数をとります。

billingService.getPurchases(
		バージョン, パッケージ名, "inapp"または"subs", null);

アプリが一度限りの購入なら"inapp"、消費型なら"subs"を3つ目の引数に渡します。

このメソッドはアプリに関するBundleを返してきて、"INAPP_PURCHASE_DATA_LIST"というキーからアプリのJSONオブジェクトを文字列にした配列が得られ、次のような構造を持ちます。

{ 
    "orderId":"12999763169054705758.1371079406387615", 
    "packageName":"アプリのパッケージ名",
    "productId":"アイテムID",
    "purchaseTime":1234567800000,
    "purchaseState":0,
    "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
    "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
}

"productId"がデベロッパーコンソールで設定したアプリのIDで、"developerPayload"はgetBuyIntentでインテントを発行したときに付加するものです。

ただし、getPurchasesで取得できるアプリ内アイテムの上限は700までと決まっています。

そこでもし700以上を超えているようなら"INAPP_CONTINUATION_TOKEN"キーからnullでないトークンが返ってくるのでそのときにもう一度getPurchasesを呼び出せばOKです。

///購入済みのアプリ内アイテムのIDを調べる。
Bundle ownedItems = billingService.getPurchases(
         3, getPackageName(), "inapp", null);
String continuationToken = ownedItems.getString("INAPP_CONTINUATION_TOKEN");
ArrayList<String> purchaseDataList =   
          ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
for(String purchaseData : purchaseDataList){
    JSONObject obj = new JSONObject(purchaseData);
        ///1つのアイテムのJSONオブジェクトを取得
    String inAppItemId = obj.optString("productId", "");
        ///アプリ内アイテムIDを取得
    Log.d("MainActivity", "productId = " + productId);
}

if(continuationToken != null){
	Bundle ocontinuationItems = billingService.getPurchases(
             3, getPackageName(), "inapp", continuationToken);
    ///続きの処理...
}

このようにgetPurchasesの4つ目の引数に"INAPP_CONTINUATION_TOKEN"から取得したトークンを渡すと継続データを返してきます。

以上が購入済みのアプリ内アイテムの調べ方です。お疲れ様でした。

関連項目
プライバシーポリシー