未决意图和切换活动的应用内计费问题 [英] In App BIlling trouble with Pending Intents and switching activities

查看:26
本文介绍了未决意图和切换活动的应用内计费问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,所以我已经尝试解决这个问题好几天了,我不是来这里找人为我做我的工作,因为我一直在排除故障并修复 LogCat 中的每一条错误消息.我正在使用 Andengine 开发 Android 游戏(这可能是问题的一部分,因此熟悉它会有所帮助).我没有做任何太花哨的事情,我的游戏活动都是单一场景,没有任何物理或类似的东西,只有一堆精灵和纹理.我还在游戏中的所有其他活动中使用了 Andengine,因为我发现它是设置具有图形吸引力的屏幕的一种非常简单的方法.一个这样的屏幕是我的应用内商店,用户可以在那里购买关卡包和新精灵.这一切的计费部分都很好用,购买通过市场进行,那里没有什么太复杂......

Ok so I have been trying to fix this for days, and I'm not coming here looking for someone to do my work for me as I have been troubleshooting and fixed every single error message in the LogCat. I am developing an Android game using Andengine (this might be part of the problem so being familiar with it could help). I'm not doing anything too fancy, my game activities are all single scene and don't have any Physics or anything like that, just a bunch of sprites and textures. I also used Andengine for all of the other activities in my game because I find it to be a very easy way to set up graphically appealing screens. One such screen is my in-app store, where users can buy levelpacks and new sprites. The billing part of this all works great, the purchases go through to the Market and there's nothing too complicated there...

当用户点击购买时,市场屏幕会弹出并加载他们选择的产品(这些是真正的产品,虽然游戏没有发布,但不是安卓测试).市场屏幕会在当前活动上弹出,无论我是使用Android 2.0"实现,它是游戏堆栈的一部分,还是我使用Android 1.6"实现,它是它自己的堆栈的一部分.我更愿意使用 Android 2.0 实现,但如果我只能让 1.6 工作,我会接受.因此,无论如何,当用户使用后退按钮取消购买或使用信用卡完成购买时,都会出现问题,这两者都会导致市场屏幕消失并且应用程序开始一个新的活动,该活动只是一个黑屏(最终时间并导致力关闭).购买通过 OK 但用户没有得到产品,因为在我们获得更改用户在游戏中的物品的代码之前游戏强制退出.现在对于一些代码,我使用了本教程 (http://www.anddev.org/advanced-tutorials-f21/simple-inapp-billing-payment-t52060.html) 而没有做任何改变.BillingHelper 类是最重要的,因为它包含 requestPurchase() 方法和 startBuyPageActivity() 方法.我从我的 StoreFront 活动中调用请求购买,如下所示:

When the user clicks buy, the market screen pops up and loads the product they have selected (these are real products, not the android tests although the game is not published). The Market screen pops up over the current activity, regardless of whether I use the "Android 2.0" implementation where it is part of the game's stack or I use the "Android 1.6" implementation and it is part of its own stack. I would prefer to use the Android 2.0 implementation but if I can only get the 1.6 to work I will take that. So anyway, the problem arises when the user either cancels the purchase using the back button or completes the purchase with a credit card, both result in the market screen disappearing and the app starting a new activity that is just a black screen (which eventually times out and causes a force close). The purchase goes through OK but the user does not get the product because the game force quits before we get to the code to change the user's items in the game. Now for some code, I used this tutorial (http://www.anddev.org/advanced-tutorials-f21/simple-inapp-billing-payment-t52060.html) without changing much of anything. The BillingHelper class is most important, as it holds the requestPurchase() method and the startBuyPageActivity() methods. I call request purchase from my StoreFront activity like this:

            BillingHelper.requestPurchase(StoreFront.this, itemID); 

在 StoreFront 的 onCreate 中,我有这些东西(按照 tut 的指示去做):

and in the onCreate of the StoreFront I have this stuff (as told to do by the tut):

        startService(new Intent(mContext, BillingService.class));
    BillingHelper.setCompletedHandler(mTransactionHandler);

...

//some handler that billing needs
public Handler mTransactionHandler = new Handler(){
    public void handleMessage(android.os.Message msg) {
        Log.i(TAG, "Transaction complete");
        Log.i(TAG, "Transaction status: "+BillingHelper.latestPurchase.purchaseState);
        Log.i(TAG, "Item purchased is: "+BillingHelper.latestPurchase.productId);

        if(BillingHelper.latestPurchase.isPurchased()){
            //TODO do something here if we've completed our latest purchase,
            //this should be with the status bar notifications and
            //saved preferences
        }
    };

};

所以我不认为问题出在那里.下面是 BillingHelper 的相关部分

So I don't think the problem lies there. Here are the relevant parts of BillingHelper

protected static void requestPurchase(Context activityContext, String itemId){
    if (amIDead()) {
        return;
    }
    Log.i(TAG, "requestPurchase()");
    Bundle request = makeRequestBundle("REQUEST_PURCHASE");
    request.putString("ITEM_ID", itemId);
    try {
        Bundle response = mService.sendBillingRequest(request);

        //The RESPONSE_CODE key provides you with the status of the request
        Integer responseCodeIndex   = (Integer) response.get("RESPONSE_CODE");
        //The PURCHASE_INTENT key provides you with a PendingIntent, which you can use to launch the checkout UI
        PendingIntent pendingIntent = (PendingIntent) response.get("PURCHASE_INTENT");
        //The REQUEST_ID key provides you with a unique request identifier for the request
        Long requestIndentifier     = (Long) response.get("REQUEST_ID");
        Log.i(TAG, "current request is:" + requestIndentifier);
        C.ResponseCode responseCode = C.ResponseCode.valueOf(responseCodeIndex);
        Log.i(TAG, "REQUEST_PURCHASE Sync Response code: "+responseCode.toString());

        startBuyPageActivity(pendingIntent, new Intent(), activityContext);
    } catch (RemoteException e) {
        Log.e(TAG, "Failed, internet error maybe", e);
        Log.e(TAG, "Billing supported: "+isBillingSupported());
    }
}

我尝试从 StoreFront 调用各种参数作为ActivityContext",例如 StoreFront.this、getApplicationContext()、其他地方的静态上下文存储、其他地方存储的静态 Activity、getBaseContext() 任何我能想到的...

Which I have tried calling from StoreFront with a variety of arguments as "ActivityContext" such as StoreFront.this, getApplicationContext(), a static context store elsewhere, a static Activity stored elsewhere, getBaseContext() anything I could possible think of...

这是其他相关活动

private static void startBuyPageActivity(PendingIntent pendingIntent, Intent intent, Context context){
    //android 1.6 method
    try {
        pendingIntent.send(context, 0, intent);         
    } catch (CanceledException e){
        Log.e(TAG, "startBuyPageActivity CanceledException");
    }
}

没什么特别的,我只是希望用户在购买商品或在此过程中按回时返回到我的任何活动(最好是 StoreFront).请帮助!

Nothing fancy, I just want the user to be returned to any of my various activities (preferably StoreFront) when they either buy the item or press back during the process. HELP PLEASE!

我想要任何可能的解决方案,允许应用内结算在购买完成后返回到我的应用,即使是最混乱的解决方案.

I want any possible solution to allow in-app billing to return to my app after the purchase is complete, even the messiest solution.

编辑

问题所在的 logcat 和方法调用:

A logcat and method calls of what the issue:

  "BillingService Starting", 
  BillingHelper.setCompletedHandler(), 
  StoreFront.onStart() called, 
  StoreFront.onResume() called, 
  "BillingService Service starting with onCreate", 
  "BillingService Market Billing Service Successfully Bound", 
  "BillingService Market Billing Service Connected", 
  BillingHelper.instantiateHelper(), 
  then this is where I actually click the buy button in the store (all of that runs just when opening StoreFront):
  BillingHelper.setCompletedHandler(), 
  BillingHelper.isBillingSupported(), 
  BillingHelper.amIDead(), 
  BillingHelper.makeRequestBundle(), 
  "BillingService isBillingSupported response was: RESULT OK", 
  BillingHelper.requestPurchase(), 
  BillingHelper.amIDead(), 
  "BillingService requestPurchase()", 
  BillingHelper.makeRequestBundle(), 
  "BillingService current request is ......", 
  "BillingService REQUEST PURCHASE Sync Response code: RESULT OK", 
  BillingHelper.startBuyPageActivity(), 
  "BillingService Recieved action: com.android.vending.billing.RESPONSE CODE", 
  "BillingService checkResponseCode got requestID..."
  "BillingService checkResponseCode go responseCode RESULT ERROR" 
  (this is because I can't purchase on this device), 
  and then I get an Error message saying: "E 32427 Surface surface (identity=5925) is invalid, err=-19 (No such device)" and from there nothing works anymore. 

此外,我还在另一部手机上对此进行了测试(与我合作的另一个开发人员,他实际上可以在其中购买东西,但仍然出现黑屏错误),但他也从未收到您在评论中提到的 Handler 消息

Also I have tested this on a different phone (another developer I am working with, who can actually buy things in it but still gets the black screen error) and he never got the Handler messages you mentioned in your comment either

如果我不得不猜测错误在哪里,我会说是这个

if I had to guess where the error is, I'd say it's this

06-16 11:20:23.635: DEBUG/dalvikvm(3807): GC_EXPLICIT freed 53K, 45% free 3710K/6663K, external 1K/513K, paused 102ms
06-16 11:20:23.885: ERROR/Surface(3807): surface (identity=158) is invalid, err=-19 (No such device)
06-16 11:20:23.905: ERROR/Surface(3807): surface (identity=158) is invalid, err=-19 (No such device)
06-16 11:20:23.905: ERROR/Surface(3807): surface (identity=158) is invalid, err=-19 (No such device)
06-16 11:20:23.905: ERROR/Adreno200-EGL(3807): egliSwapWindowSurface: unable to dequeue native buffer

请注意,Andengine 库预计会出现中断的异常,因此这是一个红鲱鱼.

Note that the interrupted exception is expected by the Andengine library so that is a red herring.

另外(我希望这里允许这样做)我会为解决方案提供贝宝奖励.如果这违反 SO 条款,请删除此行,请不要关闭此问题.

Also (I hope this is allowed on here) I will offer paypal reward for a solution. If this is against the Terms of SO then just delete this line, please don't close this question.

推荐答案

我可能知道出了什么问题,我有一个测试要你做.在用户取消购买或完成购买后,购买屏幕运行结束调用.对我来说,由于某种原因,结束通话逐渐进入当前正在运行的活动和(关闭???它).

I may know what's wrong and I have a test for you to do. The buy screen runs a finish call after the user cancels the purchase or completes the purchase. For me for some reason the finish call was drifting down into the currently running activity and (CLOSING??? it).

这是日志中的相关行:

06-16 11:20:22.774:WARN/ActivityManager(132):HistoryRecord 的重复完成请求{40ace828 com.android.vending/.billing.InAppBuyPageActivity}

06-16 11:20:22.774: WARN/ActivityManager(132): Duplicate finish request for HistoryRecord{40ace828 com.android.vending/.billing.InAppBuyPageActivity}

我想我在我的代码问题中解决了这个问题是我不记得我做了什么(可能没有在我的购买完成处理程序中调用完成......)

I think I fixed this in my code problem is that I can't remember exactly what I did (maybe didn't call finish in my purchase complete handler...)

我对 Andgen 一无所知,但是如果对主要 Andgen 活动调用结束调用会发生什么?我想它会停止执行,你可能会看到黑屏和应用程序崩溃.

I don't know anything about Andgen, but what would happen if a finish call got called on the main Andgen activity? I'd imagine it would stop execution and you might get a black screen and an app crash.

因此,要对此进行测试,请为您的购买页面创建一个单独的活动.不需要很复杂 - 也许让它在启动后只购买一个罐头产品.运行你的代码,看看它是否仍然给你带来厄运的黑屏.我敢打赌:它可能会退出活动回到您的游戏,但我认为它会起作用.

So to test this, create a separate activity for you buy page. Doesn't need to be complicated - maybe have it just buy one canned product after it starts up. Run your code and see if it still gives you the black screen of doom. My bet: it may exit out of the activity back to your game but I think it'll work.

希望这会有所帮助,祝你好运!

Hope this helps and Good Luck!

这篇关于未决意图和切换活动的应用内计费问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆