{"id":6286,"date":"2020-10-08T17:29:31","date_gmt":"2020-10-08T11:59:31","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=6286"},"modified":"2020-10-08T17:29:31","modified_gmt":"2020-10-08T11:59:31","slug":"android-in-app-purchases","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/","title":{"rendered":"Android in-app Purchases"},"content":{"rendered":"<h1><b>Introduction:<\/b><\/h1>\n<p><span style=\"font-weight: 400;\">At some point, we need to earn revenue through our application. We can <\/span><span style=\"font-weight: 400;\">monetize <\/span><span style=\"font-weight: 400;\">our application for removing ads, selling physical goods, providing some enhanced functionality to users. We can follow different <\/span><span style=\"font-weight: 400;\">monetization strategies that depend upon our application.<\/span><\/p>\n<p><b>Using Google Play Billing:<\/b><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0According to android documentations-<\/span><\/p>\n<p><span style=\"font-weight: 400;\">You can use Google Play&#8217;s billing system to sell the following types of digital content:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">One-time products: A <\/span><i><span style=\"font-weight: 400;\">one-time product<\/span><\/i><span style=\"font-weight: 400;\"> is a content that users can purchase with a single, non-recurring charge to the user&#8217;s form of payment.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">One-time products can be either <\/span><i><span style=\"font-weight: 400;\">consumable<\/span><\/i><span style=\"font-weight: 400;\"> or <\/span><i><span style=\"font-weight: 400;\">non-consumable.<\/span><\/i><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/developer.android.com\/google\/play\/billing\/subs\"><span style=\"font-weight: 400;\">Subscriptions<\/span><\/a><span style=\"font-weight: 400;\">: A <\/span><i><span style=\"font-weight: 400;\">subscription<\/span><\/i><span style=\"font-weight: 400;\"> is a product that provides access to content on a recurring basis. Subscriptions renew automatically until they&#8217;re cancelled. Examples of subscriptions include access to online magazines and music streaming services.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Note: Here we will discuss One-time products.<\/span><\/p>\n<p><b>\u00a0Using Google Play Billing in-app:<\/b><\/p>\n<p><span style=\"font-weight: 400;\"><strong>1-<\/strong>Add the Google Play Billing Library dependency to your app&#8217;s <\/span><span style=\"font-weight: 400;\">build.gradle<\/span><span style=\"font-weight: 400;\"> file.<\/span><\/p>\n<pre class=\"lang:default decode:true \">dependencies {\r\n\r\n\u00a0implementation 'com.android.billingclient:billing:3.0.0'\r\n\r\n}<\/pre>\n<p><b>And add these permission in the manifest file<\/b><\/p>\n<pre class=\"lang:default decode:true \">&lt;uses-permission android:name=\"com.android.vending.BILLING\" \/&gt;<\/pre>\n<p><span style=\"font-weight: 400;\"><strong>2-<\/strong> In order to test or implement InApp Purchase \/ Subscription, we need a developer account and our app needs to be published either in alpha\/beta\/production level.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><strong>3-<\/strong>Now create a product or a subscription.<\/span><span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We need to create the products which will be available for purchases on Google Play Console. We need to add Product ID, Title, and Subscription. Product ID should be unique for every product to be purchased.<\/span><\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-6287 size-full\" src=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/in_app_purchases.png\" alt=\"\" width=\"700\" height=\"511\" srcset=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/in_app_purchases.png 700w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/in_app_purchases-300x219.png 300w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/in_app_purchases-624x456.png 624w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/p>\n<p><span style=\"font-weight: 400;\"><strong>4-<\/strong> Create an Activity and its layout file.<\/span><\/p>\n<p><img decoding=\"async\" class=\"alignnone wp-image-6288 size-full\" src=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/purchase-screen.png\" alt=\"\" width=\"800\" height=\"1600\" srcset=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/purchase-screen.png 800w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/purchase-screen-150x300.png 150w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/purchase-screen-512x1024.png 512w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/purchase-screen-768x1536.png 768w, https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/purchase-screen-624x1248.png 624w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<p><strong>i-\u00a0 \u00a0 XML file&#8211;<\/strong><\/p>\n<pre class=\"lang:default decode:true\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n\r\n&lt;LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0android:layout_width=\"match_parent\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0android:layout_height=\"match_parent\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0android:orientation=\"vertical\"&gt;\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0&lt;include\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0android:id=\"@+id\/toolbar\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0layout=\"@layout\/toolbar\" \/&gt;\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;androidx.appcompat.widget.AppCompatButton\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0android:id=\"@+id\/proceedBtn\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0style=\"@style\/Btn\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0android:layout_width=\"@dimen\/button_width\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0android:layout_height=\"@dimen\/buttom_height\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0android:layout_gravity=\"center\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0android:layout_marginTop=\"@dimen\/xlarge_margin\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0android:layout_marginBottom=\"@dimen\/xlarge_margin\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0android:background=\"@drawable\/dark_button_selector\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0android:text=\"@string\/proceed\" \/&gt;\u00a0\u00a0\r\n\r\n\r\n&lt;\/LinearLayout&gt;<\/pre>\n<p><strong>ii- Activity file and steps<\/strong><\/p>\n<pre class=\"lang:default decode:true\">import android.os.Bundle;\r\n\r\nimport android.view.MenuItem;\r\n\r\nimport android.view.View;\r\n\r\nimport androidx.annotation.NonNull;\r\n\r\nimport androidx.annotation.Nullable;\r\n\r\nimport androidx.appcompat.widget.AppCompatButton;\r\n\r\nimport com.android.billingclient.api.BillingClient;\r\n\r\nimport com.android.billingclient.api.BillingClientStateListener;\r\n\r\nimport com.android.billingclient.api.BillingFlowParams;\r\n\r\nimport com.android.billingclient.api.BillingResult;\r\n\r\nimport com.android.billingclient.api.ConsumeParams;\r\n\r\nimport com.android.billingclient.api.ConsumeResponseListener;\r\n\r\nimport com.android.billingclient.api.Purchase;\r\n\r\nimport com.android.billingclient.api.PurchasesUpdatedListener;\r\n\r\nimport com.android.billingclient.api.SkuDetails;\r\n\r\nimport com.android.billingclient.api.SkuDetailsParams;\r\n\r\nimport com.android.billingclient.api.SkuDetailsResponseListener;\r\n\r\nimport com.britishcouncil.ieltsprep.R;\r\n\r\nimport com.britishcouncil.ieltsprep.util.UiUtil;\r\n\r\nimport org.jetbrains.annotations.NotNull;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport java.util.List;\r\n\r\npublic class tPurchaseActivity extends BaseActivity implements PurchasesUpdatedListener, ConsumeResponseListener, View.OnClickListener {\r\n\r\n\u00a0\u00a0\u00a0private BillingClient mBillingClient;\r\n\r\n\u00a0\u00a0\u00a0private List&lt;String&gt; skusList;\r\n\r\n\u00a0\u00a0\u00a0private String skuId = \"product_1\";\r\n\r\n\u00a0\u00a0\u00a0private Purchase purchaseDetails;\r\n\r\n\r\n\u00a0\u00a0\u00a0@Override\r\n\r\n\u00a0\u00a0\u00a0protected void onCreate(Bundle savedInstanceState) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0super.onCreate(savedInstanceState);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setContentView(R.layout.activity_test_purchase);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0iniTView();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0skusList = new ArrayList&lt;&gt;();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0skusList.add(skuId);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ setting billing client for app in purchases\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0setUpBillingClient();\r\n\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\r\n\u00a0\u00a0\u00a0private void iniTView() {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0AppCompatButton proceedBtn = findViewById(R.id.proceedBtn);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0proceedBtn.setOnClickListener(this);\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\r\n\u00a0\u00a0\u00a0\/\/\/ 1- we setup the billing client\r\n\r\n\u00a0\u00a0\u00a0private void setUpBillingClient() {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mBillingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener(this).build();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ 2- start the connection with Google Play\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mBillingClient.startConnection(new BillingClientStateListener() {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Override\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public void onBillingSetupFinished(@NotNull BillingResult billingResult) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\/ client is ready do something\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ The BillingClient is ready. You can query purchases here.\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Override\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public void onBillingServiceDisconnected() {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0UiUtil.showToast(\"onBillingServiceDisconnected\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\r\n\u00a0\u00a0\u00a0\/\/ 3 -\u00a0 Here we can query and Show products available to buy\r\n\r\n\u00a0\u00a0\u00a0\/\/ 4- \u00a0 Here we can handle the different errors if any occurs.\r\n\r\n\u00a0\u00a0\u00a0\/\/ Here Sku string is same as product id we have added on\u00a0 Google Play Condole.\r\n\r\n\u00a0\u00a0\u00a0public void prepSKUSDetails(List&lt;String&gt; skusList, final String skuId) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0params.setSkusList(skusList)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.setType(BillingClient.SkuType.INAPP);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mBillingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Override\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public void onSkuDetailsResponse(@NotNull BillingResult billingResult, List&lt;SkuDetails&gt; skuDetailsList) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK &amp;&amp; skuDetailsList != null) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (SkuDetails skuDetails : skuDetailsList) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0String skuName = skuDetails.getSku();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (skuName.equalsIgnoreCase(skuId)) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0BillingFlowParams flowParams = BillingFlowParams.newBuilder()\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.setSkuDetails(skuDetails)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.build();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mBillingClient.launchBillingFlow(TestPurchaseActivity.this, flowParams);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0UiUtil.showToast(\"FEATURE_NOT_SUPPORTED\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.SERVICE_DISCONNECTED) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0UiUtil.showToast(\"SERVICE_DISCONNECTED\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0UiUtil.showToast(\"BILLING_UNAVAILABLE\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_UNAVAILABLE) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0UiUtil.showToast(\"SERVICE_UNAVAILABLE\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.SERVICE_TIMEOUT) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0UiUtil.showToast(\"SERVICE_TIMEOUT\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.DEVELOPER_ERROR) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0UiUtil.showToast(\"DEVELOPER_ERROR\");\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\/\/ 5-- we get the purchase update here, we process the purchases data according to our need.\r\n\r\n\u00a0\u00a0\u00a0@Override\r\n\r\n\u00a0\u00a0\u00a0public void onPurchasesUpdated(BillingResult billingResult, @Nullable List&lt;Purchase&gt; purchasesList) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&amp;&amp; purchasesList != null) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (Purchase purchase : purchasesList) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0handlePurchase(purchase);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Handle an error caused by a user cancelling the purchase flow.\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0UiUtil.showToast(\"cancelled\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED &amp;&amp; purchasesList != null) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (Purchase purchase : purchasesList) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (purchase.getSku().equals(skuId)) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0purchaseDetails = purchase;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ConsumeParams consumeParams =\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ConsumeParams.newBuilder()\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.setPurchaseToken(purchase.getPurchaseToken())\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.build();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mBillingClient.consumeAsync(consumeParams, this);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0void handlePurchase(Purchase purchase) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Grant entitlement to the user.\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (purchase.getSku().equalsIgnoreCase(skuId)) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0purchaseDetails = purchase;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Acknowledge the purchase if it hasn't already been acknowledged.\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ConsumeParams consumeParams =\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ConsumeParams.newBuilder()\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.setPurchaseToken(purchase.getPurchaseToken())\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.build();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mBillingClient.consumeAsync(consumeParams, this);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0@Override\r\n\r\n\u00a0\u00a0\u00a0public void onConsumeResponse(@NonNull BillingResult billingResult, @NonNull String s) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ here we can save the purchases data to our usel\u0325\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\r\n\u00a0\u00a0\u00a0@Override\r\n\r\n\u00a0\u00a0\u00a0public boolean onOptionsItemSelected(MenuItem item) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (item.getItemId() == android.R.id.home) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0finish();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return super.onOptionsItemSelected(item);\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0@Override\r\n\r\n\u00a0\u00a0\u00a0public void onClick(View view) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0switch (view.getId()) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case R.id.proceedBtn:\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ query item you want to PURCHASE\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0prepSKUSDetails(skusList, skuId);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0}\r\n\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction: At some point, we need to earn revenue through our application. We can monetize our application for removing ads, selling physical goods, providing some enhanced functionality to users. We can follow different monetization strategies that depend upon our application. Using Google Play Billing: \u00a0According to android documentations- You can use Google Play&#8217;s billing system [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6289,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,71],"tags":[544,14],"class_list":["post-6286","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-mobile","tag-android-in-app-purchases","tag-innovationm"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Android in-app Purchases - InnovationM - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android in-app Purchases - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"Introduction: At some point, we need to earn revenue through our application. We can monetize our application for removing ads, selling physical goods, providing some enhanced functionality to users. We can follow different monetization strategies that depend upon our application. Using Google Play Billing: \u00a0According to android documentations- You can use Google Play&#8217;s billing system [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-08T11:59:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/Android-in-app-Purchases.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"Android in-app Purchases\",\"datePublished\":\"2020-10-08T11:59:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/\"},\"wordCount\":255,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Android-in-app-Purchases.png\",\"keywords\":[\"Android in-app Purchases\",\"InnovationM\"],\"articleSection\":[\"Android\",\"Mobile\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/\",\"name\":\"Android in-app Purchases - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Android-in-app-Purchases.png\",\"datePublished\":\"2020-10-08T11:59:31+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Android-in-app-Purchases.png\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Android-in-app-Purchases.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/android-in-app-purchases\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android in-app Purchases\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Android in-app Purchases - InnovationM - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/","og_locale":"en_US","og_type":"article","og_title":"Android in-app Purchases - InnovationM - Blog","og_description":"Introduction: At some point, we need to earn revenue through our application. We can monetize our application for removing ads, selling physical goods, providing some enhanced functionality to users. We can follow different monetization strategies that depend upon our application. Using Google Play Billing: \u00a0According to android documentations- You can use Google Play&#8217;s billing system [&hellip;]","og_url":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/","og_site_name":"InnovationM - Blog","article_published_time":"2020-10-08T11:59:31+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/Android-in-app-Purchases.png","type":"image\/png"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"Android in-app Purchases","datePublished":"2020-10-08T11:59:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/"},"wordCount":255,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/Android-in-app-Purchases.png","keywords":["Android in-app Purchases","InnovationM"],"articleSection":["Android","Mobile"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/","url":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/","name":"Android in-app Purchases - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/Android-in-app-Purchases.png","datePublished":"2020-10-08T11:59:31+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/Android-in-app-Purchases.png","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/10\/Android-in-app-Purchases.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/android-in-app-purchases\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android in-app Purchases"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=6286"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6286\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/6289"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=6286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=6286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=6286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}