Android InApp, java.lang.NullPointerException при покупке товара в JsInterface

Я пытаюсь купить товар в своем приложении для Android, когда пользователь нажимает кнопку через JsInterface.

Метод purchaseItem() выполняется, а launchPurchaseFlow() внутри этого метода нет. Вы знаете решение этой проблемы?

OnCreate() я выполняю queryInventory с IabHelper, и ответ в порядке.

Вот частичный код части покупки моей MainActivity, принудительно привязанный к android.test.purchased и в основном скопированный из примера TrivialDrive:

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);
      }
    }

А вот мой 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);
  }

 }

Консоль возвращает это (java.lang.NullPointerException):

06-05 12:09:05.219: E/JSInterface(9248): покупка SKU: android.test.purchased 06-05 12:09:05.219: D/PURCHASE(9248): покупка 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): в com.mcrae.confess.jsinterface.purchaseSku(jsinterface.java:27) 06-05 12:09:05.219: W/ System.err(9248): на com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(собственный метод) 06-05 12:09:05.219: W/System.err(9248): на com.android.org. chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27) 06-05 12:09:05.219: W/System.err(9248): в android.os.Handler.dispatchMessage(Handler.java:102) 06-05 12:09:05.219: W/System.err(9248): на android.os.Looper.loop(Looper.java:146) 06-05 12:09:05.219: W/System.err(9248): на android .os.HandlerThread.run(Handl erThread.java:61)


person Matthieu Marcé    schedule 05.06.2015    source источник


Ответы (3)


Измените это:

MainActivity cls2= new MainActivity();
cls2.purchaseItem(sku);

To :

mContext.startActivity(new Intent(mContext, MainActivity.class).putExtra("item", sku));

И затем, в вашем OnCreate в MainActivity:

String item = getIntent().getStringExtra("item");
purchaseItem(item);
person Nik Myers    schedule 05.06.2015

Вы создаете MainActivity, используя новое ключевое слово. Таким образом, объект mHelper имеет значение null, тогда возникает исключение, вы не можете напрямую создать объект MainActivity.

MainActivity cls2= new MainActivity();// invalid object creation for activity.
cls2.purchaseItem(sku);
person Krishna V    schedule 05.06.2015

Ваша переменная mHelper возвращает значение null до того, как она вызовет метод launchPurchaseFlow(). Убедитесь, что ваш mHelper не нулевой

person Sahana P    schedule 05.06.2015