Actualicé a la versión 4 de facturación de Android y 2 cosas ya no funcionan.
Primero tengo esto:
else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) { Purchase.PurchasesResult queryAlreadyPurchasesResult = billingClient.queryPurchases(INAPP); // deprecated List<Purchase> alreadyPurchases = queryAlreadyPurchasesResult.getPurchasesList(); if(alreadyPurchases!=null){ handlePurchases(alreadyPurchases); } }queryPurchases está en desuso.
En segundo lugar tengo esto:
void handlePurchases(List<Purchase> purchases) { for(Purchase purchase:purchases) { //if item is purchased if (PRODUCT_ID.equals(purchase.getSku()) && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { if (!verifyValidSignature(purchase.getOriginalJson(), purchase.getSignature())) { // Invalid purchase // show error to user Toast.makeText(getApplicationContext(), R.string.plus_error, Toast.LENGTH_SHORT).show(); return; } getSku() estaba funcionando, pero ahora está marcado como Cannot resolve method getSku() in Purchase
¿Alguna idea de cómo resolver estos problemas?
De documentos:
Summary of changes Added BillingClient.queryPurchasesAsync() to replace BillingClient.queryPurchases() which will be removed in a future release. Added Purchase#getSkus() and PurchaseHistoryRecord#getSkus(). These replace Purchase#getSku and PurchaseHistoryRecord#getSku which have been removed.Pero no sé cómo aplicar estos nuevos comandos en mi código anterior.
Si cambio getSku a getSkus my if if (PRODUCT_ID.equals(purchase.getSkus()) && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) dirá que siempre es falso. Y no tengo idea de cómo usar queryPurchasesAsync(), necesito 2 parámetros ahora.
Gracias.
Como mencioné anteriormente en un comentario, está comparando un objeto String con un List, pero como dijo chitgoks, es ArrayList<String> y no List<String> como supuse. No estoy seguro de si alguna vez obtendrá más de una cadena de sku (ya que probablemente no pida varias cosas al mismo tiempo), pero mírelas todas para estar seguro o aproveche la oportunidad y compare PRODUCT_ID con solo compra.getSkus().get(0).
La nueva llamada asíncrona para compras parece requerir solo pequeños cambios.
Ejemplo de la forma antigua de hacerlo:
Purchase.PurchasesResult result = billingClient.queryPurchases(BillingClient.SkuType.SUBS); doSomethingWithPurchaseList(result.getPurchasesList());Y esta sería la nueva forma de hacer lo mismo:
billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS, new PurchasesResponseListener() { @Override public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> list) { doSomethingWithPurchaseList(list); } });Todos saben que la nueva biblioteca de facturación tiene una nueva característica
todo estará en el subproceso de fondo, así que no cambie nada en la interfaz de usuario principal durante el reconocimiento de la compra y la restauración de la compra.
si está dando una compra de consumibles, el usuario ahora puede comprar el mismo sku en más cantidad en una compra, así que escriba la lógica en consecuencia. use la función getQuantity().
para restaurar no consumibles.
billingClient.queryPurchasesAsync( BillingClient.SkuType.INAPP, new PurchasesResponseListener() { @Override public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List < Purchase > myPurchases) { if (!myPurchases.isEmpty()) { for (Object p: myPurchases) { final Purchase purchase = (Purchase) p; if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED && purchase.getSkus.contains("sku here") { handlePurchase(purchase); } } }); } } )getSkus devuelve una ArrayList<String> . Utilice contains como se indica a continuación.
purchase.getSkus().contains(YOUR_PRODUCT_ID.toLowerCase())