首页 > 解决方案 > 如何为应用内计费实现 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);

标签: androidin-app-billing

解决方案


如 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();
        }

推荐阅读