2013-10-22 61 views
6

我使用的是购买ap的样品。我的应用程序有2个按钮,第一个按钮默认是禁用的,点击第二个按钮将购买并启用第一个按钮。购买按钮正常工作,但购买后,我检查了库存,但它总是返回空值,这意味着我还没有购买。inventory.getPurchase()总是返回null,尽管已经购买了

这里是源代码:

设置:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    buyButton = (Button) findViewById(R.id.buyButton); 
    clickButton = (Button) findViewById(R.id.clickButton); 
    clickButton.setEnabled(false); 
    String base64EncodedPublicKey = "key"; 
    mHelper = new IabHelper(this, base64EncodedPublicKey); 

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     public void onIabSetupFinished(IabResult result) { 
      if (!result.isSuccess()) { 
       Log.d(TAG, "In-app Billing setup failed: " + result); 
      } else { 
       Log.d(TAG, "In-app Billing is set up OK"); 
      } 
      // Query to detect user was buy this item or not 
      mHelper.queryInventoryAsync(mReceivedInventoryListener); 
     } 
    }); 

    buyButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (clickButton.isEnabled()) { 
       mHelper.queryInventoryAsync(mReceivedInventoryListener); 
      } else { 
       buyClick(v); 
      } 
     } 
    }); 
} 

的团购项目点击:

public void buyClick(View view) { 
    mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001, 
      mPurchaseFinishedListener, ""); 
} 

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
     if (result.isFailure()) { 
      // Handle error 
      return; 
     } else if (purchase.getSku().equals(ITEM_SKU)) { 
      // consumeItem(); 
      // buyButton.setEnabled(false); 
      mHelper.consumeAsync(purchase, mConsumeFinishedListener); 
     } 

    } 
}; 

监听器:

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

     if (result.isFailure()) { 
      Toast.makeText(getApplicationContext(), 
        "Query Inventory Error!", Toast.LENGTH_SHORT).show(); 
      // Handle failure 
     } else { 
      Toast.makeText(getApplicationContext(), 
        "Query Inventory Success!", Toast.LENGTH_SHORT).show(); 
      // mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU), 
      // mConsumeFinishedListener); 
      // if (inventory.hasPurchase(ITEM_SKU)) { 
      // clickButton.setEnabled(true); 
      // } 
      Purchase item = inventory.getPurchase(ITEM_SKU); 
      if (item != null) { 
       clickButton.setEnabled(true); 
      } else { 
       Toast.makeText(getApplicationContext(), 
         "This item was not buy yet!", Toast.LENGTH_SHORT) 
         .show(); 
      } 
     } 
    } 
}; 
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
    public void onConsumeFinished(Purchase purchase, IabResult result) { 

     if (result.isSuccess()) { 
      Toast.makeText(getApplicationContext(), "Consume done!", 
        Toast.LENGTH_SHORT).show(); 
      clickButton.setEnabled(true); 
     } else { 
      Toast.makeText(getApplicationContext(), "Consume Error!", 
        Toast.LENGTH_SHORT).show(); 
      // handle error 
     } 
    } 
}; 

当买第一次点击按钮,它显示付款日期在付款成功后,clickButton被启用。

但是,当我第二次单击buyButton时,它将转至库存,但inventory.getPurchase(ITEM_SKU)始终返回null。

有什么想法?

谢谢!

+0

根据你的问题,我认为你试图购买一次产品,我是对吗?如果是,那么你不需要为单次购买调用consumeFinish处理程序。 – Maulik

+0

只是从onIabFinishListner“mHelper.consumeAsync(purchase,mConsumeFinishedListener);” 欲了解更多信息:http://stackoverflow.com/questions/19195864/android-inapp-billing-error-response-7item-already-owned/19218084#19218084并尝试再次购买,让我知道它会解决或不。 – Maulik

+0

@Maulik我尝试让用户只购买一次商品。如果用户删除应用程序并再次安装,我会检查用户是否已经购买了该项目,那么用户不需要再次购买。 –

回答

9

just comment or remove your code from OnIabPurchaseFinishedListener "mHelper.consumeAsync(purchase, mConsumeFinishedListener);"

如果你喜欢那么Android的默认琐碎的演示去的保费 产品的购买的单次产品的购买。

OnIabPurchaseFinishedListener()

// Callback for when a purchase is finished 
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
     public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
      Log.d(TAG, "Purchase finished: " + result + ", purchase: " 
        + purchase); 
      if (result.isFailure()) { 
       complain("Error purchasing: " + result); 
       // setWaitScreen(false); 
       return; 
      } 
      if (!verifyDeveloperPayload(purchase)) { 
       complain("Error purchasing. Authenticity verification failed."); 
       // setWaitScreen(false); 
       return; 
      } 

      Log.d(TAG, "Purchase successful."); 


       if (purchase.getSku().equals(SKU_PREMIUM)) { 
          // bought the premium upgrade! 
          Log.d(TAG, "Purchase is premium upgrade. Congratulating user."); 
        alert("Thank you for upgrading to premium!"); 
        } 

     } 
    }; 

释为什么它给空数据:

务请注意,谷歌将存储从他们身边,只有当你 试图数据购买一次性购买产品。但每当你购买消费品 谷歌Play商店将不会被管理它的 产品购买细节和谷歌播放控制台中的其他东西。 这就是为什么我们必须调用consumeAsync()方法。当我们购买 项目时,Google Play商店保留一次为 购买了记录项目,并允许您第二次购买。

了解更多信息: android: Inapp billing: Error response: 7:Item Already Owned

但是,在这里,你正试图购买的产品作为一个单一的一次性购买,所以你一定不要需要调用consumeAsync在onIabPurchasedFinishListener()方法。

希望它能解决您的问题。

+0

在答案中添加了OnIabPurchaseFinishedListener()方法。检查我编辑的答案。 – Maulik

+0

感谢您的回答!它的工作:-) –

+0

这确实很好地解释了这个问题。投了! –