Android 如何为应用内计费实施SkuDetailsResponseListener?
我想在我的Android应用程序中包含应用内计费。 阅读文档时,它会说: “指定一个实现SkuDetailsResponseListener接口的侦听器。然后,您可以覆盖onSkuDetailsResponse(),该侦听器在查询完成时通知侦听器” 其中:Android 如何为应用内计费实施SkuDetailsResponseListener?,android,in-app-billing,Android,In App Billing,我想在我的Android应用程序中包含应用内计费。 阅读文档时,它会说: “指定一个实现SkuDetailsResponseListener接口的侦听器。然后,您可以覆盖onSkuDetailsResponse(),该侦听器在查询完成时通知侦听器” 其中: @Override public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
}
@覆盖
公共无效onSkuDetailsResponse(BillingResult BillingResult,列表skuDetailsList){
}
但是,这是一个问题,因为它不包括文档中指定的侦听器,即
billingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult,
List<SkuDetails> skuDetailsList) {
// Process the result.
}
});
billingClient.querySkuDetailsAsync(params.build(),
新SkuDetailsResponseListener(){
@凌驾
公共无效详细信息响应(BillingResult BillingResult,
列表(详细信息列表){
//处理结果。
}
});
当包含BillingClient行和侦听器时,显然存在一个解析符号错误,因为它在任何方法之外,所以您如何解决这个问题
此外,是否将此块放在onCreate()中
List skuList=newarraylist();
skuList.添加(“硬币5”);
SkuDetailsParams.Builder params=SkuDetailsParams.newBuilder();
参数setskulist(skuList).setType(SkuType.INAPP);
欢迎来到stackoverflow
两种解决方案:
- 使用文档中指定的侦听器,不要在类声明中实现它
- 或者保留实现,改为
billingClient.queryskudDetailsAsync(params.build(),new SkuDetailsResponseListener(){..
只需使用:
billingClient.queryskuedetailsasync(params.build(),this);
正如BillingAPI文档中所述,您还需要实现BillingClientStateListener以及PurchaseUpdateListener。
以下代码是针对SDK 28的Android版本的计费API 3.0中的一个工作示例。该代码在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();
}
您的代码没有说明您是否实现了BillingClientStateListener以及PurchaseUpdateListener。请参阅下面的答案。
List<String> skuList = new ArrayList<> ();
skuList.add("coins5");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(SkuType.INAPP);
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();
}