質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

0回答

1903閲覧

Androidのアプリ内課金(Google Play Billing Library)でSERVICE_DISCONNECTEDになります

KumaChan

総合スコア37

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2021/08/08 07:19

編集2021/08/12 06:57

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はどのような状況なのでしょうか。また、どのように対処すればよいのでしょうか。

イメージ説明

ふわっとした質問で大変恐縮ですが、追加の検証などが必要な場合はお申し付けください。
それでは、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問