GDPR = EU一般データ保護規則
2018年頃に大騒ぎになってましたね。
もちろんAndroidアプリ開発者も無関係でいられません。
AdMob広告など表示するなら対応必須なんです。
ということで自分への忘備録も兼ね、
Androidでの GDPRConsent の導入手順をメモしておきます。
このライブラリを使えばGDPR対応も簡単です。
このページの目次
0.GDPRConsentとは?Google公式のConsentSDK
まずGDPRConsentについて。
これはGoogle公式の Consent SDK のことです。
次の公式ページで詳しく解説されてます。
ただこのページ・・・
なんか冗長だし、導入手順も分かりくい。
そこでエッセンシャルな部分だけ抜き出し、基本的な導入手順とかコード実装だけをまとめてみることにします。必要最低限さえ抑えておけば、意外と導入も簡単です。
1.アプリのbuild.gradleにGDPRConsent追加
まずは build.gradle へのライブラリ追加から。
次を モジュールレベルのbuild.gradleに追加すればOKです。
1 2 3 4 5 6 7 |
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.0.2' /// GDPR Consent を追加 implementation 'com.google.android.ads.consent:consent-library:1.0.6' } |
追記後は 【Sync now】 を押すのを忘れずに。
2.同意フォーム(ConsnetForm)表示が必要か調べる
ここから具体的にActivity内にコードを追加していきます。
まずはConsentForm表示が必要かのチェックからです。
以下条件の該当時だけ表示することにします。
- EUに在住している(と推定できる)
- その上でConsent同意がなされていない
もし非EUユーザーなのに ConsentForm が表示されたら迷惑だし、またEUユーザーでもアプリ起動する度に同意画面が表示されたら迷惑です。
だから表示有無のチェックが必要。
具体的には以下のようなメソッドを定義します。
▼ Acitivty内にこんなメソッド作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
/// 非パーソナライズ広告が必要かどうか private Boolean needNonPersonalizedAd = false; /// EU同意フォームの更新状態をチェック private void checkConsentInfo() { /// 開発者向け対象地域指定 ConsentInformation.getInstance(this) .addTestDevice(TEST_DEVICE_ID); ConsentInformation.getInstance(this) .setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA); /// 同意状況を確認する ConsentInformation consentInfo = ConsentInformation.getInstance(this); String[] publisherIds = new String[]{"パブリッシャーID"}; consentInfo.requestConsentInfoUpdate(publisherIds, new ConsentInfoUpdateListener() { @Override public void onConsentInfoUpdated(ConsentStatus consentStatus) { switch (consentStatus) { case PERSONALIZED: needNonPersonalizedAd = false; loadOrShowAds(); break; case NON_PERSONALIZED: needNonPersonalizedAd = true; loadOrShowAds(); break; case UNKNOWN: if (ConsentInformation.getInstance(getBaseContext()) .isRequestLocationInEeaOrUnknown()) { requestConsent(); } else { loadOrShowAds(); } break; } } @Override public void onFailedToUpdateConsentInfo(String reason) { } }); } |
ただし "パブリッシャーID" は各自のAdMobでのIDに置き換えてください。
そして requestConsent() が同意フォームの表示処理(後述)
また loadOrShowAds() がAdMob広告を表示する処理です。(後述)
この時点では同意フォームは表示されません。
3.EUユーザーなら同意フォーム(ConsnetForm)の表示
もしEUユーザーなら同意フォームを表示します。
その具体的なコードは次の通りです。
▼ Activity内に以下のメソッドを追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/// EU同意フォームを表示する private void requestConsent() { /// EU同意フォームを表示 URL urlPrivacyPolicy = null; try { urlPrivacyPolicy = new URL("ポリシーページURL"); } catch (MalformedURLException e) { e.printStackTrace(); } consentForm = new ConsentForm.Builder(this, urlPrivacyPolicy) .withListener(new ConsentFormListener() { @Override public void onConsentFormLoaded() { if (consentForm != null) { consentForm.show(); } } @Override public void onConsentFormError(String reason) { super.onConsentFormError(reason); } @Override public void onConsentFormClosed( ConsentStatus consentStatus, Boolean userPrefersAdFree ) { super.onConsentFormClosed(consentStatus, userPrefersAdFree); switch (consentStatus) { case PERSONALIZED: needNonPersonalizedAd = false; loadOrShowAds(); break; case NON_PERSONALIZED: needNonPersonalizedAd = true; loadOrShowAds(); break; case UNKNOWN: finish(); break; } } }) .withPersonalizedAdsOption() .withNonPersonalizedAdsOption() .build(); consentForm.load(); } |
このコードの "ポリシーページURL" は各自で置き換えてください。
あとはフォームの同意語状況に応じて処理を変えます。
▼ それぞれの ConsentStatus の値と処理
-
PERSONALIZED
=> 非EUユーザーと同じくパーソナライズ広告表示OK
-
NON_PERSONALIZED
=> パーソナライズド広告の表示が拒否された。
-
UNKNOWN
=> 状態不明だけどパーソナライズ広告表示は恐らくNG
もしパーソナライズ広告表示が拒否されたなら、後述するようにパーソナライズでない設定で広告表示すればOKです。広告表示できない訳ではありません。
ちなみに表示される同意フォームはこんな見た目
▼ 実機で表示したときの様子
EUユーザー専用の同意画面です。
ただしこのコードの場合、開発者にも表示されます。
4.同意の結果によって広告設定を少しだけ変更する
ここまでが同意フォームの表示のやり方
ユーザーは次のどちらかの意志を表明したはずです。
※ ただし広告拒否については除外。
- パーソナライズド広告を許可する
- ノンパーソナライズド広告なら許可する
非EUユーザーなら無条件で前者。
この2通りで広告表示設定をすこしだけ変更します。
例えばバナーを表示する場合・・・
以下のようにすればパーソナライズド設定が変更可能です。
▼ 広告表示処理でこういう細工をする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
private void showOrLoadAds(){ AdView adView = new AdView(this); adView.setAdSize(AdSize.BANNER); adView.setAdUnitId("広告ユニットID"); /// バナーを画面に追加する処理...(省略) AdRequest adRequest = null; if(needNonPersonalizedAd){ /// 広告を非パーソナライズドにする Bundle extras = new Bundle(); extras.putString("npa", "1"); adRequest = new AdRequest.Builder() .addNetworkExtrasBundle(AdMobAdapter.class, extras) .build(); }else{ /// 広告をパーソナライズドにする adRequest = new AdRequest.Builder().build(); } adView.loadAd(adRequest); } |
ハイライトした部分に注目!
このように "npa" に "1" をもつBundleインスタンスを作ります。そしてそれを AdRequest#addNetworkExtrasBundle に渡せば非パーソナライズになります。
インタースティシャル広告やリワード広告も同様です。
あとそれから・・・このコードで「 needNonPersonalizedAd って何?」と思う人もいるかもしれませんが、これは手順2のコードで定義してあります。念のため。
GDPRContentの導入手順まとめ
ここまでの手順を簡単にまとめ
初めてだと少し面倒くさいかもしれません。
でも導入しておいた方がいいのは事実です。
以上、GDPRConsentの導入手順でした。ではまた。