Androidアプリ内購入:アプリ内の広告の有料切断

多くの場合、彼らはすでにアプリケーションに有料広告切断を実装する方法に関する記事を書くように頼んでいます。 アプリ内に既にhabr に関する記事がありました 確かに、彼らはAPIの古いバージョンを検討しました。 原則として、新しいバージョンは古いバージョンとあまり変わりません。 同様の記事がありましたが、そこで議論されたのは広告表示に関するものでしたが、記事の2番目の部分は見ませんでした。 結局のところ、多くの人がまだこの問題に興味を持っているので、アプリケーションにそれを実装する方法を書くことにしました。



アプリ内購入は、アプリケーション内で仮想商品(ゲーム通貨、新しいレベルなど)を購入するためのサービスです。 これは主にゲームで使用され、作成時にお金を稼ぐ必要があるという疑問が生じる場合に使用されます。



この記事では、In-App Purchaseを使用してアプリケーションの広告を無効にする方法について説明します



アプリ内広告



原則として、どのサイトでも利用できます。 たとえば、AdMobをご覧ください。 便宜上、私は通常、そのようなものをラッパーに詰めて、必要に応じてサイトを変更するときに何も変更する必要がないようにします。 広告プラットフォームのラッパーは、インターフェイスを実装する必要があります。

public interface AdsControllerBase { public void createView( RelativeLayout layout); public void show(boolean show); public void onStart(); public void onDestroy(); public void onResume(); public void onStop(); }
      
      







AdMobのラッパーは次のようになります。

AdMobのラッパー
 public class AdMobController implements AdsControllerBase, AdListener { private static final String ADMOB_ID = "___AdMob"; private static final int REQUEST_TIMEOUT = 30000; private AdView adView; private Context c; private long last; public AdMobController(Context activity, RelativeLayout layout) { this.c = activity; createView(layout); last = System.currentTimeMillis() - REQUEST_TIMEOUT; } public void createView(RelativeLayout layout) { if(PreferencesHelper.isAdsDisabled()) return; adView = new AdView((Activity) c, AdSize.BANNER, ADMOB_ID); RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); adParams.addRule(RelativeLayout.CENTER_HORIZONTAL); adView.setAdListener(this); layout.addView(adView, adParams); adView.loadAd(new AdRequest()); } //    ,    30  public void show(boolean show) { if(adView == null) return; adView.setVisibility((show) ? View.VISIBLE : View.GONE); if (show && (System.currentTimeMillis() - last > REQUEST_TIMEOUT)) { last = System.currentTimeMillis(); adView.loadAd(new AdRequest()); } } @Override public void onReceiveAd(Ad ad) {} @Override public void onFailedToReceiveAd(Ad ad, AdRequest.ErrorCode error) {} @Override public void onPresentScreen(Ad ad) {} @Override public void onDismissScreen(Ad ad) {} @Override public void onLeaveApplication(Ad ad) {} @Override public void onStart() {} @Override public void onDestroy() {} @Override public void onResume() {} @Override public void onStop() {} }
      
      









その後、広告の初期化は次のようになります。

 AdsControllerBase ads = new AdMobController(this, layout);
      
      







この実装では、サイトが変更された場合、別のクラスのインスタンスを作成するだけです。 作業には、application_IDのみが必要です。 Admob管理エリアでアプリケーションを作成した後に受け取ります。



アプリ内購入またはアプリ内支払い



ショッピングシステムを使用するには、IMarketBillingService.aidlファイルが必要です。 SDKの/ user / android-sdk-linux / extras / google / play_billingディレクトリにあります。 このファイルをアプリケーションのcom.android.vending.billingパッケージに入れる必要があります。



ここで購入の種類について読むことができます。 回収可能な購入、つまり、アカウントに関連付けられているため再度購入できない購入に関心があります。 アプリケーションを削除して再度決定すると、購入が復元されます。 私たちの場合、切断広告の購入後、広告はユーザーを煩わせなくなります。 これは他のデバイスにも適用されます。ユーザーが自分のアカウントで別のデバイスにログインすると、アプリケーションはアプリケーションに復元され、広告は無効になります。



動作するには、AndroidManifest.xmlに許可を追加する必要があります。

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



公式のドキュメントとSDKの例は非常に役立ちます。



アプリケーションでキーを決定する必要があります-PublicKey、Androidマーケットでアカウントを登録するときに取得します

IabHelper



を定義して初期化します。 成功した場合は、購入の復元を試みます。



 // id      Google Play static final String SKU_ADS_DISABLE = "com.ads.disable"; IabHelper mHelper; private void billingInit() { mHelper = new IabHelper(this, BASE64_PUBLIC_KEY); //   (      false) mHelper.enableDebugLogging(true); // ;   //  ,    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { return; } //    mHelper. queryInventoryAsync(mGotInventoryListener); } }); }
      
      







mGotInventoryListener



は、購入を復元するためのリスナーです。

 //    . IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { private static final String TAG = "QueryInventoryFinishedListener"; public void onQueryInventoryFinished(IabResult result, Inventory inventory) { LOG.d(TAG, "Query inventory finished."); if (result.isFailure()) { LOG.d(TAG, "Failed to query inventory: " + result); return; } LOG.d(TAG, "Query inventory was successful."); /* *  . *  ,     ,  ,   ! * . verifyDeveloperPayload(). */ Purchase purchase = inventory.getPurchase(SKU_ADS_DISABLE); PreferencesHelper.savePurchase( context, PreferencesHelper.Purchase.DISABLE_ADS, purchase != null && verifyDeveloperPayload(purchase)); ads.show(!PreferencesHelper.isAdsDisabled()); } };
      
      





実際には、購入自体を実現するために必要です。



 private void buy(){ if(!PreferencesHelper.isAdsDisabled()){ /*    payload  .       . *          . */ String payload = ""; mHelper.launchPurchaseFlow(this, SKU_ADS_DISABLE, RC_REQUEST, mPurchaseFinishedListener, payload); } }
      
      







SKU_ADS_DISABLE -Google Play管理パネルで作成した製品識別子。 mPurchaseFinishedListener



リスナー:

 //    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if (result.isFailure()) { return; } if (!verifyDeveloperPayload(purchase)) { return; } if (purchase.getSku().equals(SKU_ADS_DISABLE)) { Toast.makeText(getApplicationContext(), "Purchase for disabling ads done.", Toast.LENGTH_SHORT); //   ,    PreferencesHelper.savePurchase( context, PreferencesHelper.Purchase.DISABLE_ADS, true); //   ads.show(!PreferencesHelper.isAdsDisabled()); } } };
      
      





検証方法について個別に説明する価値があります。

 boolean verifyDeveloperPayload(Purchase p) { String payload = p.getDeveloperPayload(); /* * TODO:      *        . */ return true; }
      
      







現在、購入のチェックはありませんが、実際のアプリケーションでは、購入リクエストで送信した生成行で受信データを検証する必要があります。 サードパーティのサーバーでこれを確認する必要があります。 通常のアプリケーションまたはオフラインゲームの場合、これは重要ではないかもしれませんが、オンラインゲームの場合は非常に重要です。



基本的に、すべてが、アプリケーションの起動時に設定がチェックされます(保存した場所、広告をオフにしました):

 PreferencesHelper.loadSettings(this);
      
      





その後、広告は表示されなくなります。

ショッピングテスト



これで、アプリケーションをテストするのに非常に便利です。 .apkをアルファ版またはベータ版としてアップロードして公開できます。 この場合、グループをGoogle+に割り当てて、テストすることができます。 アプリケーションのアルファ版またはベータ版を公開すると、市場には表示されず、このグループのみがアクセスできます。





テスターは購入できます。 手数料は手数料なしで引き落とされ、購入後15分後に返金されます。 心配しないで ただし、デバイス上のアカウントと出版社のアカウントが同じ場合、アプリケーションをテストすることはできません= /



githubで完全に機能する例を見ることができます。



All Articles