Androidでアプリ開発を行っているのですが、Google Play Billing Libraryを使ったアプリ内課金で躓いています。
Android Developersのチュートリアルはなんとか動いたのですが、いざ自分で実装してみると原因不明のエラーが発生して困っています。
以下、Android Developersを見ながら自分なりに書いてみたコードです。購入可能なアイテムを取得し、リスト表示するだけのシンプルなものです。(Google Play Consoleで同じIDのアイテムを実装済みです。)
public class MainActivity extends AppCompatActivity { BillingClient billingClient; TextView textView; ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ビューの取得 listView = findViewById(R.id.list); textView = findViewById(R.id.text); // クライアントの初期化 billingClient = BillingClient.newBuilder(MainActivity.this) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build(); // クライアントの接続 billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { // The BillingClient is ready. You can query purchases here. textView.setText("接続しました"); } else { textView.setText("接続できませんでした"); } } @Override public void onBillingServiceDisconnected() { // Try to restart the connection on the next request to // Google Play by calling the startConnection() method. textView.setText("切断しました"); } }); // 購入可能アイテムの表示 List<String> skuList = new ArrayList<>(); List<String> resList = new ArrayList<>(); skuList.add("jp.test.item01"); skuList.add("jp.test.item02"); skuList.add("jp.test.item03"); SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP); billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) { int responseCode = billingResult.getResponseCode(); String debugMessage = billingResult.getDebugMessage(); switch (responseCode) { case BillingClient.BillingResponseCode.OK: if (skuDetailsList == null || skuDetailsList.isEmpty()) { Toast.makeText(MainActivity.this, "アイテムがありません", Toast.LENGTH_LONG).show(); } else { for (SkuDetails skuDetails : skuDetailsList) { String sku = skuDetails.getSku(); resList.add(sku); } } break; case BillingClient.BillingResponseCode.SERVICE_DISCONNECTED: case BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE: case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE: case BillingClient.BillingResponseCode.ITEM_UNAVAILABLE: case BillingClient.BillingResponseCode.DEVELOPER_ERROR: case BillingClient.BillingResponseCode.ERROR: case BillingClient.BillingResponseCode.USER_CANCELED: case BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED: case BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED: case BillingClient.BillingResponseCode.ITEM_NOT_OWNED: default: Toast.makeText(MainActivity.this, debugMessage, Toast.LENGTH_LONG).show(); } } }); // アイテムをリストに表示 ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, resList); listView.setAdapter(adapter); } private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { // To be implemented in a later section. } }; }
これをGoogle Play Consoleの内部テストに上げて実行すると、SERVICE_DISCONNECTEDのエラーが発生します。Android Developersによると、BillingResponseCodeのSERVICE_DISCONNECTEDは一時的な問題とのことですが、何度やっても同じエラーが出ます。初期化の時点ではレスポンスOKとなっているので接続は問題なさそうですが、アイテム取得時のSERVICE_DISCONNECTEDはどのような状況なのでしょうか。また、どのように対処すればよいのでしょうか。
ふわっとした質問で大変恐縮ですが、追加の検証などが必要な場合はお申し付けください。
それでは、よろしくお願いいたします。
あなたの回答
tips
プレビュー