因此,我正在尝试将Google Play 计费库实施到我的应用中,以便允许用户进行应用内购买。到目前为止,我觉得一切都很好,我已经很好地遵循了指南,但是最后一步让我感到困惑,我不知道如何BillingFlowParams
更准确地实现我正在努力解决的问题setSkuDetails
,我知道它说
通过调用 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) {
}
}