Use*_*163 5 java android in-app-purchase in-app-billing
注意:我说的是一次性购买,可以从应用程序中删除广告。
谷歌说你应该打电话BillingClient.queryPurchases()给你onResume()的,onCreate()但我不知道该怎么做。
首先,这是实际应用内购买的代码,我刚刚从 YouTube 教程中获得它,我什至不知道它是否完整:
private void setupBillingClient(Context c) { //connect to google play
billingClient = BillingClient.newBuilder(c)
.enablePendingPurchases()
.setListener(this)
.build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
//The BillingClient is setup successfully
loadAllSkus();
}
}
@Override
public void onBillingServiceDisconnected() {
//TODO: implement retry logic to handle lost connections to Google Play by calling startConnection() again
}
});
}
private void loadAllSkus() {
if (billingClient.isReady()) { //first check if BillingClient is ready
final SkuDetailsParams params = SkuDetailsParams.newBuilder()
.setSkusList(skuList)
.setType(BillingClient.SkuType.INAPP)
.build();
billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(@NonNull final BillingResult billingResult, @Nullable List<SkuDetails> skuDetailsList) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
assert skuDetailsList != null;
for (Object skuDetailsObject : skuDetailsList) {
final SkuDetails skuDetails = (SkuDetails) skuDetailsObject;
if (skuDetails.getSku().equals(sku)) { //if it found the sku in play store you can start billing flow
Purchase.PurchasesResult result = billingClient.queryPurchases(BillingClient.SkuType.INAPP); //use play store cache, no network
List<Purchase> purchases = result.getPurchasesList();
boolean isOwned = false;
if (purchases != null) //first check if he has already purchased
for (Purchase purchase : purchases) {
String thisSKU = purchase.getSku();
if (thisSKU.equals(sku)) {
isOwned = true;
Toast.makeText(getContext(), "You are a premium user", Toast.LENGTH_LONG).show();//TODO: Delete this toast
//TODO: Remove purchase options and ads here
break;
}
}
if (!isOwned) {
buyButton.setEnabled(true);
buyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BillingFlowParams billingFlowParams = BillingFlowParams
.newBuilder()
.setSkuDetails(skuDetails)
.build();
if (getActivity() != null)
billingClient.launchBillingFlow(getActivity(), billingFlowParams);
dismiss();
}
});
}
}
/* else if (skuDetails.getSku().equals("something else")) { //add other products
}*/
}
}
}
});
} else Toast.makeText(getContext(), R.string.billing_not_ready, Toast.LENGTH_LONG).show();
}
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<com.android.billingclient.api.Purchase> purchases) {
int responseCode = billingResult.getResponseCode();
if (responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
for (Purchase purchase : purchases) {
handlePurchase(purchase); //acknowledge the purchase
}
} else if (responseCode == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
//already owned
} else if (responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
}
}
private void handlePurchase(Purchase purchase) {
if (purchase.getSku().equals(sku) && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
if (!purchase.isAcknowledged()) {
AcknowledgePurchaseParams acknowledgePurchaseParams =
AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build();
billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {
@Override
public void onAcknowledgePurchaseResponse(@NonNull BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
Toast.makeText(getContext(), "Purchase Acknowledged", Toast.LENGTH_LONG).show();//TODO: Delete this maybe?
}
}
});
}
Toast.makeText(getContext(), R.string.purchase_done, Toast.LENGTH_LONG).show();
}
}
Run Code Online (Sandbox Code Playgroud)
所以显然要调用BillingClient.queryPurchases()我必须在每个活动中重写所有上述代码?
如您所知, BillingClient.queryPurchases()方法返回所有当前拥有的购买项目的列表。
一次又一次地复制相同的代码始终是错误的方法/设计。您需要做的就是封装您的代码并使其尽可能独立于任何 Activity 或任何其他组件,以便可以重用。
要获得更好的方法,请查看 Google 的官方计费示例。您将看到所有计费逻辑都被封装起来,因此可以轻松地重用。
Java: https: //github.com/android/play-billing-samples/tree/main/ClassyTaxiJava
Kotlin:https://github.com/android/play-billing-samples/tree/main/ClassyTaxiAppKotlin
如果您发现示例与订阅有关并且您需要非消耗品,则需要进行一些说明,反之亦然。两者的计费库是相同的,区别只是要查询的数据,例如订阅使用BillingClient.SkuType.SUBS,非消耗品使用BillingClient.SkuType.INAPP。但其余的,如何连接计费、如何确认、启动购买流程等,两者都是完全相同的。没有单独的 API 或不同的实现方式,您使用相同的 API 和相同的实现,只是更改正在查询的内容。
| 归档时间: |
|
| 查看次数: |
4730 次 |
| 最近记录: |