Java源码示例:com.android.billingclient.api.BillingClient.SkuType
示例1
private void purchase(final String identifier, final Boolean consume, final Result result) {
executeServiceRequest(new Request() {
@Override
public void execute() {
int responseCode = billingClient.launchBillingFlow(
activity,
BillingFlowParams.newBuilder()
.setSku(identifier)
.setType(SkuType.INAPP)
.build());
if (responseCode == BillingResponse.OK) {
PurchaseRequest request = new PurchaseRequest(identifier, consume, result);
pendingPurchaseRequests.add(request);
} else {
result.error("ERROR", "Failed to launch billing flow to purchase an item with error " + responseCode, null);
}
}
@Override
public void failed() {
result.error("UNAVAILABLE", "Billing service is unavailable!", null);
}
});
}
示例2
private void showDonateGooglePlay() {
mBillingClient = BillingClient.newBuilder(this).setListener(this).build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@BillingResponse int billingResponseCode) {
if (billingResponseCode == BillingResponse.OK) {
// The billing client is ready. You can query purchases here.
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSku("donate_2")
.setType(SkuType.INAPP)
.build();
mBillingClient.launchBillingFlow(MainActivity.this, flowParams);
}
}
@Override
public void onBillingServiceDisconnected() {
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
}
});
}
示例3
public void querySkuDetailsAsync(@BillingClient.SkuType final String itemType,
final List<String> skuList, final SkuDetailsResponseListener listener) {
// Specify a runnable to start when connection to Billing client is established
Runnable executeOnConnectedService = new Runnable() {
@Override
public void run() {
SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
.setSkusList(skuList).setType(itemType).build();
mBillingClient.querySkuDetailsAsync(skuDetailsParams,
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
listener.onSkuDetailsResponse(responseCode, skuDetailsList);
}
});
}
};
// If Billing client was disconnected, we retry 1 time and if success, execute the query
startServiceConnectionIfNeeded(executeOnConnectedService);
}
示例4
/**
* Executes query for SKU details at the background thread
*/
private void handleManagerAndUiReady() {
// Start querying for SKUs
List<String> inAppSkus = mBillingProvider.getBillingManager().getSkus(SkuType.INAPP);
mBillingProvider.getBillingManager().querySkuDetailsAsync(SkuType.INAPP, inAppSkus,
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
if (responseCode == BillingResponse.OK
&& skuDetailsList != null) {
for (SkuDetails details : skuDetailsList) {
Log.w(TAG, "Got a SKU: " + details);
}
}
}
});
// Show the UI
displayAnErrorIfNeeded();
}
示例5
@Override
public void getProductDetails(@NonNull Context context, @NonNull final String sku, final boolean isSubscription,
@NonNull final ProductDetailsListener listener) {
throwIfUninitialized();
api.getSkuDetails(
isSubscription ? SkuType.SUBS : SkuType.INAPP,
Collections.singletonList(sku),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
if (responseCode == BillingResponse.OK && skuDetailsList.size() == 1) {
logSafely("Successfully got sku details for " + sku + "!");
listener.success(
GooglePlayBillingProduct.create(skuDetailsList.get(0), isSubscription ? SkuType.SUBS : SkuType.INAPP)
);
} else {
logSafely("Error getting sku details for " + sku + " with code "+responseCode);
listener.failure(getDetailsError(responseCode));
}
}
}
);
}
示例6
private void fetchProducts(final List<String> identifiers, final Result result) {
executeServiceRequest(new Request() {
@Override
public void execute() {
billingClient.querySkuDetailsAsync(
SkuDetailsParams.newBuilder()
.setSkusList(identifiers)
.setType(SkuType.INAPP)
.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
if (responseCode == BillingResponse.OK) {
List<Map<String, Object>> products = getProductsFromSkuDetails(skuDetailsList);
result.success(products);
} else {
result.error("ERROR", "Failed to fetch products!", null);
}
}
});
}
@Override
public void failed() {
result.error("UNAVAILABLE", "Billing service is unavailable!", null);
}
});
}
示例7
private void fetchSubscriptions(final List<String> identifiers, final Result result) {
executeServiceRequest(new Request() {
@Override
public void execute() {
billingClient.querySkuDetailsAsync(
SkuDetailsParams.newBuilder()
.setSkusList(identifiers)
.setType(SkuType.SUBS)
.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
if (responseCode == BillingResponse.OK) {
List<Map<String, Object>> products = getProductsFromSkuDetails(skuDetailsList);
result.success(products);
} else {
result.error("ERROR", "Failed to fetch Subscriptions!", null);
}
}
});
}
@Override
public void failed() {
result.error("UNAVAILABLE", "Billing service is unavailable!", null);
}
});
}
示例8
private void subscribe(final String identifier, final Result result) {
executeServiceRequest(new Request() {
@Override
public void execute() {
int subscriptionSupportResponse = billingClient.isFeatureSupported(FeatureType.SUBSCRIPTIONS);
if (BillingResponse.OK != subscriptionSupportResponse) {
result.error("NOT SUPPORTED", "Subscriptions are not supported.", null);
return;
}
int responseCode = billingClient.launchBillingFlow(
activity,
BillingFlowParams.newBuilder()
.setSku(identifier)
.setType(SkuType.SUBS)
.build());
if (responseCode == BillingResponse.OK) {
PurchaseRequest request = new PurchaseRequest(identifier, result);
pendingPurchaseRequests.add(request);
} else {
result.error("ERROR", "Failed to subscribe with error " + responseCode, null);
}
}
@Override
public void failed() {
result.error("UNAVAILABLE", "Billing service is unavailable!", null);
}
});
}
示例9
private void fetchPurchases(final Result result) {
executeServiceRequest(new Request() {
@Override
public void execute() {
List<String> identifiers = new ArrayList<>();
Purchase.PurchasesResult purchasesResult = billingClient.queryPurchases(SkuType.INAPP);
if (purchasesResult.getResponseCode() == BillingResponse.OK) {
identifiers.addAll(getIdentifiers(purchasesResult.getPurchasesList()));
} else {
Log.w(TAG, "Failed to query purchases for in app products " +
"with error " + purchasesResult.getResponseCode());
}
purchasesResult = billingClient.queryPurchases(SkuType.SUBS);
if (purchasesResult.getResponseCode() == BillingResponse.OK) {
identifiers.addAll(getIdentifiers(purchasesResult.getPurchasesList()));
} else {
Log.w(TAG, "Failed to query purchases for in app subscriptions " +
"with error " + purchasesResult.getResponseCode());
}
result.success(identifiers);
}
@Override
public void failed() {
result.error("UNAVAILABLE", "Billing service is unavailable!", null);
}
});
}
示例10
private void checkPurchases() {
PurchasesResult purchasesResult = billingClient.queryPurchases(SkuType.INAPP);
if (purchasesResult.getBillingResult().getResponseCode() == BillingResponseCode.OK) {
boolean advancedPurchasePresent = false;
for (Purchase purchase : purchasesResult.getPurchasesList()) {
handlePurchase(purchase);
if (purchase.getSku().equals("unlock_weather")){
advancedPurchasePresent = true;
}
}
if (!advancedPurchasePresent && advanced){
revokeAdvancedPurchase();
}
}
}
示例11
/**
* Executes query for SKU details at the background thread
*/
private void handleManagerAndUiReady() {
final List<SkuRowData> inList = new ArrayList<>();
SkuDetailsResponseListener responseListener = new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
// If we successfully got SKUs, add a header in front of it
if (responseCode == BillingResponse.OK && skuDetailsList != null) {
// Repacking the result for an adapter
for (SkuDetails details : skuDetailsList) {
Log.i(TAG, "Found sku: " + details);
inList.add(new SkuRowData(details.getSku(), details.getTitle(),
details.getPrice(), details.getDescription(),
details.getType()));
}
if (inList.size() == 0) {
displayAnErrorIfNeeded();
} else {
mAdapter.updateData(inList);
setWaitScreen(false);
}
}
}
};
// Start querying for in-app SKUs
List<String> skus = mBillingProvider.getBillingManager().getSkus(SkuType.INAPP);
mBillingProvider.getBillingManager().querySkuDetailsAsync(SkuType.INAPP, skus, responseListener);
// Start querying for subscriptions SKUs
skus = mBillingProvider.getBillingManager().getSkus(SkuType.SUBS);
mBillingProvider.getBillingManager().querySkuDetailsAsync(SkuType.SUBS, skus, responseListener);
}
示例12
/**
* Executes query for SKU details at the background thread
*/
private void handleManagerAndUiReady() {
final List<SkuRowData> inList = new ArrayList<>();
SkuDetailsResponseListener responseListener = new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
if (responseCode == BillingResponse.OK && skuDetailsList != null) {
// Repacking the result for an adapter
for (SkuDetails details : skuDetailsList) {
Log.i(TAG, "Found sku: " + details);
inList.add(new SkuRowData(details.getSku(), details.getTitle(),
details.getPrice(), details.getDescription(),
details.getType()));
}
if (inList.size() == 0) {
displayAnErrorIfNeeded();
} else {
mAdapter.updateData(inList);
setWaitScreen(false);
}
}
}
};
// Start querying for in-app SKUs
List<String> skus = mBillingProvider.getBillingManager().getSkus(SkuType.INAPP);
mBillingProvider.getBillingManager().querySkuDetailsAsync(SkuType.INAPP, skus, responseListener);
// Start querying for subscriptions SKUs
skus = mBillingProvider.getBillingManager().getSkus(SkuType.SUBS);
mBillingProvider.getBillingManager().querySkuDetailsAsync(SkuType.SUBS, skus, responseListener);
}
示例13
public void querySkuDetailsAsync(@BillingClient.SkuType final String itemType,
final List<String> skuList, final SkuDetailsResponseListener listener) {
SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
.setSkusList(skuList).setType(itemType).build();
mBillingClient.querySkuDetailsAsync(skuDetailsParams,
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
listener.onSkuDetailsResponse(responseCode, skuDetailsList);
}
});
}
示例14
public void querySkuDetailsAsync(@BillingClient.SkuType final String itemType,
final List<String> skuList, final SkuDetailsResponseListener listener) {
SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder().setSkusList(skuList)
.setType(itemType).build();
mBillingClient.querySkuDetailsAsync(skuDetailsParams,
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
listener.onSkuDetailsResponse(responseCode, skuDetailsList);
}
});
}
示例15
/**
* Executes query for SKU details at the background thread
*/
private void handleManagerAndUiReady() {
final List<SkuRowData> inList = new ArrayList<>();
SkuDetailsResponseListener responseListener = new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
if (responseCode == BillingResponse.OK && skuDetailsList != null) {
// Repacking the result for an adapter
for (SkuDetails details : skuDetailsList) {
Log.i(TAG, "Found sku: " + details);
inList.add(new SkuRowData(details.getSku(), details.getTitle(),
details.getPrice(), details.getDescription(),
details.getType()));
}
if (inList.size() == 0) {
displayAnErrorIfNeeded();
} else {
mAdapter.updateData(inList);
setWaitScreen(false);
}
}
}
};
// Start querying for in-app SKUs
List<String> skus = mBillingProvider.getBillingManager().getSkus(SkuType.INAPP);
mBillingProvider.getBillingManager().querySkuDetailsAsync(SkuType.INAPP, skus, responseListener);
// Start querying for subscriptions SKUs
skus = mBillingProvider.getBillingManager().getSkus(SkuType.SUBS);
mBillingProvider.getBillingManager().querySkuDetailsAsync(SkuType.SUBS, skus, responseListener);
}
示例16
public void querySkuDetailsAsync(@BillingClient.SkuType final String itemType,
final List<String> skuList, final SkuDetailsResponseListener listener) {
SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
.setSkusList(skuList).setType(itemType).build();
mBillingClient.querySkuDetailsAsync(skuDetailsParams,
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode,
List<SkuDetails> skuDetailsList) {
listener.onSkuDetailsResponse(responseCode, skuDetailsList);
}
});
}
示例17
@Override
public int isBillingSupported(@SkuType String itemType) {
throwIfUnavailable();
if (SkuType.INAPP.equalsIgnoreCase(itemType) && billing.isReady()) {
return BillingResponse.OK;
} else if (SkuType.SUBS.equalsIgnoreCase(itemType)) {
return billing.isFeatureSupported(FeatureType.SUBSCRIPTIONS);
}
return BillingResponse.FEATURE_NOT_SUPPORTED;
}
示例18
@Override
public void getSkuDetails(@SkuType String itemType, @NonNull List<String> skus,
@NonNull SkuDetailsResponseListener listener) {
throwIfUnavailable();
logSafely("Query for SKU details with type: " + itemType + " SKUs: " + TextUtils.join(",", skus));
SkuDetailsParams query = SkuDetailsParams.newBuilder()
.setSkusList(skus)
.setType(itemType)
.build();
billing.querySkuDetailsAsync(query, listener);
}
示例19
@Override
public void launchBillingFlow(@NonNull final Activity activity, @NonNull String sku, @SkuType String itemType) {
throwIfUnavailable();
logSafely("Launching billing flow for " + sku + " with type " + itemType);
getSkuDetails(
itemType,
Collections.singletonList(sku),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
try {
if (responseCode == BillingResponse.OK && skuDetailsList.size() > 0) {
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetailsList.get(0))
.build();
// This will call the {@link PurchasesUpdatedListener} specified in {@link #initialize}
billing.launchBillingFlow(activity, billingFlowParams);
} else {
vendor.onPurchasesUpdated(BillingResponse.ERROR, null);
}
} catch (Exception e) {
vendor.onPurchasesUpdated(BillingResponse.ERROR, null);
}
}
}
);
}
示例20
@Nullable
@Override
public List<Purchase> getPurchases() {
throwIfUnavailable();
List<Purchase> allPurchases = new ArrayList<>();
logSafely("Querying in-app purchases...");
Purchase.PurchasesResult inAppPurchasesResult = billing.queryPurchases(SkuType.INAPP);
if (inAppPurchasesResult.getResponseCode() == BillingResponse.OK) {
List<Purchase> inAppPurchases = inAppPurchasesResult.getPurchasesList();
logSafely("In-app purchases: " + TextUtils.join(", ", inAppPurchases));
allPurchases.addAll(inAppPurchases);
// Check if we support subscriptions and query those purchases as well
boolean isSubscriptionSupported =
billing.isFeatureSupported(FeatureType.SUBSCRIPTIONS) == BillingResponse.OK;
if (isSubscriptionSupported) {
logSafely("Querying subscription purchases...");
Purchase.PurchasesResult subscriptionPurchasesResult = billing.queryPurchases(SkuType.SUBS);
if (subscriptionPurchasesResult.getResponseCode() == BillingResponse.OK) {
List<Purchase> subscriptionPurchases = subscriptionPurchasesResult.getPurchasesList();
logSafely("Subscription purchases: " + TextUtils.join(", ", subscriptionPurchases));
allPurchases.addAll(subscriptionPurchases);
return allPurchases;
} else {
logSafely("Error in querying subscription purchases with code: "
+ subscriptionPurchasesResult.getResponseCode());
return allPurchases;
}
} else {
logSafely("Subscriptions are not supported...");
return allPurchases;
}
} else {
return null;
}
}
示例21
public static Product create(SkuDetails details, @SkuType String type) {
return Product.create(
GooglePlayBillingConstants.VENDOR_PACKAGE,
details.getSku(),
details.getPrice(),
details.getPriceCurrencyCode(),
details.getTitle(),
details.getDescription(),
type.equals(SkuType.SUBS),
details.getPriceAmountMicros()
);
}
示例22
@Override
public synchronized void initialized(boolean success) {
logSafely("Initialized: success = " + success);
if (!success) {
logAndDisable("Could not create Google Play Billing instance");
return;
}
try {
canPurchaseItems =
api.isBillingSupported(SkuType.INAPP) == BillingResponse.OK;
canSubscribe =
api.isBillingSupported(SkuType.SUBS) == BillingResponse.OK;
available = canPurchaseItems || canSubscribe;
logSafely("Connected to service and it is " + (available ? "available" : "not available"));
initializing = false;
for (InitializationListener listener : initializationListeners) {
listener.initialized();
}
initializationListeners.clear();
} catch (Exception error) {
logAndDisable(Log.getStackTraceString(error));
}
}
示例23
@Override
public synchronized void purchase(Activity activity, Product product, String developerPayload, PurchaseListener listener) {
Preconditions.checkNotNull(activity, "Activity is null.");
Preconditions.checkNotNull(product, "Product is null.");
Preconditions.checkNotNull(listener, "Purchase listener is null.");
throwIfUninitialized();
if (pendingProduct != null) {
throw new RuntimeException("Cannot purchase product while another purchase is in progress!");
}
// NOTE: Developer payload is not supported with Google Play Billing
// https://issuetracker.google.com/issues/63381481
if (developerPayload != null && developerPayload.length() > 0) {
throw new RuntimeException("Developer payload is not supported in Google Play Billing!");
}
this.purchaseListener = listener;
this.pendingProduct = product;
logSafely("Launching Google Play Billing flow for " + product.sku());
try {
api.launchBillingFlow(activity, product.sku(), product.isSubscription() ? SkuType.SUBS : SkuType.INAPP);
} catch (Exception e) {
clearPendingPurchase();
throw e;
}
}
示例24
private String getProductType(String skuType) {
if (SkuType.INAPP.equals(skuType)) return "product";
if (SkuType.SUBS.equals(skuType)) return "subscription";
return null; // ?
}
示例25
public List<String> getSkus(@SkuType String type) {
return SKUS.get(type);
}
示例26
public List<String> getSkus(@SkuType String type) {
return SKUS.get(type);
}
示例27
public List<String> getSkus(@SkuType String type) {
return SKUS.get(type);
}
示例28
public List<String> getSkus(@SkuType String type) {
return SKUS.get(type);
}
示例29
public abstract void getSkuDetails(@SkuType String itemType, @NonNull List<String> skus,
@NonNull SkuDetailsResponseListener listener);
示例30
@Nullable
public abstract List<Purchase> getPurchases(@SkuType String itemType);