简体   繁体   English

付款后应用内购买崩溃(Android,LibGDX)

[英]In app purchase crash after payment (Android, LibGDX)

I've been trying to implement in app purchases in my game using LibGDX and it's almost done there is just one problem, the app crashes everytime I finish buying a item. 我一直在尝试使用LibGDX在我的游戏中实现应用购买,而且几乎完成了一个问题,每当我完成购买一件商品时,应用就会崩溃。 Once I put my credit card and some other details a message appears saying the item was bought and then 5 seconds later it crashes. 一旦我放入信用卡和其他详细信息,就会出现一条消息,提示该物品已购买,然后在5秒钟后崩溃。

So far I've been unable to find anything on the net. 到目前为止,我一直无法在网上找到任何东西。

Here is my code if you can spot something wrong: 如果您可以发现错误,这是我的代码:

public class AndroidLauncher extends AndroidApplication implements RequestHandler, GoogleGameHandler, GameHelperListener {

protected Brot game;
private GameHelper gameHelper;

@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();

    gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES);
    gameHelper.setup(this);

    String base64EncodedPublicKey = "xxxxxx";
    mHelper = new IabHelper(this, base64EncodedPublicKey);
    mHelper.enableDebugLogging(true);

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {
            if (mHelper == null)
                return;

            mHelper.queryInventoryAsync(mGotInventoryListener);
        }
    });
    initialize(new Brot(this, Store.googlePlay, this), config);

    @Override
public void onActivityResult(int request, int response, Intent data) {

    super.onActivityResult(request, response, data);
    gameHelper.onActivityResult(request, response, data);

    if (mHelper == null)
        return;
    mHelper.handleActivityResult(request, response, data);

}

IabHelper mHelper;

final String firesku = "firesku";
final String windsku = "windsku";

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
            math.drop.billing.util.Inventory inventory) {
        if (mHelper == null)
            return;
        if (result.isFailure())
            return;

            Purchase fireitem = inventory.getPurchase(firesku);
        if(fireitem != null){
            mHelper.consumeAsync(inventory.getPurchase(firesku), null);
            return;
        }

        Purchase winditem = inventory.getPurchase(windsku);
        if(winditem != null){
            mHelper.consumeAsync(inventory.getPurchase(windsku), null);
            return;
        }

        }
};

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        if (mHelper == null)
            return;

        if (result.isFailure())
            return;

         if(purchase.getSku().equals(firesku)){
            GameScreen.didbuyfire=true;
            Settings.savefire();
            Settings.save();
            resetScreen();
            mHelper.consumeAsync(purchase, null);
        }

        if(purchase.getSku().equals(windsku)){
            GameScreen.didbuywind=true;
            Settings.savewind();
            Settings.save();
            resetScreen();
            mHelper.consumeAsync(purchase, null);
        }

        }
};

static final int RC_REQUEST = 10001;


public void resetScreen() {
    if(game.getScreen() instanceof GameScreen){
        GameScreen obj = (GameScreen) game.getScreen();
        obj.savePurchases();
        obj.changeScreenWithFadeOut(MainMenuScreens.class, game);
    }
}

@Override
public void buyfire() {
    String payload = UUID.randomUUID().toString();
    mHelper.launchPurchaseFlow(this, firesku, RC_REQUEST,
            mPurchaseFinishedListener, payload);

}

@Override
public void buywind() {
    String payload = UUID.randomUUID().toString();
    mHelper.launchPurchaseFlow(this, windsku, RC_REQUEST,
            mPurchaseFinishedListener, payload);

}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    if (mHelper != null) mHelper.dispose();
       mHelper = null;
}
}

Some details: 一些细节:

The item is purchased succesfully even after the crash (the item is ready to use when opening the app again) 即使在崩溃之后也成功购买了该商品(该商品可以在再次打开应用程序时使用)

Here is the guide I used: http://developer.android.com/training/in-app-billing/preparing-iab-app.html#GetSample 这是我使用的指南: http : //developer.android.com/training/in-app-billing/preparing-iab-app.html#GetSample

Testing of in-app purchases can't be done in eclipse debug, so I can't take a look at logcat 应用内购买的测试无法在Eclipse调试中完成,因此我看不到logcat

Any help would be appreciated. 任何帮助,将不胜感激。

EDIT: From logcat: 编辑:从logcat:

09-25 14:38:01.343: E/AndroidRuntime(3078): FATAL EXCEPTION: main 
09-25 14:38:01.343: E/AndroidRuntime(3078): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=10001, result=-1, data=Intent { (has extras) }} to activity {com.doit.mail2.android/com.doit.mail2.android.AndroidLauncher}: java.lang.NullPointerException
09-25 14:38:01.343: E/AndroidRuntime(3078): at android.app.ActivityThread.deliverResults(ActivityThread.java:2693) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2735) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at android.app.ActivityThread.access$2000(ActivityThread.java:124) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at android.os.Looper.loop(Looper.java:130) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at android.app.ActivityThread.main(ActivityThread.java:3844) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at java.lang.reflect.Method.invokeNative(Native Method) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at java.lang.reflect.Method.invoke(Method.java:507) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at dalvik.system.NativeStart.main(Native Method) 
09-25 14:38:01.343: E/AndroidRuntime(3078): Caused by: java.lang.NullPointerException 
09-25 14:38:01.343: E/AndroidRuntime(3078): at com.doit.mail2.android.AndroidLauncher.resetScreen(AndroidLauncher.java:350) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at com.doit.mail2.android.AndroidLauncher$2.onIabPurchaseFinished(AndroidLauncher.java:251) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at math.drop.billing.util.IabHelper.handleActivityResult(IabHelper.java:467) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at com.doit.mail2.android.AndroidLauncher.onActivityResult(AndroidLauncher.java:60) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at android.app.Activity.dispatchActivityResult(Activity.java:3988) 
09-25 14:38:01.343: E/AndroidRuntime(3078): at android.app.ActivityThread.deliverResults(ActivityThread.java:2689) 
09-25 14:38:01.343: E/AndroidRuntime(3078): ... 11 more

Libgdx has an extension library that provides in-app-billing services in a cross-platform way: https://github.com/libgdx/gdx-pay . Libgdx有一个扩展库,该库以跨平台的方式提供应用程序内计费服务: https://github.com/libgdx/gdx-pay : https://github.com/libgdx/gdx-pay You can use this as-is, or use it as an example for how to interface between core and platform-specific code. 您可以按原样使用它,也可以将其用作如何在核心代码和特定于平台的代码之间进行接口的示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM