来自Google Play的应用内结算广播的顺序不正确? (静态测试)

时间:2012-04-05 02:52:31

标签: android in-app-billing

针对应用内结算的Android文档似乎在以下问题上非常明确。在REQUEST_PURCHASE显示具有待处理意图的结帐后(很好,没有问题),然后用户与结帐交互并点击购买按钮(在这种情况下,我使用的是静态产品ID android.test.purchased )。

现在我的广播接收器应该收到RESPONSE_CODE那么IN_APP_NOTIFY。嗯,这没有发生。有时我会先得到回复,但经常会在收到通知后收到回复。

下面引用的Android Doc部分中的第二个重点部分是为什么这是一个问题。当我获得对购买请求的异步响应时,如果我将应用程序中的状态更新为待处理,因为文档似乎表明我应该在通知之后发出响应,我的应用程序会陷入暂挂状态。是否应该说“当你从立即同步响应中收到result_ok时”?

这是Goole Play的错误(手机上的Google Play版本为3.5.15,Android操作系统版本为2.2)?我误解了Docs吗?文件是否完全错误?这是静态测试产品的问题吗?还有其他可能出错的地方吗?请注意,就我而言,一切都在UI线程中运行,因此它不是线程问题。

典型的非工作运行的日志输出显示在底部。

Android文档的相关部分(强调我的):

  

处理广播意图

     

REQUEST_PURCHASE请求还会触发两个异步响应   (广播意图)。 首先,Google Play应用程序发送一个   RESPONSE_CODE广播意图,提供有关的错误信息   请求。如果请求没有生成错误,则   RESPONSE_CODE广播意图返回RESULT_OK,表示这一点   请求已成功发送。 (要清楚,RESULT_OK响应   并不表示所要求的购买成功;它   表示请求已成功发送到Google Play。)

     

接下来,当请求的事务更改状态时(例如,   购买已成功收取信用卡或用户取消   购买),Google Play应用程序发送IN_APP_NOTIFY   广播意图。此消息包含您的通知ID   可以用来检索REQUEST_PURCHASE的事务详细信息   请求。

     

注意:Google Play应用程序还会发送IN_APP_NOTIFY   退款。有关更多信息,请参阅处理IN_APP_NOTIFY消息。

     

因为购买过程不是即时的,可能需要几个   秒(或更多),您必须假定购买请求待处理   从收到RESULT_OK消息到收到消息   事务的IN_APP_NOTIFY消息。交易是   等待处理,Google Play结帐用户界面会显示“授权”   购买......“通知;但是,此通知被驳回   60秒后你不应该依赖这个通知作为你的   向用户传达交易状态的主要方式。相反,我们   建议您执行以下操作:

我的日志中没有按预期顺序排列的示例:

MAKING REQUEST: PurchaseRequest
EXECUTING REQUEST: PurchaseRequest
IMEDIATE RESPONSE IN: PurchaseRequest, IS RESULT_OK
REQUEST ID: 1814990809059790249, PurchaseRequest
Receiver: Notify
Notify String in IN_APP_NOTIFY intent: android.test.purchased
PROCESSING NOTIFICATION
MAKING REQUEST: PurchaseInformationRequest
EXECUTING REQUEST: PurchaseInformationRequest
IMEDIATE RESPONSE IN: PurchaseInformationRequest, IS RESULT_OK
REQUEST ID: 602248989635492868, PurchaseInformationRequest
Receiver: purchase state changed
PROCESSING PURCHASE_STATE_CHANGE
newestMarketPurchaseState = PURCHASED
SetState on product 'Enterprise'. Message: PURCHASED
MAKING REQUEST: ConfirmNotificationsRequest
EXECUTING REQUEST: ConfirmNotificationsRequest
IMEDIATE RESPONSE IN: ConfirmNotificationsRequest, IS RESULT_OK
REQUEST ID: 693394902887436727, ConfirmNotificationsRequest
Receiver: Response Code = RESULT_OK
Receiver: Response Code requestId = 602248989635492868
PROCESSING RESPONSE
ASYNCH RESPONSE IN: PurchaseInformationRequest, IS RESULT_OK
Receiver: Response Code = RESULT_OK
Receiver: Response Code requestId = 1814990809059790249
PROCESSING RESPONSE
ASYNCH RESPONSE IN: PurchaseRequest, IS RESULT_OK
SetState on product 'Enterprise'. Message: PURCHASE PENDING
Receiver: Response Code = RESULT_OK
Receiver: Response Code requestId = 693394902887436727
PROCESSING RESPONSE
ASYNCH RESPONSE IN: ConfirmNotificationsRequest, IS RESULT_OK
Confirm Notifications Request returned asynch OK

1 个答案:

答案 0 :(得分:3)

我也遇到过同样的问题。根据问题Are Android broadcasts received in order?中的答案,并不能绝对保证按照发送的顺序接收意图。他们通常会,但不一定。因此,即使Google Play正确地命令它们,它们仍然可以以其他顺序到达。

在我看来,唯一的解决方案是不假设RESPONSE_CODE到达的时间。在这方面,Android文档确实对我来说确实是错误的。响应代码应该可以通过回调实现,而不是广播。我不得不承认谷歌有时会变得粗心。