2017-07-06 4 views
0

私のアプリ内購入は非常にうまくいきますが、ユーザーが購入したくないときに「Googleストアのポップアップダイアログ」をキャンセルすると、アプリがクラッシュします(終了します)。ユーザーがアプリ内アイテムを購入したくない場合やGoogleストアのポップアップダイアログをキャンセルすると、アプリがクラッシュします。どうして?

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
           Intent data) { 
    if (!mHelper.handleActivityResult(requestCode, 
      resultCode, data)) { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 

     if (purchase.getSku().equals(ITEM_SKU)) { 
      Log.d(TAG, "Purchase is fast mode"); 
      try { 
       mHelper.consumeAsync(purchase, mConsumeFinishedListener); 
      } catch (Exception e) { 
       Log.d(TAG, "error"); 
      } 
     } 

    } 
}; 


IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
    public void onConsumeFinished(Purchase purchase, IabResult result) { 

     Log.d(TAG, "Consumption finished. JSON: " + purchase.getOriginalJson() + ", signature: " + purchase.getSignature()); 

     if (mHelper == null) return; 

     if (result.isSuccess()) { 
      Log.i(TAG, "BOUGHT THE ITEM :-)"); 
      clickButton.setEnabled(true); 
      buyButton.setEnabled(false); 
     } else { 
      Log.e(TAG, "Error while consuming: " + result); 
     } 
     Log.d(TAG, "End consumption flow."); 
    } 
}; 
+0

アプリケーションがクラッシュしたときにlogcatエラーを投稿してください。 – DaveNOTDavid

+0

今のところ、私はそれをテストする物理的なデバイスがありません。助言がありますか? –

+0

さて、エミュレータでさえ、アプリケーションがクラッシュした後、いくつかのエラーが発生するはずです。 AndroidモニターでIDE logcatを確認しましたか? – DaveNOTDavid

答えて

1

これは購入ダイアログが開いたときに呼び出されるものですので、問題はあなたのOnIabPurchaseFinishedListenerインターフェースにあり、かつプロセスがあるためキャンセルされたときに、すぐにメソッドの外に出るようにしてくださいする必要があります:私はこの次のコードを持っていますおそらくNullPointerExceptionにつながる購入を確認するSKUはありません。つまり、次のように検証メソッドを(消費者が消費した完成品のリスナーと同じように)追加します:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 

     // If we were disposed of in the meantime, exits out of the method. 
     if (mHelper == null) return; 

     // If purchase was cancelled, exits out of the method. 
     if (result.isFailure()) { 
      Log.d(TAG, "Error purchasing: " + result); 
      return; 
     } 

     // If user authentication is invalid, exits out of the method. 
     if (!verifyDeveloperPayload(purchase)) { 
      Log.d(TAG, "Error purchasing. Authenticity verification failed."); 
      return; 
     } 

     // Only then if all of the validation conditions are met will the following be executed. 
     if (purchase.getSku().equals(ITEM_SKU)) { 
      Log.d(TAG, "Purchase is fast mode"); 
      try { 
       mHelper.consumeAsync(purchase, mConsumeFinishedListener); 
      } catch (Exception e) { 
       Log.d(TAG, "error"); 
      } 
     } 

    } 
}; 
+0

これで完成したリスナーでコードが実行されませんでした –

+0

@IriskulTurduevどういう意味ですか?リスナーではどのコードが実行されませんでしたか?これは、物理デバイスbtwでテストする必要があります。 – DaveNOTDavid

+1

助けてくれてありがとう、私はこのコードを追加した場合(購入== null)リターン;今すぐ終了しない –

関連する問題