android - 如何为应用内计费实现 SkuDetailsResponseListener?
问题描述
我想在我的 Android 应用中包含应用内结算。在阅读文档时,它说:
“指定一个实现SkuDetailsResponseListener接口的侦听器。然后您可以覆盖onSkuDetailsResponse(),它会在查询完成时通知侦听器”
public class MainActivity extends AppCompatActivity implements SkuDetailsResponseListener {
这使:
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
}
但是,这是一个问题,因为它不包括文档中指定的侦听器,即。
billingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult,
List<SkuDetails> skuDetailsList) {
// Process the result.
}
});
当包括 BillingClient 行和侦听器时,显然存在解析符号错误,因为它在任何方法之外,那么您如何解决这个问题?
此外,您是否会将这个块放在 onCreate() 中?
List<String> skuList = new ArrayList<> ();
skuList.add("coins5");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(SkuType.INAPP);
解决方案
如 Billing API 文档中所述,您还需要实现 BillingClientStateListener 和 PurchaseUpdateListener。https://developer.android.com/google/play/billing/integrate 以下代码是 Billing API 3.0 中的一个工作示例,带有 Android 版本目标 SDK 28。代码在 Singleton 类中定义,因此可以从多个一个 BillingClient 实例的活动。
public class ApplicationBillingClient
{
static ApplicationBillingClient applicationBillingClient= null;
private static BillingClient billingClient;
private ApplicationBillingClient() {}
private static boolean isInitialized()
{
return applicationBillingClient != null && billingClient != null;
}
private static void initialize(Context applicationContext)
{
try
{
if(applicationContext != null)
{
applicationBillingClient = new ApplicationBillingClient();
BillingClient.Builder builder= BillingClient.newBuilder(applicationContext);
builder.setListener(new PurchaseActivityListener());
builder.enablePendingPurchases();
billingClient = builder.build();
}
LogUtil.info("Initializing the Billing Client");
}
catch (Exception ex)
{
LogUtil.error("Error while initializing billing client", ex);
}
}
public static ApplicationBillingClient getInstance(Context applicationContext)
{
if(isInitialized() == false)
{
initialize(applicationContext);
}
return applicationBillingClient;
}
public void startConnection()
{
billingClient.startConnection(new StateListener());
}
public boolean isReady()
{
return billingClient.isReady();
}
public void getMonthlySubscription()
{
try
{
if(billingClient.isReady())
{
SkuDetailsParams.Builder skuBuilder = SkuDetailsParams.newBuilder();
skuBuilder.setType(BillingClient.SkuType.SUBS);
skuBuilder.setSkusList(Arrays.asList(new String[]{MONTHLY_BILLING_SUBSCRIPTION_SKU}));
SkuDetailsParams params = skuBuilder.build();
billingClient.querySkuDetailsAsync(params, new SkuDetailsListener());
}
}
catch (Exception ex)
{
LogUtil.error("Error while querying async SKU for Monthly Subscription", ex);
}
}
}
//In your activity
ApplicationBillingClient appBillingClient =
ApplicationBillingClient.getInstance(applicationContext);
if (appBillingClient.isReady() == false)
{
appBillingClient.startConnection();
}
else
{
appBillingClient.getMonthlySubscription();
}
推荐阅读
- azure - Blob 存储连接数据流通过 WAF
- ios - 水平 StackView 的正确对齐和分布选择
- sql-server - 在单个查询中绑定两个查询两个数据都将显示
- python - json.dump({...}, fp) 在 Python 2 中使用 str 块而不是所需的 unicode 块写入 fp。我可以强制它使用 unicode 吗?
- android - 使用 Facebook SDK 注销用户仍然会在下次登录尝试时记住他们的详细信息
- android-studio - 为什么 Android Studio 在我编译时不断重新创建以前删除的文件
- javascript - 将 async/await 应用于函数
- youtube - 当列表中有超过 100,000 个视频时,是否可以获取 youtube 播放列表的所有视频 ID?
- matlab - 如何从 fseminf 函数的输出中保存 funccount
- fortify - 强化中的报告生成器是否存在一些过滤问题的命令?