【问题标题】:Android In-app Billing crash when retrieving item price检索商品价格时 Android 应用内结算崩溃
【发布时间】:2018-04-26 09:14:57
【问题描述】:

我正在尝试实现 Android 应用内结算。

到目前为止我做了什么:

  1. 添加了aidl 文件。
  2. 添加了util-helper 文件。
  3. 在 Play 管理中心创建应用
  4. 上传了 signed APK 并将产品添加到 Play 管理中心。
  5. Shop.java 文件中添加了一些代码。在我尝试检索商品价格之前,这一切正常(请参阅下面的代码://THIS IS WHERE THE APP CRASHES)。

这是我在onCreate() in Shop.java 中使用的代码

onCreate() {

    //In App Billing
    key = "XXX";
    mHelper = new IabHelper(this, key);
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {

            if (!result.isSuccess()) {
                Log.d(TAG, "In-app Billing setup failed: " + result);
                return;
            }

            if (mHelper == null) return;


            Log.d(TAG, "Setup successful. Querying inventory.");
            try {
                mHelper.queryInventoryAsync(mGotInventoryListener);
            } catch (IabHelper.IabAsyncInProgressException e) {

            }

        }
    });
}

然后是mGotInventoryListener

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

        // Have we been disposed of in the meantime? If so, quit.
        if (mHelper == null) return;

        if (result.isFailure()) {
            // handle error
            return;
        }

        Log.d(TAG, "Query inventory was successful.");

        // Do we have the premium upgrade?
        Purchase premiumPurchase = inventory.getPurchase(ITEM_SKU);
        boolean mIsPremium = (premiumPurchase != null);
        Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));



        //THIS IS WHERE THE APP CRASHES
        String price = inventory.getSkuDetails(ITEM_SKU).getPrice();
        //THIS IS WHERE THE APP CRASHES


        updateUI();
    }
};

错误信息:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: example.com.app, PID: 4270
                                                                           java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String example.com.app.util.SkuDetails.getPrice()' on a null object reference
                                                                               at example.com.app.Shop$2.onQueryInventoryFinished(Shop.java:234)
                                                                               at example.com.app.util.IabHelper$2$1.run(IabHelper.java:711)
                                                                               at android.os.Handler.handleCallback(Handler.java:751)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:154)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:6692)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

【问题讨论】:

    标签: java android android-studio google-play in-app-billing


    【解决方案1】:
    inventory.getSkuDetails(ITEM_SKU);
    

    返回 SkuDetails 对象。但是这个对象可以为空

    SkuDetails details = inventory.getSkuDetails(ITEM_SKU);
    if (details == null) {
       return;
    };
    String price = details.getPrice();
    

    【讨论】:

    • 但是为什么details对象是空的呢?
    • 1.没有购买高级物品。 2. ITEM_SKU 未在 google 中添加。
    • inventory.getAllPurchases() 方法返回什么?
    • 我认为我找到了原因:“您需要将应用程序发布到 Beta/Alpha 才能访问应用内计费功能。”
    • 但是感谢您的帮助!我将执行您的代码以避免这种崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2015-10-08
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多