【问题标题】:How to initialize mService for In-App Billing如何为应用内计费初始化 mService
【发布时间】:2015-12-03 03:08:33
【问题描述】:

我能够在我的应用中成功购买应用内计费项目,但我还无法成功检查用户购买了哪些项目,因为我在此行收到空指针异常:

  ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);

我确实看到了有关此主题的其他帖子,但这些解决方案要么对我不起作用,要么我不完全理解解决方案:

这是整个方法:

private void checkOwnedItems() throws RemoteException {

    Bundle ownedItems;
    String sku = "";

    ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);

    int response = ownedItems.getInt("RESPONSE_CODE");
    if (response == 0) {
        ArrayList<String> ownedSkus = ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
        ArrayList<String> purchaseDataList = ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");

        if (purchaseDataList.size() > 0) {
            //user owns 1 or more items

            for (int i = 0; i < purchaseDataList.size(); ++i) {
                sku = ownedSkus.get(i);
            }
            Toast.makeText(SettingsActivity.this, "You own these features: " + sku, Toast.LENGTH_LONG).show();
        } else {
            //user owns zero items, launch purchase flow
            MACAddress = UniqueID.getMACAddress("wlan0");
            int requestCode = 22222;
            mHelper.launchPurchaseFlow(SettingsActivity.this, productID, requestCode, mPurchaseFinishedListener, MACAddress);

        }
    }
}

我运行了调试器,mService 似乎为空。我应该在哪里以及如何初始化 mService?

目前我正在尝试在 onServiceConnected 方法中初始化 mService,但也许永远不会调用 onServiceConnected。我应该何时以及如何调用 onServiceConnected 方法?

    ServiceConnection mServiceConn = new ServiceConnection()

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

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

【问题讨论】:

  • 仅供参考,我正在尝试按照此处 Google 开发人员文档中的说明,在“查询可供购买的项目”部分下developer.android.com/google/play/billing/… 如果您希望我从应用程序中发布更多代码,或者回答更多问题,我很乐意这样做。

标签: android in-app-purchase in-app-billing


【解决方案1】:

我能够在我的应用中成功购买应用内结算项目,但是 我还不能成功检查用户哪些项目 已购买

您应该使用 Inventory 实例来获取当前用户购买的 ownItems 列表。例如,在应用程序启动时,我正在检查用户是否购买了 My_APP_DEMO_PRODUCT 并基于此我正在更改屏幕的 UI。对于上述用例,我使用的是 QueryInventoryFinishedListener

注意以下代码取自 Google 的 IAB 示例项目。

// Listener that's called when we finish querying the items and subscriptions we own
 IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
     public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
         Log.d(DEBUG_TAG, "Query inventory finished.");

         // if we were disposed of in the meantime, quit.
         if (mHelper == null) {
            return;
         }

         // Is it a failure?
         if (result.isFailure()) {
             complain("Failed to query inventory: " + result);
             return;
         }

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

         /*
          * Check for items we own. Notice that for each purchase, we check
          * the developer payload to see if it's correct! See
          * verifyDeveloperPayload().
          */

         // Do we have the My_APP_DEMO_PRODUCT purchase.
         Purchase premiumPurchase = inventory.getPurchase(My_APP_DEMO_PRODUCT
);
         boolean isPurchased = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));
         if (isPurchased) {
             Log.d(DEBUG_TAG, “User had purchased this My_APP_DEMO_PRODUCT product”);


             // Do whatever you want
             changeAppUI();
         }


         Log.d(DEBUG_TAG, "Initial inventory query finished; enabling main UI.");
     }
 };

而在Activity的onCreate()方法中,

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
                public void onIabSetupFinished(IabResult result) {
                    Log.d(DEBUG_TAG, "Setup finished.");

                    if (!result.isSuccess()) {
                        // Oh noes, there was a problem.
                        complain("Problem setting up in-app billing: " + result);
                        return;
                    }

                    if (mHelper == null) return;

                    // IAB is fully set up. Now, let's get an inventory of stuff we own.
                    Log.d(DEBUG_TAG, "Setup successful. Querying inventory.");
                    mHelper.queryInventoryAsync(mGotInventoryListener);
                }
            });  

【讨论】:

  • 到目前为止,我注意到我忘记在 mHelper.startSetup 方法中调用 mHelper.queryInventoryAsync(mGotInventoryListener)。
  • 到目前为止还有一个问题,我没有在任何地方定义方法 verifyDeveloperPayload。看起来它应该在 Purchase 类中。我想我需要找到这段代码并定义方法。
  • 好的,Rahul,我认为你的回答有效!我不得不用 TrivialDrive 示例中的代码替换 IABHelper.java 中的 QueryInventoryAsync 方法,并声明 mGotInventoryListener 变量。到目前为止,我在两种不同的 Android 设备上进行了测试。我唯一需要测试的仍然是取消我的购买,看看当用户第一次购买时会发生什么。看起来很有希望!
  • @joshgoldeneagle 很高兴知道它对您有所帮助
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
相关资源
最近更新 更多