【问题标题】:InAppBilling activity and finish()InAppBilling 活动和完成()
【发布时间】:2011-07-26 18:33:07
【问题描述】:

我在集成 Google 的应用内结算时遇到了很多麻烦。

我有一个应该进行应用内结算的活动。我正在使用 startActivity 方法从我的主要活动中调用此活动。



Intent i = new Intent();
i.setComponent(new ComponentName("com.mypackage.mainactivity","com.mypackage.mainactivity.InAppBillingActivity"));                
startActivity(i);

并致电mBillingService.requestPurchase("android.test.purchased", "10") 在 In-App-Billing 活动的 onCreate 方法中。



 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHandler = new Handler();
        mInAppBillingPurchaseObserver = new InAppBillingPurchaseObserver(mHandler);
        mBillingService = new BillingService();
        mBillingService.setContext(this);

        ResponseHandler.register(mInAppBillingPurchaseObserver);
        boolean supported = mBillingService.checkBillingSupported();
        System.out.println("onCreate.isBillingSupported " + supported);
        if(supported) {
            Log.i("AJ", "Calling requestPurchase");
            mBillingService.requestPurchase("android.test.purchased", "10");
        }
    }

由于 In-App-Billing 对服务器进行异步调用,我应该何时调用 finish() 以返回主活动。但我不希望活动结束,我仍然需要异步调用的结果。那么我该如何处理呢。

在将请求发送到服务器后,我调用了 finish()。但后来我得到了这个例外:


05-29 03:11:58.897: ERROR/ActivityThread(3549): Activity com.mypackage.mainactivity.InAppBillingActivity has leaked ServiceConnection com.mypackage.mainactivity.BillingService@45b0ad50 that was originally bound here
05-29 03:11:58.897: ERROR/ActivityThread(3549): android.app.ServiceConnectionLeaked: Activity com.mypackage.mainactivity.InAppBillingActivity has leaked ServiceConnection com.mypackage.mainactivity.BillingService@45b0ad50 that was originally bound here
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.app.ActivityThread$PackageInfo$ServiceDispatcher.(ActivityThread.java:1158)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:1053)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.app.ContextImpl.bindService(ContextImpl.java:908)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.content.ContextWrapper.bindService(ContextWrapper.java:347)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.content.ContextWrapper.bindService(ContextWrapper.java:347)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at com.mypackage.mainactivity.BillingService.bindToMarketBillingService(Unknown Source)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at com.mypackage.mainactivity.BillingService.access$000(Unknown Source)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at com.mypackage.mainactivity.BillingService$BillingRequest.runRequest(Unknown Source)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at com.mypackage.mainactivity.BillingService.checkBillingSupported(Unknown Source)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at com.mypackage.mainactivity.InAppBillingActivity.onCreate(Unknown Source)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2701)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2753)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.app.ActivityThread.access$2500(ActivityThread.java:129)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2107)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.os.Looper.loop(Looper.java:143)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at android.app.ActivityThread.main(ActivityThread.java:4701)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at java.lang.reflect.Method.invokeNative(Native Method)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at java.lang.reflect.Method.invoke(Method.java:521)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-29 03:11:58.897: ERROR/ActivityThread(3549):     at dalvik.system.NativeStart.main(Native Method)

它没有退出应用程序,但它停止了 InAppBillingActivity。

非常感谢任何帮助。

谢谢, 阿卡什

P.S.:My Old Question,还没解决.....

【问题讨论】:

  • 您不能在发送购买请求后调用完成,因为市场意图需要与活动上下文一起触发。

标签: java android billing


【解决方案1】:

你应该使用startActivityForResult() Context.StartActivityforResult URL

这样你就可以开始计费了,让它做异步回调,当它收到“成功”或“失败”时,你可以调用 finish();发回结果。

In App Billing 的另一个教程是:Simple InApp Billing,这为您提供了第二个视角,可能会帮助您了解 BillingService 试图实现的目标。

编辑

对于“Simple InApp Billin”的错误: 您在购买时遇到了错误,您可以在账单服务中发现它返回 false,否则您可以在账单助手中更新方法来阻止它:

 protected static void verifyPurchase(String signedData, String signature) {
            ArrayList<VerifiedPurchase> purchases = BillingSecurity.verifyPurchase(signedData, signature);
            if(purchases != null && !purchases.isEmpty()){ // Check for NPE
                    latestPurchase = purchases.get(0);

                    confirmTransaction(new String[]{latestPurchase.notificationId});
            } else {
                    Log.d(TAG, "BillingHelper.verifyPurchase error. purchases was null");
            }

            if(mCompletedHandler != null){
                    mCompletedHandler.sendEmptyMessage(0);
            } else {
                    Log.e(TAG, "verifyPurchase error. Handler not instantiated. Have you called setCompletedHandler()?");
            }
    }

【讨论】:

  • 嘿,谢谢你的链接。我现在正在经历它。但是即使我们通过调用 startActivityForResult() 来启动一个新的活动,我们怎么能在没有完成被调用活动的情况下回到调用活动。例如,A 呼叫 B。没有完成 B,我可以回到 A 并让 B 在后台运行。我收到错误说,使用 startActivityForResult() 时没有返回结果或其他东西。
  • 如果你想让 B 在后台运行,它应该在服务而不是 Activity 中执行此操作。
  • 我从 anddev 下载了测试应用,并更改了公钥。但我得到了错误
  • 是的,所以我不会创建新的活动,而是从我的活动本身启动服务:)。我从 anddev 下载了测试应用程序,并更改了公钥。但我收到了错误The log file,知道为什么会这样吗??
  • 您的公钥似乎弄错了。 BillingSecurity Line 137ish 验证失败。
猜你喜欢
  • 2012-03-22
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多