рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЗрди-рдРрдк рдЦрд░реАрджрд╛рд░реА рдпрд╛ рдЖрдВрддрд░рд┐рдХ рднреБрдЧрддрд╛рди

рдпрд╣ рд╕рдм рдХреНрдпрд╛ рд╣реИ?



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

рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?



рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдЖрдИрдбреАрдИ, рдПрдВрдбреНрд░реЙрдЗрдб рдПрд╕рдбреАрдХреЗ рдФрд░ рдирдореВрдирд╛ рдЖрд╡реЗрджрди ред
рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХрд┐ рд╕реЗрд╡рд╛, рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд╕реАрд╡рд░ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рд╣реИред

рд╣рдореЗрдВ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рднреА рдЕрдиреБрдорддрд┐ рдЪрд╛рд╣рд┐рдП -

<uses-permission android:name="com.android.vending.BILLING"/> , рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?




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

рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?



рдЫрд╡рд┐

рд╕рд░реНрд╡рд░ рдкрд░, рдмрд╛рдЬрд╛рд░ рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдЬрд╛рд░ рдХрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ:
  1. BillingServiceред рдпрд╣ рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдмрд╛рдЬрд╛рд░ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИ, рдФрд░ рдЙрд╕реЗ рдкрд░рд┐рдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬрд╡рд╛рдм рджреЗрддреА рд╣реИ, рдпрджрд┐ рд╡реЗ рд╕рдордХрд╛рд▓рд┐рдХ рд╣реИрдВред
  2. BillingReceiverред рдПрдХ рдмрд╛рдЬрд╛рд░ рдЖрд╡реЗрджрди рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рдорд┐рд▓рддреА рд╣реИрдВред
  3. PurchaseObserverред рдПрдХ рдЗрдХрд╛рдИ рдЬреЛ рдЦрд░реАрдж рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ UI рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧреАред


рд╣рдо рдмрд╛рдЬрд╛рд░ рдХреЛ рдХреНрдпрд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ?



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ MarketBilling рд╕реЗрд╡рд╛ рдХреА SendBillingRequest рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдмрд┐рд▓рд┐рдВрдЧ рд╕реЗрд╡рд╛ рдХреЛ рдмрд╛рдЬрд╝рд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕реЗрд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ IMarketBillingService.aidl рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЫрд╡рд┐ рдпрд╣рд╛рдБ рд╕реЗ, рдФрд░ рдЗрд╕реЗ com.android.vending.billing рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдбрд╛рд▓реЗрдВред IDE рдХреЛ рддреБрд░рдВрдд IMarketBillingService.java рдлрд╝рд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╡рд┐рдзрд┐ рдЦреБрдж рдПрдХ рдмрдВрдбрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддреА рд╣реИ, рдЬреЛ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг "BILLING_REQUEST" рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдпрд╣ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡реЗ рд╣реИрдВ:

тАв CHECK_BILLING_SUPPORTED - рдЗрди-рдРрдк рдмрд┐рд▓рд┐рдВрдЧ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред
тАв REQUEST_PURCHASE рдЦрд░реАрдж - рдЦрд░реАрдж рдЕрдиреБрд░реЛрдзред
тАв GET_PURCHASE_INFORMATION - рдЦрд░реАрдж рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред
тАв CONFIRM_NOTIFICATIONS - рдмрд╛рдЬрд╛рд░ рдХреЗ рдЖрд╡реЗрджрди рд╕реЗ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрдереНрдп рдХреА рдкреБрд╖реНрдЯрд┐ред
тАв RESTORE_TRANSACTIONS - рдкрд╣рд▓реЗ рд╕реЗ рдЦрд░реАрджреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓реЗрдирджреЗрди рдмрд╣рд╛рд▓ рдХрд░реЗрдВред

рдЬрд╡рд╛рдм рдХреНрдпрд╛ рд╣реИрдВ?



рд╡рд┐рдзрд┐ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдмрдВрдбрд▓ рднреА рд╣реИред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

тАв RESPONSE_CODE - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб
тАв PURCHASE_INTENT - рдЦрд░реАрдж рдЧрддрд┐рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PendingIntent ред
тАв REQUEST_ID - рднреЗрдЬреЗ рдЧрдП рдЕрдиреБрд░реЛрдз рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (BillingReceiver рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд), рдЙрдирдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

тАв com.android.vending.billing.RESPONSE_CODE
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдбред рдмрд╛рдЬрд╛рд░ рдЕрдиреБрд░реЛрдз рдХреА рд╕рдлрд▓рддрд╛ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред

тАв com.android.vending.billing.IN_APP_NOTIFY
рдЪреЗрддрд╛рд╡рдиреА рдХрд┐ рдЦрд░реАрдж рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИред рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GET_PURCHASE_INFORMATION рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред

тАв com.android.vending.billing.PURCHASE_STATE_CHANGED
рдФрд░ рдлрд┐рд░ рдЦрд░реАрдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдЖрддреА рд╣реИред рдЗрд╕рдореЗрдВ рдиреЙрдирд╕, рдСрд░реНрдбрд░ рдХреА рдПрдХ рд╕реВрдЪреА, рдЙрддреНрдкрд╛рдж рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ, рдЙрдирдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╕рдВрдХреЗрдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЦрд░реАрдж рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧрд╛:

1. рд╣рдо REQUEST_PURCHASE рднреЗрдЬреЗрдВ
2. рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
3. рд▓реЙрдиреНрдЪ рдЧрддрд┐рд╡рд┐рдзрд┐ рдЦрд░реАрдж (рднреА рдмрд╛рдЬрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)
4. рд╣рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрджреЗрд╢ IN_APP_NOTIFY рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
5. GET_PURCHASE_INFORMATION
6. рд╣рдореЗрдВ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ
7. рд╣рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ PURCHASE_STATE_CHANGED рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ
8. рднреЗрдЬрдирд╛ CONFIRM_NOTIFICATIONS
9. рд╣рдореЗрдВ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ

рдпрд╛ рд╢рд╛рдпрдж рд╣рдо рдХреЛрдб рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ?



рддреЛ, рдХреЛрдб рдореЗрдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБ:

1. рдмрд╛рдЬрд╛рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред


OnCreate () рдмрд┐рд▓рд┐рдВрдЧ рд╕реЗрд╡рд╛ рдореЗрдВ рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
try {
boolean bindResult = getApplicationContext().bindService(
new Intent( "com.android.vending.billing.MarketBillingService.BIND" ),
this ,
Context.BIND_AUTO_CREATE);
if (bindResult) {
Log.i(TAG, "Service bind successful." );
} else {
Log.e(TAG, "Could not bind to the MarketBillingService." );
}
} catch (SecurityException e) {
Log.e(TAG, "Security exception: " + e);
}

// :
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.i(TAG, "MarketBillingService connected." );
marketService = IMarketBillingService.Stub.asInterface(iBinder);
runPendingRequests();
}


* This source code was highlighted with Source Code Highlighter .

2. рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ред


рдирдореВрдирд╛ рдЖрд╡реЗрджрди рдореЗрдВ, рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реЗрдгреА рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рд╣реА рд╣реИред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╢рд┐рдкрд┐рдВрдЧ рдореЗрдВ рджреЗрд░реА рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ bindService рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ MarketBillingService рдХрд╛ рд▓рд┐рдВрдХ рдмрд╣реБрдд рдмрд╛рдж рдореЗрдВ onCreate () рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд╛рдж рдореЗрдВ рдЬрдм рд╣рдо рдкрд╣рд▓реА рдмрд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рдХрд░рддреЗ рд╣реИрдВ:

/**
* Run the request, starting the connection if necessary.
*
* @return this request if the request was not executed in order to queue it.
*/
public final AbstractRequest runRequest() {
if (runIfConnected()) {
return null ;
}
return this ;
}

/**
* Try running the request directly if the service is already connected.
*
* @return true if the request ran successfully; false if the service
* is not connected or there was an error when trying to use it
*/
public boolean runIfConnected() {
if (service.isConnected()) {
try {
requestId = run();
if (requestId >= 0) {
service.addRequest(requestId, this );
}
return true ;
} catch (MyException e) {
onException(e);
}
}
return false ;
}


* This source code was highlighted with Source Code Highlighter .


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

3. рдпреВрдЖрдИ рдЕрдзрд┐рд╕реВрдЪрдирд╛


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

private void notifyGui( int messageId, PurchasedItem item) {
if (observer != null ) {
observer.notifyGui(messageId, item);
} else {
// NotificationBar
}
}

* This source code was highlighted with Source Code Highlighter .


рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╕рдордп рдФрд░ рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реЗ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╕реЗрд╡рд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

@Override
protected void onUserLeaveHint() {
if (billingService != null ) {
unbindService( this );
billingService.resetEventDispatcher();
billingService = null ;
}
super.onUserLeaveHint();
}

@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//Connected to BillingService
if (componentName.getShortClassName().equals(serviceClassName)) {
billingService = ((BillingService.LocalBinder) iBinder).getService();
billingService.setObserver( new PurchaseObserver());
try {
billingService.checkBillingAvailability();
} catch (MyException e) {
Log.e(TAG, "Billing unavailable" , e);
Toast.makeText( this , "Billing unavailable" , Toast.LENGTH_LONG).show();
}
}
}


* This source code was highlighted with Source Code Highlighter .


4. рдЧрддрд┐рд╡рд┐рдзрд┐ рдЧрддрд┐рд╡рд┐рдзрд┐ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред


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

рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдХреНрдпрд╛?



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

PS рдбреЗрд╡рд▓рдкрд░. android.com/guide/market/billing/billing_overview.html рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ

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


All Articles