Android рдЦрд░реАрджрд╛рд░реА - рдмрд┐рд▓рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЪрд▓рд╛рдПрдВ

рдЫрд╡рд┐

рдФрд░ рдпрд╣ рдХреИрд╕реЗ рд╣реИ рдЕрднреА рднреА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдмреЗ рдкрд░ рдХреЛрдИ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ? рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдЗрд╕реЗ рд╕рд╣реА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ

рдЖрдкрдХреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдРрдк рдореЗрдВ рдЗрди-рдРрдк рдЦрд░реАрджрд╛рд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ 2 рддрд░реАрдХреЗ рд╣реИрдВ - рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдПред 2017 рддрдХ, рд╕рднреА рдиреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЕрдЬрд╛рд▓рд╛рдм рд╕реЗ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЬреВрди 2017 рд╕реЗ рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИ, Google рдиреЗ рдЖрдВрддрд░рд┐рдХ рдЦрд░реАрдж рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬрд╛рд░реА рдХреА - рдкреНрд▓реЗ рдмрд┐рд▓рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдЕрдм рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рдорд╛рдирдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд▓реЗ рдмрд┐рд▓рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝реЛред

implementation 'com.android.billingclient:billing:1.2' 

рдШреЛрд╖рдгрд╛ рдореЗрдВ рдЕрдиреБрдорддрд┐ рдЬреЛрдбрд╝реЗрдВред

 <uses-permission android:name="com.android.vending.BILLING"/> 

рдПрдХ BillingClient рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред

 private BillingClient mBillingClient; ... mBillingClient = BillingClient.newBuilder(this).setListener(new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       } } }).build(); mBillingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         } } @Override public void onBillingServiceDisconnected() { //    -    } }); 

рд╣рдо onPurchasesUpdated () рдореЗрдердб рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдЬрдм рдЦрд░реАрдж рдХреА рдЬрд╛рддреА рд╣реИ, onBillingSetupFinished () рдореЗрдердб рдореЗрдВ рдЖрдк рдорд╛рд▓ рдФрд░ рдЦрд░реАрджрд╛рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрддреНрдкрд╛рдж рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред InBillingSetupFinished () рдореЗрдВ querySkuDetails () рдбрд╛рд▓реЗрдВ ред

 private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>(); private String mSkuId = "sku_id_1"; ... @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   } } ... private void querySkuDetails() { SkuDetailsParams.Builder skuDetailsParamsBuilder = SkuDetailsParams.newBuilder(); List<String> skuList = new ArrayList<>(); skuList.add(mSkuId); skuDetailsParamsBuilder.setSkusList(skuList).setType(BillingClient.SkuType.INAPP); mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(), new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) { if (responseCode == 0) { for (SkuDetails skuDetails : skuDetailsList) { mSkuDetailsMap.put(skuDetails.getSku(), skuDetails); } } } }); } 

рдХреЛрдб рдореЗрдВ, рдЖрдк SKU рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдХреНрдпрд╛ рд╣реИ? SKU - рдЗрдВрдЧреНрд▓рд┐рд╢ рд╕реНрдЯреЙрдХ рдХреАрдкрд┐рдВрдЧ рдпреВрдирд┐рдЯ (рдХрдореЛрдбрд┐рдЯреА рдЖрдЗрдЯрдо рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░) рд╕реЗред

рдЕрдм mSkuDetailsMap рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ Play рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдЙрддреНрдкрд╛рджреЛрдВ (рдирд╛рдо, рд╡рд┐рд╡рд░рдг, рдореВрд▓реНрдп) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ (рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ)ред рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ skuList.add (mSkuId); , рдпрд╣рд╛рдБ рд╣рдордиреЗ Play Console рд╕реЗ рдЙрддреНрдкрд╛рдж рдЖрдИрдбреА рдЬреЛрдбрд╝реА рд╣реИ, рдпрд╣рд╛рдБ рдЙрди рд╕рднреА рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдк рдмрд╛рддрдЪреАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрддреНрдкрд╛рдж рд╣реИ-sku_id_1ред

рдЦрд░реАрдж рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рд╣рдо рдЙрддреНрдкрд╛рдж рдЖрдИрдбреА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЪрд▓рд╛рдПрдБред

 public void launchBilling(String skuId) { BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(mSkuDetailsMap.get(skuId)) .build(); mBillingClient.launchBillingFlow(this, billingFlowParams); } 

рдЕрдм, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ (рд▓рдЧрднрдЧ рдЪрд┐рддреНрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ) рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдЫрд╡рд┐

рдЕрдм, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдорд╛рди рдЦрд░реАрджрддрд╛ рд╣реИ - рдЙрдиреНрд╣реЗрдВ рдЙрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред PayComplete () рдкрджреНрдзрддрд┐ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░реЗрдВ рдЬреЛ рдЦрд░реАрджреЗ рдЧрдП рдЙрддреНрдкрд╛рдж рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдХ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдЦрд░реАрджрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЕрдм рдкреНрд░рдХрдЯ рди рд╣реЛред

 ... @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       payComplete(); } } ... 

рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЦрд░реАрдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕реЗ onBillingSetupFinished () рдореЗрдВ рдХрд░реЗрдВ ред

 @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   List<Purchase> purchasesList = queryPurchases(); //   //   ,    for (int i = 0; i < purchasesList.size(); i++) { String purchaseId = purchasesList.get(i).getSku(); if(TextUtils.equals(mSkuId, purchaseId)) { payComplete(); } } } } ... private List<Purchase> queryPurchases() { Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP); return purchasesResult.getPurchasesList(); } 

рдХреНрд░рдп рд╕реВрдЪреА рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рд╕рднреА рдЦрд░реАрджреЛрдВ рдХреА рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИред

рд╣рдо рдПрдХ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ: рдпрджрд┐ рд╕рд╛рдорд╛рди рдЦрд░реАрджрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ payComplete () рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред

рд╣реЛ рдЧрдпрд╛ред рдпрд╣ рдкреНрд▓реЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдХреЛрдИ рдЙрддреНрдкрд╛рдж рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ: рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреГрд╖реНрда рд╡рд┐рд╡рд░рдг > рдмрд┐рдХреНрд░реА рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА > рд╕реАрдорд┐рдд рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рдПрдВ ред

рдиреЛрдЯ 1 : рдЖрдк Play Console рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рд▓реНрдб рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рддрдХ рдорд╛рд▓ рдирд╣реАрдВ рдЬреЛрдбрд╝ рдкрд╛рдПрдВрдЧреЗред

рдиреЛрдЯ 2 : рдЦрд░реАрдж рдбрд╛рдпрд▓реЙрдЧ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд┐рд▓реНрдб рдХреЛ рдкреНрд▓реЗ рдХрдВрд╕реЛрд▓ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрддреНрдкрд╛рдж рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (~ 30 рдорд┐рдирдЯ - 1 рдШрдВрдЯрд╛ - 3 рдШрдВрдЯреЗ) рдЬрдм рддрдХ рдЙрддреНрдкрд╛рдж рдЕрдкрдбреЗрдЯ рди рд╣реЛ рдЬрд╛рдП, рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдПрдХ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЦрд░реАрджрд╛рд░реА рдХрд░реЗрдВрдЧреЗред

рдиреЛрдЯ 3 : рдХреГрдкрдпрд╛ рдЗрдирдкреБрдЯ рдкрд░рдореЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░реЗрдВред SKU рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ - Play Console рдореЗрдВ рдЙрддреНрдкрд╛рдж рдЕрднреА рддрдХ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреГрдкрдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

рдиреЛрдЯ 4 : рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ "рдЖрдкрдХрд╛ рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛" , рдЬрдм рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ , рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб 6 рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдореЗрдВред рдореЗрд░реЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд┐рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреА рдареАрдХ-рдареАрдХ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рд╛рдорд╛рдиреЛрдВ рдХреА рдЦрд░реАрдж рдФрд░ рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рд▓рдЧрд╛рддрд╛рд░ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреИрдВрдХ рдХрд╛рд░реНрдб рдореЗрдиреВ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдирд╛ рдХрд╛рд░реНрдб рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛ рдЬрд╛рдП? рдПрдХ рдкрд░реАрдХреНрд╖рдХ рдХреЗ рд░реВрдк рдореЗрдВ Play рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЕрдкрдирд╛ рдЦрд╛рддрд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдб рд╕реЗ рдЦрд░реАрджреЗрдВред

рдЬреАрдердм рдкрд░ рдбреЗрдореЛ

рдореБрдЭреЗ рдХреЙрдлреА рдЦрд░реАрдж рдХрд░ рджреЛ

(рд╡реИрд╕реЗ, рд▓реЗрдЦ рдХреЗ рддрд╣рдд рдмрдЯрди рдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд╛рди рдХреА рдкреНрд░рдгрд╛рд▓реА рд╣реИрдмрд░ рдкрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ - рд▓рдЧрднрдЧред рдореЙрдбрд░реЗрдЯрд░)ред

Source: https://habr.com/ru/post/hi444072/


All Articles