
本文详细介绍了如何在android应用中正确查询用户的订阅状态。我们将探讨querypurchasesasync()方法在应用启动时检查现有订阅的重要性,并区分其与实时购买更新监听器。教程将提供示例代码,指导如何处理和确认订阅,并强调了订阅管理的关键注意事项,旨在帮助开发者构建健壮的应用内购系统。
了解应用内购状态检查的必要性
在Android应用中集成订阅服务时,确保用户能够访问其已购买的特权至关重要。这不仅包括处理用户进行新购买时的回调,更重要的是,需要在应用启动或恢复时,主动查询并验证用户的现有订阅状态。仅依赖PurchasesUpdatedListener来更新订阅状态是不够的,因为它只在用户完成购买流程或发生其他购买事件时触发,而无法在应用首次启动或用户切换设备等场景下获取历史订阅信息。
为了可靠地检查用户的订阅状态,Google Play Billing Library 提供了专门用于查询现有购买记录的方法。
核心方法:查询现有订阅
要获取用户当前所有的有效购买(包括订阅和非消耗品),应使用 BillingClient 的 queryPurchasesAsync() 方法。此方法会返回一个购买列表,其中包含用户在当前设备上或通过其Google Play账户在任何设备上进行的、且尚未过期或撤销的购买。
以下是调用 queryPurchasesAsync() 并处理其结果的示例:
// 确保 BillingClient 已经连接if (billingClient.isReady()) { billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.SUBS).build(), (billingResult, purchasesList) -> { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { if (purchasesList != null && !purchasesList.isEmpty()) { for (Purchase purchase : purchasesList) { // 处理每个有效的订阅 handleSubscriptionPurchase(purchase); } // 假设只要有一个有效订阅就认为用户已订阅 // 实际应用中可能需要更复杂的逻辑,例如检查特定SKU Constant.subscription = true; } else { // 没有找到有效订阅 Constant.subscription = false; } } else { // 查询失败,处理错误 Log.e("BillingClient", "Query purchases failed: " + billingResult.getDebugMessage()); Constant.subscription = false; } } );} else { // BillingClient 未连接,尝试重新连接或等待连接成功 Log.w("BillingClient", "BillingClient is not ready. Cannot query purchases."); Constant.subscription = false;}
在上述代码中,我们指定 ProductType.SUBS 来专门查询订阅商品。对于一次性商品,可以使用 ProductType.INAPP。
博思AIPPT
博思AIPPT来了,海量PPT模板任选,零基础也能快速用AI制作PPT。
117 查看详情
处理订阅购买与确认
当 queryPurchasesAsync() 返回一个购买列表,或者 PurchasesUpdatedListener 收到新的购买通知时,我们需要对这些购买进行处理。对于订阅和非消耗品,关键步骤是确认 (Acknowledge) 购买。Google Play 要求所有购买在三天内得到确认,否则将会被退款。
与消耗品(如游戏内货币)需要 consumeAsync() 不同,订阅和非消耗品不需要消耗。它们只需要被确认一次。
以下是针对订阅购买进行确认的 handleSubscriptionPurchase 方法示例:
void handleSubscriptionPurchase(Purchase purchase) { if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { // 检查购买是否已经确认 if (!purchase.isAcknowledged()) { AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); billingClient.acknowledgePurchase(acknowledgePurchaseParams, billingResult -> { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { // 订阅成功确认,更新UI或授予权限 Log.d("BillingClient", "Subscription acknowledged successfully: " + purchase.getSku()); Constant.subscription = true; // 示例:更新订阅状态 // 可以在此处调用服务器端验证逻辑 } else { Log.e("BillingClient", "Failed to acknowledge subscription: " + billingResult.getDebugMessage()); } }); } else { // 购买已确认,直接更新UI或授予权限 Log.d("BillingClient", "Subscription already acknowledged: " + purchase.getSku()); Constant.subscription = true; // 示例:更新订阅状态 } } else if (purchase.getPurchaseState() == Purchase.PurchaseState.PENDING) { // 购买处于待处理状态,可能需要用户完成额外操作(如银行转账) Log.d("BillingClient", "Subscription is pending: " + purchase.getSku()); Constant.subscription = false; } // 对于其他状态,如 Purchase.PurchaseState.UNSPECIFIED_STATE,可能需要进一步处理}
集成到应用启动流程
为了在应用启动时检查订阅状态,通常建议在 MainActivity 或负责管理应用全局状态的组件的 onResume() 或 onCreate() 方法中调用 queryPurchasesAsync()。务必确保在调用此方法之前,BillingClient 已经成功连接到 Google Play 服务。
import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import com.android.billingclient.api.AcknowledgePurchaseParams;import com.android.billingclient.api.BillingClient;import com.android.billingclient.api.BillingClientStateListener;import com.android.billingclient.api.BillingResult;import com.android.billingclient.api.Purchase;import com.android.billingclient.api.PurchasesUpdatedListener;import com.android.billingclient.api.QueryPurchasesParams;import java.util.List;// 假设 Constant 类用于存储全局订阅状态// class Constant { public static boolean subscription = false; }public class MainActivity extends AppCompatActivity { private BillingClient billingClient; //
以上就是Android应用内购:查询用户订阅状态的全面指南的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1064460.html
微信扫一扫
支付宝扫一扫