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

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

ただいまの
回答率

88.92%

Androidアプリ内課金について

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 655

k-kozaki

score 8

前提・実現したいこと

Androidで課金処理を作成したいです。

発生している問題・エラーメッセージ

基本的にデベロッパーサイト通りに進めております。

E/EventBus: Could not dispatch event: class com.agrihd.japanpoint.dt.event.SendRequestEvent to subscribing class class com.agrihd.japanpoint.ui.activity.main.MainActivity
            java.lang.NullPointerException
                at com.agrihd.japanpoint.ui.activity.main.MainActivity.onEvent(MainActivity.java:159)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:515)
                at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:485)
                at org.greenrobot.eventbus.EventBus.postToSubscription(EventBus.java:420)
                at org.greenrobot.eventbus.EventBus.postSingleEventForEventType(EventBus.java:397)
                at org.greenrobot.eventbus.EventBus.postSingleEvent(EventBus.java:370)
                at org.greenrobot.eventbus.EventBus.post(EventBus.java:251)
                at com.agrihd.japanpoint.ui.activity.main.MainViewClient.hasStartPurchase(MainViewClient.java:40)
                at com.agrihd.japanpoint.ui.activity.main.MainViewClient.onLoadResource(MainViewClient.java:51)
                at com.android.webview.chromium.WebViewContentsClientAdapter.onLoadResource(WebViewContentsClientAdapter.java:359)
                at com.android.org.chromium.android_webview.AwContentsClientCallbackHelper$1.handleMessage(AwContentsClientCallbackHelper.java:95)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:157)
                at android.app.ActivityThread.main(ActivityThread.java:5872)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:515)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1069)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885)
                at dalvik.system.NativeStart.main(Native Method)
D/EventBus: No subscribers registered for event class org.greenrobot.eventbus.SubscriberExceptionEvent

該当のソースコード

    IInAppBillingService mService;

    ServiceConnection mServiceConn = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
        }

        @Override
        public void onServiceConnected(ComponentName name,
                                       IBinder service) {
            mService = IInAppBillingService.Stub.asInterface(service);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bootstrap.startLocationService(this);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        UiUtil.showSplash(this);

        Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
        serviceIntent.setPackage("com.agrihd.japanpoint");
        bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);

        if (UiUtil.chkNetwork(this, true)) {
            UiUtil.chkAppPermissions(this);
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.getSettings().setSaveFormData(false);
            mWebView.getSettings().setSupportMultipleWindows(true);
            mWebView.setWebViewClient(new MainViewClient());
            mWebView.setWebChromeClient(new MainChromeClient());
            mWebView.loadUrl(Constants.MAIN_BASE_URL);
        } else { /** network error. **/}
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(SendRequestEvent e) {
        switch (e.mEventId) {
            case Constants.SEND_REQUEST_RECEIPT:
                if (UiUtil.chkCamera(this, true)) {
                    Contexts.param(this,
                            new AbstractMap.SimpleEntry(Contexts.USER_ID, e.mParams[0]),
                            new AbstractMap.SimpleEntry(Contexts.RECEIPT_ID, e.mParams[1]));
                    Intent intent = new Intent(getApplicationContext(), ReceiptActivity.class);
                    ActivityCompat.startActivityForResult(this, intent, e.mEventId, null);
                } else { /** camera permission error. **/}
                break;
            case Constants.SEND_REQUEST_PURCHASE:
                ArrayList<String> skuList = new ArrayList<String>();
                skuList.add("100points");
                skuList.add("200points");
                skuList.add("300points");
                skuList.add("400points");
                Bundle querySkus = new Bundle();
                querySkus.putStringArrayList("ITEM_ID_LIST", skuList);

                try {
                    Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
                    int response = skuDetails.getInt("RESPONSE_CODE");
                    String sku = null;
                    if (response == BILLING_RESPONSE_RESULT_OK) {
                        ArrayList<String> responseList = skuDetails.getStringArrayList("DETAILS_LIST");
                        for (String thisResponse : responseList) {
                            JSONObject object = new JSONObject(thisResponse);
                            sku = object.getString("productId");
                                String price = object.getString("price");
                                if (sku.equals("100points")) m100points = price;
                                else if (sku.equals("200points")) m200points = price;
                                else if (sku.equals("300points")) m300points = price;
                                else if (sku.equals("400points")) m400points = price;
                        }
                        Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(),
                                sku, "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
                        if( buyIntentBundle.getInt( "RESPONSE_CODE" ) == BILLING_RESPONSE_RESULT_OK ) {
                            PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
                            startIntentSenderForResult(pendingIntent.getIntentSender(),
                                    Constants.SEND_REQUEST_PURCHASE, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
                                    Integer.valueOf(0));
                        }
                    }
                } catch (RemoteException | JSONException | IntentSender.SendIntentException ex) {
                    ex.printStackTrace();
                }
                break;
            default:
                break;
        }
    }

補足情報(言語/FW/ツール等のバージョンなど)

検証は実機で行っております。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る