
本文详细介绍了如何在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。
当 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应用内购:查询用户订阅状态的全面指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号