6

アプリ内課金のバージョン 3 に「TrivialDrive」の例を使用したアプリのアプリ購入に実装しました。静的応答を使用してアプリをテストしましたが、すべて期待どおりに動作します。

しかし、市場からアプリをダウンロードすると、購入に成功するとアプリがクラッシュし、

私のコードは購入成功です

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

    if (purchase != null) {
    if (purchase.getSku().equals(Constants.IN_APP_PURCHASE_PRODUCT_ID)) {
        // bought the premium upgrade!
        String message = getResources().getString(R.string.app_purchase_successful_msg);
        mIsPremium = true;
        updateUi(mIsPremium);
        successAlert(message);
    }
    }
}
};

購入が成功したときにメッセージを設定しましたが、このメッセージが表示されません (これらのリンスが実行されていないことを意味します)。購入に成功すると、支払いが成功した後にアプリケーションがクラッシュします。

アプリを再起動してアイテムを購入しようとすると、既に購入済みと表示されます。

開発者コンソールからクラッシュ レポートを取得しました。

02-09 02:01:13.181: E/AndroidRuntime(11530): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=10001, result=-1, data=Intent { (has extras) }} to activity {com.eknathkadam.grammaruplite/com.webrich.base.ui.GoogleInAppPurchaseActivity}: java.lang.NullPointerException
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3141)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.access$1100(ActivityThread.java:130)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.os.Looper.loop(Looper.java:137)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.main(ActivityThread.java:4745)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at java.lang.reflect.Method.invokeNative(Native Method)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at java.lang.reflect.Method.invoke(Method.java:511)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at dalvik.system.NativeStart.main(Native Method)
**02-09 02:01:13.181: E/AndroidRuntime(11530): Caused by: java.lang.NullPointerException
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.google.billing.Base64.decode(Base64.java:434)**
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.google.billing.Security.generatePublicKey(Security.java:87)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.google.billing.Security.verifyPurchase(Security.java:66)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.google.billing.IabHelper.handleActivityResult(IabHelper.java:437)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.webrich.base.ui.GoogleInAppPurchaseActivity.onActivityResult(GoogleInAppPurchaseActivity.java:238)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.Activity.dispatchActivityResult(Activity.java:5192)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
02-09 02:01:13.181: E/AndroidRuntime(11530):    ... 11 more
02-09 02:02:20.610: E/JavaBinder(250): !!! FAILED BINDER TRANSACTION !!!
02-09 02:02:20.638: E/MountService(250): Listener dead
02-09 02:02:20.638: E/MountService(250): Listener dead
02-09 02:02:22.028: E/InputDispatcher(250): channel '41f313f0 com.android.vending/com.android.vending.AssetBrowserActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
02-09 02:03:59.884: E/PowerManagerService(250): Excessive delay setting brightness: 198ms, mask=2 

この行の onActivityResult() メソッドで Null Pointer Exceptions をスローしています

if (!mHelper.handleActivityResult(requestCode, resultCode, data))

方法はこんな感じ

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);

// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
    // not handled, so handle it ourselves (here's where you'd
    // perform any handling of activity results not related to in-app
    // billing...
    super.onActivityResult(requestCode, resultCode, data);
} else {
    Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}

静的応答では問題なく動作しますが、市場から購入するとクラッシュします。

4

5 に答える 5

0

このスレッドが古いことは知っていますが、おそらく同じ問題が発生しただけです。あなたの方法は何ですか

complain("Error purchasing: " + result);

行う?

私は呼びました

Toast.makeText(getParent(), "Premium purchased successfully", Toast.LENGTH_LONG)
                    .show();

まったく同じ場所にあり、これにより次のエラーが発生しました。

06-26 14:02:54.229: E/AndroidRuntime(25681): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=10001, result=0, data=Intent { (has extras) }} to activity {sf.com.flightBook/sf.com.flightBook.ui.configuration.ConfigurationMain}: java.lang.NullPointerException

それでも問題が解決しない場合は、「complain()」メソッドを確認してください。

于 2014-06-26T12:04:53.567 に答える
0

私も同じ問題を抱えていました。私が見つけたのは、アプリ内購入ボックスが表示されると、アプリのアクティビティでメソッド onPause が実行され、ボックスが閉じられるとメソッド onResume が実行されることです。これらのメソッドのコードは次のとおりです。

@Override
public void onPause()
{
   mWakeLock.release();
   super.onPause();
}

@Override
public void onResume()
{
   super.onResume();
   mWakeLock.acquire();
}

最後に、mWaveLock が実行されている行を削除します。

@Override
public void onPause()
{
   super.onPause();
}

@Override
public void onResume()
{
   super.onResume();
}

そしてそれはうまくいきます。それが誰かを助けることを願っています。

于 2014-01-16T11:54:43.173 に答える
0

私はまったく同じ問題に直面していました。その後、購入プロセス中にアクティビティ全体が(理由もなく)再作成されることがあることに気付きました。トリビアの例を個別にテストして、そのアプリでも発生するかどうかを確認していませんが、課金プロセス (または、自分のアプリで使用するその例のヘルパー メソッド) に関連しているように見えるので、期待できます。それも)。

私自身のコードの課金部分とトリビアの例の唯一の違いは、特定のイベントで起動されたメソッドから mHelper をインスタンス化していたのに対し、トリビアの例では onCreate からインスタンス化されていることです。だから私はその変更を行いました(私は今onCreateからmHelperの新しいインスタンスを作成しています)、そしてすべてがうまくいき始めました. 問題は、アクティビティが再作成されると、mHelper が onCreate で再度インスタンス化されるため、次の onActivityResult への呼び出しで null にすることはできません。

正直なところ、アクティビティが再作成される理由と、アクティビティの新しいインスタンスの onActivityResult メソッドが呼び出される理由はわかりませんが、すべてが機能しているようです。

于 2013-02-14T11:50:51.757 に答える