Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android应用内计费库与应用内计费API相比,哪一个更有优势_Android_In App Purchase - Fatal编程技术网

Android应用内计费库与应用内计费API相比,哪一个更有优势

Android应用内计费库与应用内计费API相比,哪一个更有优势,android,in-app-purchase,Android,In App Purchase,我遇到了应用内计费库(使用BillingClient)和应用内计费API(使用IInAppBillingService)都用于管理订阅,我的问题是在什么情况下必须使用哪个。 我正在使用应用内计费API进行测试,并在应用的初始屏幕上检查订阅状态。我的逻辑很简单,使用getPurchases()方法获取已购买状态。如果getPurchases()返回空,我认为是“未购买状态”,否则是“已购买状态”。如果出现以下条件,这会解决问题吗? 1.延迟计费 2.购买到期 如果定期付款失败(例如,因为客户的


我遇到了应用内计费库(使用BillingClient)和应用内计费API(使用IInAppBillingService)都用于管理订阅,我的问题是在什么情况下必须使用哪个。

我正在使用应用内计费API进行测试,并在应用的初始屏幕上检查订阅状态。我的逻辑很简单,使用getPurchases()方法获取已购买状态。如果getPurchases()返回空,我认为是“未购买状态”,否则是“已购买状态”。如果出现以下条件,这会解决问题吗?
1.延迟计费
2.购买到期

如果定期付款失败(例如,因为客户的信用卡已失效),则订阅不会续订。getPurchases()方法不返回失败或过期的订阅

这意味着什么

 Bundle ownedSubscripedItems = mService.getPurchases(3, getPackageName(), "subs", null);

 ArrayList<String> purchaseDataList =
                            ownedSubscripedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
Bundle-ownedSubscriptItems=mService.getPurchases(3,getPackageName(),“subs”,null);
ArrayList purchaseDataList=
OwnedSubscribeItems.getStringArrayList(“在应用程序购买数据列表中”);
对于过期订阅,purchaseDataList数组是否为空

对延迟计费的响应是什么?如何检查此订户是否享受延迟计费。他们的响应是否与正常订户相同

开发者文档说

该库是Android接口定义语言(AIDL)文件的包装器,该文件定义了应用内计费服务的接口

那么两者基本上是一样的。我个人直接使用AIDL

对于延迟计费,如果延迟期到期而未付款,则getPurchases将返回not purchased,对于任何未续订的订阅,也会发生同样的情况

不要忘记验证getPurchases()返回的任何购买的签名!,最好使用与标准java.security不同的库进行验证,或者使用外部签名验证服务器进行验证

更新

使用AIDL或库的主要区别在于库使用异步操作,并且在完成时调用侦听器

相反,一些AIDL方法是同步工作的,会阻塞调用线程。这意味着,如果您直接使用AIDL更好地在一个单独的线程中调用它,我个人就是这么做的。 两种方法都是一样的,但方式不同

优势?如果您习惯于使用单独的线程,请使用您更喜欢的线程,我建议使用AIDL


如果您怀疑getPurchases()是否会在订阅到期或转介时间到期而无需付款时从返回自有项目转换为非自有项目,则答案是肯定的。

我个人使用库:)但这是正确的谢谢您的回答,我很高兴知道使用其中一个的优势,我已经编辑了我的问题以获得更详细的答案。Tonteria,你的意思是说对于过期订阅服务器和延迟订阅服务器,数组列表将为空。数组将不包含ID为过期订阅的项。如果您使用Alpha或Beta版本进行测试,您可以测试购买产品,也可以通过调用consumerpurchase()删除它们。在第二种情况下,您可以看到它们不再出现在getPurchases()返回的数组中。澄清:consumerpurchase()仅适用于inapp产品,而不适用于SUBScriptions。AIDL文档现在说,“警告:AIDL现已弃用,并将在将来的版本中删除。要实现GooglePlay计费功能,请使用GooglePlay计费库。”对于新的实现者来说,这应该让选择变得非常明确。