Java queryPurchases()与queryPurchaseHistoryAsync()的对比,以';恢复';功能?

Java queryPurchases()与queryPurchaseHistoryAsync()的对比,以';恢复';功能?,java,android,restore,play-billing-library,Java,Android,Restore,Play Billing Library,我使用Play Billing Library来触发和管理购买,从而解锁应用程序中的额外功能。这部分工作正常 然而,“恢复”购买的最佳方式是什么。比如说,买了应用的人买了一部新手机。登录Play Store,下载我的应用程序,然后发现正在显示“升级”的付款屏幕。iOS对此有一个特定的方法,但我不知道Android有一个方法 我的想法是查询Play Store并确认该帐户之前是否已成功购买该物品,如果是,则我将调用应用程序中的本地升级功能 似乎有两种类似的方法。但是在这个场景中我应该使用哪一个呢?

我使用Play Billing Library来触发和管理购买,从而解锁应用程序中的额外功能。这部分工作正常

然而,“恢复”购买的最佳方式是什么。比如说,买了应用的人买了一部新手机。登录Play Store,下载我的应用程序,然后发现正在显示“升级”的付款屏幕。iOS对此有一个特定的方法,但我不知道Android有一个方法

我的想法是查询Play Store并确认该帐户之前是否已成功购买该物品,如果是,则我将调用应用程序中的本地升级功能

似乎有两种类似的方法。但是在这个场景中我应该使用哪一个呢?用户擦过手机还是买了新手机


queryPurchases()
?或者
queryPurchaseHistoryAsync()

根据文档
querypurchasequery
使用Play Store应用程序缓存获取结果,而
queryPurchaseHistoryAsync
实际检查采购AP以获取最近的采购。因此,在您的情况下,应该检查
Async
方法

querypurchaes

获取在应用程序中购买的所有物品的购买详细信息。此方法使用Google Play Store应用程序的缓存,而无需启动网络请求

queryPurchaseHistoryAsync

返回用户对每个SKU进行的最新购买,即使该购买已过期、已取消或已消费

此外,请务必检查文档。它建议
在服务器上缓存购买详细信息

您应该使用
查询采购
。这将为您提供每个SKU的所有当前活动(未消费、未取消、未过期)购买

queryPurchaseHistoryAsync
不会满足您的需要,因为它只会为您提供每个SKU的最新购买列表。它们可能已经过期、被取消或已被消费,而且无法确定。因此,此响应不能用于告诉您的应用程序中要应用哪些购买

就我所见,
queryPurchaseHistoryAsync
的唯一有效用途是向用户提供他们的购买历史记录列表。这有点奇怪


另请注意:
queryPurchases
是同步的,因此在大多数情况下,它需要在某种后台工作线程中运行。我在一个
异步任务中运行我的任务

我知道有点晚了,但我自己才发现这一点。分享我的答案,让他人受益

因此,我了解到
queryPurchases()
在您的设备上本地缓存,但在调用
queryPurchaseHistoryAsync()

我从这个答案中发现

因此,我的解决方案是,当想要在新设备上恢复购买或重新安装我的应用程序时。调用
queryPurchaseHistoryAsync()
然后在回调
onPurchaseHistoryResponse()
中调用
queryPurchases()
并从
PurchasesResult
列表中查找用户过去购买的任何购买状态


如果有预期的购买,你的应用程序可以授予他们过去购买的权利。

@hughteotl我们可以使用谷歌开发者API的购买API进行queryPurchaseHistoryAsync并检查循环中的每一次购买。我在我的案件中使用它。无需检查缓存中的购买。请小心,因为即使已取消购买,
queryPurchaseHistoryAsync
也会返回购买。从API:
返回用户对每个SKU的最新购买,即使该购买已过期、取消或已消费。
或者如果
queryPurchaseHistoryAsync
可以告诉您购买是否已过期、取消或已消费。
queryPurchases
还不够。用户试图购买,但获得的
项目已经拥有
,因此我调用
queryPurchases
,但它使用的缓存没有该项目。@Hughteotl根据我的经验,我同意这个答案,我想知道你是否找到了支持这一点的文档?@Hughteotl和谷歌文档的许多部分一样,这些方法的作用并不明确。queryPurchases的描述中没有提到它将返回当前活动的购买。它被描述为“获取在应用程序中购买的所有物品的购买详细信息”,这听起来与queryPurchaseHistory将返回的内容一样。我也阅读了所有这些文档,但我想知道您是否找到了关于如何使用这两种方法的明确描述或示例。我认为querypurchases会返回play store应用程序中缓存的内容。如果清理应用程序缓存和存储,会怎么样。你什么也得不到吗?