相关文章推荐
刚毅的刺猬  ·  Firebase Cloud ...·  2 月前    · 
坚韧的啤酒  ·  深度解密 TCP ...·  7 月前    · 

安卓应用内购买skuDetailsList null的问题

0 人关注

我有以下代码,当我按下视图中的购买按钮时,它将被执行。

private void initiatePurchase() {
    // Purchase Item
    skuList.add(PRODUCT_ID); // <-- Product added to Play Console and Active
    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
    params.setSkusList(skuList).setType(INAPP);
    billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                Log.e(TAG, "*** skuDetailsList: " + skuDetailsList); // <-- Returns null!?
                if (skuDetailsList != null && skuDetailsList.size() > 0) {
                    BillingFlowParams flowParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetailsList.get(0)).build();
                    billingClient.launchBillingFlow(CreatePoolDetailsActivity.this, flowParams);
                } else {
                    // This keeps getting executed - Purchase Item not Found!?
                    Toast.makeText(getApplicationContext(),"Purchase Item not Found",Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), " Error " + billingResult.getDebugMessage(), Toast.LENGTH_SHORT).show();

问题是,skuDetailsList总是为空(大小==0),并因此抛出错误信息Purchase Item not Found;我不明白为什么,因为我的应用内购买设置正确,并在开发者控制台中激活?

有谁知道这是为什么,以及我怎样才能解决?

android
android-studio
in-app-purchase
Learn2Code
Learn2Code
发布于 2021-07-13
1 个回答
Yahya M
Yahya M
发布于 2021-07-13
已采纳
0 人赞同

试试这段代码,你必须初始化计费客户端。

 private lateinit var billingClient: BillingClient
private val skuList = listOf("product_1", "product_2", "product_3", "product_4")
private fun setupBillingClient() {
    billingClient = BillingClient.newBuilder(BaseActivity.mContext!!)
        .enablePendingPurchases()
        .setListener(this)
        .build()
    billingClient.startConnection(object : BillingClientStateListener {
        override fun onBillingSetupFinished(billingResult: BillingResult) {
            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                // The BillingClient is ready. You can query purchases here.
                loadAllSKUs()
        override fun onBillingServiceDisconnected() {
            // Try to restart the connection on the next request to
            // Google Play by calling the startConnection() method.
            Log.e("TAG", "onBillingServiceDisconnected: ")
private fun loadAllSKUs() = if (billingClient.isReady) {
    val param = SkuDetailsParams
        .newBuilder()
        .setSkusList(skuList)
        .setType(BillingClient.SkuType.INAPP)
        .build()
    billingClient.querySkuDetailsAsync(param) { billingResult, skuDetailsList ->
        // Process the result.
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList!!.isNotEmpty()) {
            for (skuDetails in skuDetailsList) {
                if (skuDetails.sku == productId) {
                    tv_singleAudio_price.text = skuDetails.price
                    realAmount = skuDetails.price
                    Log.e(TAG, "===loadAllSKUs: price: ${skuDetails.price}")
                    Log.e(TAG, "===loadAllSKUs: original price: ${skuDetails.originalPrice}")
                    rl_single_plan.setOnClickListener {
                        isInAppPurchase = true
                        isSubscribtion = false
                        val billingFlowParams = BillingFlowParams
                            .newBuilder()
                            .setSkuDetails(skuDetails)
                            .build()
                        billingClient.launchBillingFlow(requireActivity(), billingFlowParams)