Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确实现Google Play计费库_Java_Android_Google Play_Play Billing Library - Fatal编程技术网

Java 如何正确实现Google Play计费库

Java 如何正确实现Google Play计费库,java,android,google-play,play-billing-library,Java,Android,Google Play,Play Billing Library,因此,我正在尝试在我的应用程序中实现,以便允许用户进行应用内购买。到目前为止,我感觉一切都很顺利,我已经很好地遵循了指南,但最后一步让我感到困惑,我不知道如何实现BillingFlowParams,更确切地说,我正在努力使用设置细节,我知道它说 通过调用querySkuDetailsAsync()检索“skuDetails”的值 但我不知道要传递什么参数,我试着查看文档,但这让我更加困惑 这就是我目前所拥有的 package com.my.name.ui; import android.os.B

因此,我正在尝试在我的应用程序中实现,以便允许用户进行应用内购买。到目前为止,我感觉一切都很顺利,我已经很好地遵循了指南,但最后一步让我感到困惑,我不知道如何实现
BillingFlowParams
,更确切地说,我正在努力使用
设置细节,我知道它说

通过调用querySkuDetailsAsync()检索“skuDetails”的值

但我不知道要传递什么参数,我试着查看文档,但这让我更加困惑

这就是我目前所拥有的

package com.my.name.ui;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchasesUpdatedListener;
import com.android.billingclient.api.SkuDetails;
import com.android.billingclient.api.SkuDetailsParams;
import com.android.billingclient.api.SkuDetailsResponseListener;
import com.my.name.R;

import java.util.ArrayList;
import java.util.List;

public class PremiumFragment extends Fragment implements PurchasesUpdatedListener {


    private String LICENSE_KEY = "removedforthesakeofthepost";
    private String ITEM_SKU_ADREMOVAL = "myadremoval";
    private String mAdRemovalPrice;

    private Button btnPurchase;


    private BillingClient mBillingClient;




    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        mBillingClient = BillingClient.newBuilder(getContext()).enablePendingPurchases().setListener(this).build();
        mBillingClient.startConnection(new BillingClientStateListener() {

            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    // The billing client is ready. You can query purchases here.

                    List skuList = new ArrayList<>();
                    skuList.add(ITEM_SKU_ADREMOVAL);
                    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
                    params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
                    mBillingClient.querySkuDetailsAsync(params.build(),
                            new SkuDetailsResponseListener() {
                                @Override
                                public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
                                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {
                                        for (SkuDetails skuDetails : skuDetailsList) {
                                            String sku = skuDetails.getSku();
                                            String price = skuDetails.getPrice();
                                            if (ITEM_SKU_ADREMOVAL.equals(sku)) {
                                                mAdRemovalPrice = price;
                                            }
                                        }
                                    }
                                }


                            });

                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                //TODO implement your own retry policy
                // Try to restart the connection on the next request to
                // Google Play by calling the startConnection() method.
            }
        });

        View rootView = inflater.inflate(R.layout.fragment_premium, container, false);

        btnPurchase = rootView.findViewById(R.id.purchasebtn);

        btnPurchase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //No idea what to do here.

                // Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
                BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                        .setSkuDetails(skuDetails)
                        .build();
                int responseCode = billingClient.launchBillingFlow(flowParams);

            }
        });

        return rootView;
    }







    @Override
    public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {

    }
}
package com.my.name.ui;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Button;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入com.android.billingclient.api.billingclient;
导入com.android.billingclient.api.BillingClientStateListener;
导入com.android.billingclient.api.BillingFlowParams;
导入com.android.billingclient.api.BillingResult;
导入com.android.billingclient.api.Purchase;
导入com.android.billingclient.api.PurchasesUpdatedListener;
导入com.android.billingclient.api.sku详细信息;
导入com.android.billingclient.api.sku;
导入com.android.billingclient.api.SkuDetailsResponseListener;
导入com.my.name.R;
导入java.util.ArrayList;
导入java.util.List;
公共类PremiumFragment扩展片段实现PurchasesUpdatedListener{
私有字符串许可证\u KEY=“RemovedFortheMakeofPost”;
私有字符串项\u SKU\u ADREMOVAL=“myadremoval”;
私人字符串价格;
私人按钮BTN采购;
私人计费客户mBillingClient;
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
mBillingClient=BillingClient.newBuilder(getContext()).enablePendingPurchases().setListener(this.build();
mBillingClient.startConnection(新的BillingClientStateListener(){
@凌驾
BillingSetupFinished(BillingResult BillingResult)上的公共无效{
if(billingResult.getResponseCode()==BillingClient.BillingResponseCode.OK){
//计费客户端已准备就绪。您可以在此查询购买情况。
List skuList=new ArrayList();
skuList.添加(项目\u SKU\u ADREMOVAL);
SkuDetailsParams.Builder params=SkuDetailsParams.newBuilder();
参数setskulist(skuList).setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(),
新SkuDetailsResponseListener(){
@凌驾
公共无效onSkuDetailsResponse(BillingResult BillingResult,列表skuDetailsList){
if(billingResult.getResponseCode()==BillingClient.BillingResponseCode.OK&&skuDetailsList!=null){
用于(SkuDetails SkuDetails:skuDetailsList){
字符串sku=skuDetails.getSku();
字符串price=skuDetails.getPrice();
如果(项目库存单位等于库存单位){
mAdRemovalPrice=价格;
}
}
}
}
});
}
}
@凌驾
公共无效onBillingServiceDisconnected(){
//TODO实现您自己的重试策略
//尝试在下一次请求时重新启动连接以
//Google通过调用startConnection()方法播放。
}
});
视图根视图=充气机。充气(R.layout.fragment\u premium,container,false);
btnpourchase=rootView.findviewbyd(R.id.purchasebtn);
btnpuchase.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//不知道在这里该做什么。
//通过调用querySkuDetailsAsync()检索“skuDetails”的值。
BillingFlowParams flowParams=BillingFlowParams.newBuilder()
.详细信息(SKU详细信息)
.build();
int responseCode=billingClient.launchBillingFlow(flowParams);
}
});
返回rootView;
}
@凌驾
购买时公共作废已过期(BillingResult BillingResult,@Nullable列表购买){
}
}

您必须在onBillingSetupFinished中启用按钮“btnPurchase”,并禁用onBillingServiceDisconnected(启动时禁用)。 因此,在“btnPurchase.setOnClickListene/onClick”中,您必须调用“billing\u client.querySkuDetailsAsync”(您的代码是正确的),然后


不要忘记“billing\u client.Acknowledge采购”

您必须在onBillingSetupFinished中启用按钮“btnPurchase”,并禁用OnBillingService断开连接(启动时禁用)。 因此,在“btnPurchase.setOnClickListene/onClick”中,您必须调用“billing\u client.querySkuDetailsAsync”(您的代码是正确的),然后

不要忘记“billing_client.Acknowledge采购”

for( SkuDetails skuDetails : sku_details_list ){
    if( ITEM_SKU_ADREMOVAL.equals( skuDetails.getSku() ) ){
        BillingFlowParams flow_params = BillingFlowParams.newBuilder()
                .setSkuDetails( skuDetails )
                .build();
        billing_client.launchBillingFlow( MyActivity.this, flow_params );
    }
}