kotlin 空查询ProductDetailsAsync的问题

yqyhoc1h  于 2022-12-13  发布在  Kotlin
关注(0)|答案(1)|浏览(144)

我有一个问题检索产品详细信息,我在我的Google Play控制台设置这样:
my google play config
我做了以下工作:

myLog("MYAPP-TEST---1")
val purchasesUpdatedListener =
    PurchasesUpdatedListener { billingResult, purchases ->
        if (billingResult.responseCode ==
            BillingClient.BillingResponseCode.OK
            && purchases != null
        ) {
            for (purchase in purchases) {
                // Process the purchases
                myLog("MYAPP-TEST---")
            }
        } else if (billingResult.responseCode ==
            BillingClient.BillingResponseCode.USER_CANCELED
        ) {
            myLog("MYAPP-TEST---2")
            // Purchase cancelled by user
        } else {
            myLog("MYAPP-TEST---3")
            // Handle errors here
        }
    }

var billingClient = BillingClient.newBuilder(this)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases()
    .build()

billingClient.startConnection(object : BillingClientStateListener {
    override fun onBillingSetupFinished(billingResult: BillingResult) {
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
            // Connection successful
            myLog("MYAPP-TEST---SUCCESS")
        } else {
            // Connection failed
        }
    }

    override fun onBillingServiceDisconnected() {
        // Connection to billing service lost
        myLog("MYAPP-TEST---DISCONNECTED")
    }
})

val productList: ArrayList<Product> = ArrayList()
productList.add(
    Product.newBuilder()
        .setProductId("poroductid1")
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
);
productList.add(
    Product.newBuilder()
        .setProductId("poroductid2")
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
);
productList.add(
    Product.newBuilder()
        .setProductId("poroductid3")
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
);
productList.add(
    Product.newBuilder()
        .setProductId("poroductid4")
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
);

val queryProductDetailsParams =
    QueryProductDetailsParams.newBuilder()
        .setProductList(productList)
        .build()

processPurchases()

billingClient.queryProductDetailsAsync(queryProductDetailsParams) { billingResult,
                                                                     skuDetailsList ->
    if (skuDetailsList.isNotEmpty()) {
        for (productDet in skuDetailsList) {
            myLog("MYAPP-TEST----")
            myLog(productDet.name)
        }
        // Process list of matching products
    } else {

        myLog("MYAPP-TEST---No product matches found")
        // No product matches found
    }
    // Process the result
}

我一直在调试
2022-09-16 16:04:17.983 13457-13457/com.my.app D/主要活动:MYAPP-测试---1
2022-09-16 16:04:18.012 13457-13457/com.my.app D/主要活动:MYAPP-TEST---未找到产品匹配项
2022-09-16 16:04:18.470 13457-13700/com.my.app D/主要活动:MYAPP-测试---成功
我还发布了我的应用程序,所以产品应该是“公开”可用的(不知道它是否仍然需要,但我看到其他地方是)。
所以你已经可以看到我的产品细节要求接缝要空。
我是相当新的Kotlin/应用程序开发,所以我可能需要很多解释。

rekjcdws

rekjcdws1#

尝试检索产品列表之后安装成功。您要确保安装之前**成功。
这就是BillingClientStateListener的作用。
首先你应该把你所有的产品检索代码放在一个单独的函数中:

fun retrieveProducts() {
    val productList: ArrayList<Product> = ArrayList()
productList.add(
    Product.newBuilder()
        .setProductId("poroductid1")
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
);
productList.add(
    Product.newBuilder()
        .setProductId("poroductid2")
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
);
productList.add(
    Product.newBuilder()
        .setProductId("poroductid3")
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
);
productList.add(
    Product.newBuilder()
        .setProductId("poroductid4")
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
);

val queryProductDetailsParams =
    QueryProductDetailsParams.newBuilder()
        .setProductList(productList)
        .build()

billingClient.queryProductDetailsAsync(queryProductDetailsParams) { billingResult,
                                                                     skuDetailsList ->
    if (skuDetailsList.isNotEmpty()) {
        for (productDet in skuDetailsList) {
            myLog("MYAPP-TEST----")
            myLog(productDet.name)
        }
        // Process list of matching products
    } else {

        myLog("MYAPP-TEST---No product matches found")
        // No product matches found
    }
    // Process the result
}

然后,在BillingClientStateListeneronBillingSetupFinished函数中调用您的函数:

billingClient.startConnection(object : BillingClientStateListener {
    override fun onBillingSetupFinished(billingResult: BillingResult) {
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
            // Connection successful
            myLog("MYAPP-TEST---SUCCESS")
            // This is where you can start retrieving your products
            retrieveProducts()
        } else {
            // Connection failed
        }
    }

    override fun onBillingServiceDisconnected() {
        // Connection to billing service lost
        myLog("MYAPP-TEST---DISCONNECTED")
    }
})

您遇到的问题是由于异步操作造成的:您的客户端设置和购买检索都是异步的,这意味着它们与基本代码不在同一个线程上执行。
为了确保按良好的顺序执行操作,您必须使用Billing库提供的侦听器!
首先,你要设置你的计费服务。完成后,onBillingSetupFinished回调被调用。这时你就确定你可以更进一步了!
这是您在Android开发中必须面对的一个经典“问题”,侦听器系统是一种经典的方法,用于执行在主线程之外的另一个线程中执行的另一个操作所产生的操作。

相关问题