时间:2021-07-15 | 标签: | 作者:Q8 | 来源:Google Developers网络
小提示:您能找到这篇{从 AIDL 迁移到 Google Play 结算库的迁移指南}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的从 AIDL 迁移到 Google Play 结算库的迁移指南内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您! |
本主题介绍如何脱离使用Android接口定义语言(AIDL)的结算服务集成。使用AIDL访问Google Play结算系统这种方式已被弃用,日后所有集成都必须使用Google Play结算库。 注意:本主题重点介绍进行迁移需要做出的最重要变更。如需详细了解集成步骤,请参阅本页面中引用的链接以及GitHub上托管的结算服务专用示例中的代码段。 迁移步骤 导入Google Play结算库 首先,为Google Play结算库添加依赖项。如果您使用的是Gradle,则可将以下内容添加到应用的build.gradle文件中: dependencies{ def billing_version="3.0.0" implementation"com.android.billingclient:billing:$billing_version" } 您可以删除任何“粘合”代码(例如IabHelper),这些代码可能是您从以前的参考代码中复制的。IabHelper所提供的功能现在已包含在Google Play结算库中。 移除com.android.vending.BILLING权限 Google Play结算库在其清单中嵌入了com.android.vending.BILLING权限。因此,应用的清单中无需再明确添加此权限。 连接到Google Play结算服务 Google Play结算库的BillingClient负责为您处理连接管理。如需进行迁移,请对您的应用做出如下更改: 创建BillingClient的实例。 实现BillingClientStateListener以接收有关服务状态的回调。 在BillingClient实例上调用startConnection()。 移除与应用内购买相关的onActivityResult()代码,并将其移至PurchasesUpdatedListener。 以下示例是应用在进行这些更改前后的比较: 之前 mServiceConn=new ServiceConnection(){ Override public void onServiceDisconnected(ComponentName name){ ... } Override public void onServiceConnected(ComponentName name,IBinder service){ ... } }; Intent serviceIntent=new Intent("com.android.vending.billing.InAppBillingService.BIND"); serviceIntent.setPackage("com.android.vending"); List<ResolveInfo>intentServices=mContext.getPackageManager() .queryIntentServices(serviceIntent,0); if(intentServices!=null&&!intentServices.isEmpty()){ mContext.bindService(serviceIntent,mServiceConn,Context.BIND_AUTO_CREATE); }else{ //Handle errors. ... } ... Override protected void onActivityResult(int requestCode,int resultCode,Intent data){ IabResult result; if(requestCode!=mRequestCode||data==null){ //Handle errors. ... } int responseCode=getResponseCodeFromIntent(data); String purchaseData=data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA); String dataSignature=data.getStringExtra(RESPONSE_INAPP_SIGNATURE); if(resultCode!=Activity.RESULT_OK||responseCode!=BILLING_RESPONSE_RESULT_OK){ //Handle errors. ... } //Process successful purchase. ... return true; } 之后 JAVA public class MyBillingImpl implements PurchasesUpdatedListener{ private BillingClient billingClient; ... public void initialize(){ billingClient=BillingClient.newBuilder(activity).setListener(this).build(); billingClient.startConnection(new BillingClientStateListener(){ Override public void onBillingSetupFinished(BillingResult billingResult){ //Logic from ServiceConnection.onServiceConnected should be moved here. } Override public void onBillingServiceDisconnected(){ //Logic from ServiceConnection.onServiceDisconnected should be moved here. } }); } Override public void onPurchasesUpdated( BillingResponse int responseCode, Nullable List<Purchase>purchases){ //Logic from onActivityResult should be moved here. } } 进行购买 注意:Google Play结算库2.0版及更高版本需要查询SKU详细信息。 如需启动购买对话框,请执行以下操作: 将SKU详细信息Bundle转换为SkuDetailsParams。 将mService.getSkuDetails()调用改为BillingClient.querySkuDetailsAsync() 将购买intent Bundle转换为BillingFlowParams对象。 将mService.getBuyIntent()调用改为BillingClient.launchBillingFlow()。 从onActivityResult()移除所有与应用内购买相关的代码,并将此代码移至PurchasesUpdatedListener。 以下示例是应用在进行这些更改前后的比较: 之前 //Query Skus String skuToSell="premium_upgrade"; ArrayList<String>skus=new Arraylist>>(); skus.add(skuToSell); Bundle querySkus=new Bundle(); querySkus.putStringArrayList(GET_SKU_DETAILS_ITEM_LIST,skus); Bundle skuDetails=mService.getSkuDetails(3, mContext.getPackageName(), itemType, querySkus); if(!skuDetails.containsKey(RESPONSE_GET_SKU_DETAILS_LIST)){ //Handle errors. ... } //Launch Buy Flow Bundle buyIntentBundle=mService.getBuyIntent(3, mContext.getPackageName(), skuToSell, "Inapp", ""); int推广效果营销 response=getResponseCodeFromBundle(buyIntentBundle); if(response!=BILLING_RESPONSE_RESULT_OK){ //Handle errors. ... } PendingIntent pendingIntent=buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT); act.startIntentSenderForResult(pendingIntent.getIntentSender(), requestCode, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0)); //Purchase is handled in onActivityResult illustrated in the previous section. 之后 JAVA String skuToSell="premium_upgrade"; List<String>skuList=new ArrayList>>(); skuList.add(skuToSell); SkuDetailsParams.Builder params=SkuDetailsParams.newBuilder(); params.setSkusList(skuList).setType(SkuType.INAPP); billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener(){ Override public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails>skuDetailsList){ //Process the result. ... } }); //SkuDetails object obtained above. SkuDetails skuDetails=...; BillingFlowParams purchaseParams= BillingFlowParams.newBuilder() .setSkuDetails(skuDetails) .build(); mBillingClient.launchBillingFlow(mActivity,purchaseParams); //Purchase is handled in onPurchasesUpdated illustrated in the previous section. 消耗所购商品 如需使用Google Play结算库消耗所购商品,请执行以下操作: 调用BillingClient.consumeAsync(),而不是调用consumePurchase()。 实现ConsumeResponseListener。 以下示例是应用在进行这些更改前后的比较: 之前 Override protected void onActivityResult(int requestCode,int resultCode,Intent data){ int responseCode=data.getIntExtra(RESPONSE_CODE); JSONObject purchaseData= new JSONObject(data.getStringExtra("INAPP_PURCHASE_DATA")); String token=purchaseData.get("purchaseToken"); ... //Consume purchase int response=mService.consumePurchase(3,mContext.getPackageName(),token); if(response!=BILLING_RESPONSE_RESULT_OK){ //Handle errors. ... } //Handle successful consumption. } 之后 JAVA public class MyBillingImpl implements...,ConsumeResponseListener{ private BillingClient billingClient; ... public void consumePurchase(String purchaseToken){ ConsumeParams consumeParams= ConsumeParams.newBuilder() .setPurchaseToken(purchaseToken) .build(); } Override void onConsumeResponse(BillingResult billingResult,String purchaseToken){ //Handle consumption. ... } } 确认购买交易 从Google Play结算库2.0版开始,您的应用必须消耗所有所购商品或确认所有购买交易。 如果您在三天内未消耗所购商品或确认购买交易,Google会自动撤消购买交易并向用户退款。如需了解详情,请参阅确认购买交易。 识别应用外购买 如需将应用外购买交易的处理迁移到Google Play结算库,请执行以下操作: 确保您的应用在其onResume()回调中调用BillingClient.queryPurchases()。 移除com.android.vending.billing.PURCHASES_UPDATED的广播接收器,并将相应回调代码移至PurchasesUpdatedListener。 以前,将Google Play结算服务与AIDL集成时,您的应用需要注册监听器才能接收com.android.vending.billing.PURCHASES_UPDATED intent,用于处理应用外购买交易。 使用Google Play结算库时,您应始终先在应用的onResume()回调中调用queryPurchases(),以确保识别出应用未运行期间完成的所有购买交易。在应用运行时,结算库会自动监听应用外购买交易,并通过PurchasesUpdatedListener通知您。 处理待处理的交易 从Google Play结算库2.0版开始,应用必须处理某些待处理的交易,这些交易需要在购买后执行额外操作,然后才能授予使用权。例如,用户可能会选择使用现金在实体店购买您的应用内商品。也就是说,交易是在应用外部完成的。在这种情况下,只怎样做互联网营销有在用户完成交易后,您才能授予使用权。 如需了解详情,请参阅支持待处理的交易。 开发者载荷 开发者载荷向来被用于各种不同用途,包括防欺诈以及将购买交易归因于正确的用户。由于Google Play结算库现已支持这些用例,因此从Google Play结算库2.2版开始,我们已弃用开发者载荷。如需了解详情,请参阅开发者载荷。 详细的错误消息 从Google Play结算库2.0版开始,所有错误都包含相应的调试相关消息。这些消息可以通过调用BillingResult.getDebugMessage()获得。 ![]() |
上一篇:华为云CSBS:如何查看资源包的使用量?
下一篇:Google Play 结算系统:开发者载荷
基于对传统行业渠道的理解,对互联网行业的渠道我们可以下这样一个定义:一切...
小米应用商店的后台操作和苹果是比较相似的,因为都能填写100字符关键词,允许...
小米的规则目前是在变更中的,但是根据经验小米的搜索排名评分的高低是个很重...
为了恰饭,有时候是要接入一些广告的,所以FB也专门有一个广告的SDK,这就是A...
在 2018 年于旧金山举行的游戏开发者大会上,Amazon Web Services (AWS) 曾宣布,目前世...
关于Facebook Audience Network如何收款的问题,其实官方已经给了详细的步骤。本文主要...
本文介绍了Audience Network对广告载体的质量检查,以及它重点广告形式需要注意的问...
随着iOS开发,作为开发者或公司需要针对iOS App开发涉及的方方面面作出对应的信息...
Facebook和谷歌对出海企业广告渠道都很熟悉,但事实上,在国外还有一些渠道也很...
卖家从做号的第1分钟开始,就一定要想好变现路径是什么?一定要以变现为目的去...
小提示:您应该对本页介绍的“从 AIDL 迁移到 Google Play 结算库的迁移指南”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通从 AIDL 迁移到 Google Play 结算库的迁移指南的相关事宜。
关键词:从,AIDL,迁移到,Google,Play,结