java - 检索商品价格时 Android 应用内结算崩溃

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

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

到目前为止我做了什么:

  1. 添加了 aidl 文件。
  2. 添加了 util-helper 文件。
  3. 在 Play 管理中心创建应用
  4. 上传了一个签名的 APK 并将产品添加到 Play 管理中心。
  5. Shop.java 文件中添加了一些代码。在我尝试检索项目价格之前,它工作正常(参见代码://THIS IS WHERE THE APP CRASHES under)。

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

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)

最佳答案

inventory.getSkuDetails(ITEM_SKU);

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

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

关于java - 检索商品价格时 Android 应用内结算崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039198/

相关文章:

android-studio - flutter开发时如何配置log cat

java - 如何从Java应用程序获取Jenkins环境变量?

android - 初学者用 eclipse 学习 Unity 3d

java - 传递与参数类型不同的类型

java - 绘制圆形时出现 InvalidClassException。为什么?

android - 从内置的 Android 样式中获取主题属性

android - "Sync Project with Gradle File "到底是什么意思?

Android Studio 代码建议不适用于 Flutter

java - SpringMVC : How to mark two inputs invalid?

java - 创建一个数组,其中每个位置都是枚举类型