I'm trying to purchase an item in my android app when the user clicks on a button through JsInterface
.
The method purchaseItem()
is executed but launchPurchaseFlow()
inside this method is not. Do you know the solution to this issue ?
OnCreate() i perform a queryInventory
with IabHelper
and the response is just fine.
Here is the partial code of the purchase part of my MainActivity, forced to android.test.purchased, and mainly copied from the TrivialDrive sample :
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.d("PURCHASE", "Purchase finished: " + result + ", purchase: " + purchase);
if (mHelper == null) return;
if (result.isFailure()) {
Log.d("PURCHASE","Error purchasing: " + result);
return;
}
Log.d("PURCHASE", "Purchase successful.");
if (purchase.getSku().equals("android.test.purchased")) {
Log.d(TAG, "Purchase is gas. Starting gas consumption.");
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
}
}
};
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase, IabResult result) {
Log.d("CONSUME", "Consumption finished. Purchase: " + purchase + ", result: " + result);
if (mHelper == null) return;
if (result.isSuccess()) {
Log.d("CONSUME", "Consumption successful. Provisioning.");
Log.d("CONSUME","You bought gas");
}
else {
Log.d("CONSUME","Error while consuming: " + result);
}
Log.d("CONSUME", "End consumption flow.");
}
};
public void purchaseItem(String sku_item) {
Log.d("PURCHASE", "Buy "+sku_item);
String payload = "";
mHelper.launchPurchaseFlow(this, "android.test.purchased", 1001, mPurchaseFinishedListener, payload);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
if (requestCode == 1001) {
int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
if (resultCode == RESULT_OK) {
try {
JSONObject jo = new JSONObject(purchaseData);
String sku = jo.getString("productId");
Log.d("PURCHASE RESULT","You have bought the " + sku + ". Excellent choice, adventurer!");
}
catch (JSONException e) {
Log.d("PURCHASE RESULT","Failed to parse purchase data.");
e.printStackTrace();
}
}
}
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
}
And here is my JsInterface
:
public class jsinterface {
Context mContext;
jsinterface(Context c) { mContext = c; }
@JavascriptInterface
public void purchaseSku(String sku) {
Log.e("JSInterface","Purchase SKU : " + sku);
MainActivity cls2= new MainActivity();
cls2.purchaseItem(sku);
}
}
Console returns this (java.lang.NullPointerException) :
06-05 12:09:05.219: E/JSInterface(9248): Purchase SKU : android.test.purchased 06-05 12:09:05.219: D/PURCHASE(9248): Buy android.test.purchased 06-05 12:09:05.219: W/System.err(9248): java.lang.NullPointerException 06-05 12:09:05.219: W/System.err(9248): at com.mcrae.confess.MainActivity.purchaseItem(MainActivity.java:208) 06-05 12:09:05.219: W/System.err(9248): at com.mcrae.confess.jsinterface.purchaseSku(jsinterface.java:27) 06-05 12:09:05.219: W/System.err(9248): at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 06-05 12:09:05.219: W/System.err(9248): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27) 06-05 12:09:05.219: W/System.err(9248): at android.os.Handler.dispatchMessage(Handler.java:102) 06-05 12:09:05.219: W/System.err(9248): at android.os.Looper.loop(Looper.java:146) 06-05 12:09:05.219: W/System.err(9248): at android.os.HandlerThread.run(HandlerThread.java:61)
Change this:
MainActivity cls2= new MainActivity();
cls2.purchaseItem(sku);
To :
mContext.startActivity(new Intent(mContext, MainActivity.class).putExtra("item", sku));
And then, in your OnCreate
in MainActivity
:
String item = getIntent().getStringExtra("item");
purchaseItem(item);