GDPRメッセージをAndroidアプリに組み込む

2024年2月13日

開発環境
OS:Windows 11
SDK:Android Studio Flamingo | 2022.2.1

概要

AndroidアプリにGDPRメッセージを組み込みます。

AdMobに表示された警告

AdMobのコンソール画面を表示したところGDPRメッセージについて警告が表示されていました。

2024年1月14日からイギリス、または、欧州経済領域で広告を表示するには事前に広告表示に関する確認が必要になるようです。

GPDRメッセージとはその確認のための案内文であり、UMP SDKをアプリに組み込むとAdMobで作成したメッセージを表示してくるようです。

GDPRメッセージ作成の流れ

早速、実装していきます。

まずは、AdMobのコンソール画面に表示された「GPDRメッセージを作成」をタップします。

(メニュー「プライバシーとメッセージ」のGDPRから作成・編集することもできます。)

GDPRメッセージの作成フローが表示されます。

流れに沿って設定していけば滞りなく実装できます。

ステップ1.メッセージを作成する

まずはGDPRメッセージを作成します。

メッセージ自体はデフォルトのフォーマットがあるためそのまま使用します。

設定すべき項目としては、

「表示対象アプリ」、「言語」、「同意しないボタンの表示有無」ぐらいです。

私は、同意しないボタンを表示するパターンと表示しないパターンの2パターン作成し、

表示対象アプリをそれぞれのパターンに振り分けることにしました。

基本的には同意しないボタンを表示しないパターンを使用し、

こども向けゲームアプリだけ同意しないボタンを表示するパターンを使用することにしました。

ステップ2.UMP SDKを組み込む

メッセージの作成が終わったら、アプリにUMP SDKを組み込みます。

まずはbuilde.gradleの実装。

    implementation 'com.google.android.ump:user-messaging-platform:2.1.0'

次に必要なモジュールをインポートします。

import com.google.android.ump.ConsentForm
import com.google.android.ump.ConsentInformation
import com.google.android.ump.ConsentInformation.OnConsentInfoUpdateFailureListener
import com.google.android.ump.ConsentInformation.OnConsentInfoUpdateSuccessListener
import com.google.android.ump.ConsentRequestParameters
import com.google.android.ump.UserMessagingPlatform
import com.google.android.ump.ConsentDebugSettings
import java.util.concurrent.atomic.AtomicBoolean

あとは適当な場所にメッセージの呼び出し処理を追加します。

    private lateinit var consentInformation: ConsentInformation
    private var isMobileAdsInitializeCalled = AtomicBoolean(false)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val params = ConsentRequestParameters
            .Builder()
            .setTagForUnderAgeOfConsent(false)
            .build()

        consentInformation = UserMessagingPlatform.getConsentInformation(this)
        consentInformation.requestConsentInfoUpdate(
            this,
            params,
            OnConsentInfoUpdateSuccessListener {
                UserMessagingPlatform.loadAndShowConsentFormIfRequired(
                    this@MainActivity,
                    ConsentForm.OnConsentFormDismissedListener {
                        // Consent has been gathered.
                        if (consentInformation.canRequestAds()) {
                            initializeMobileAdsSdk()
                        }
                    }
                )
            },
            OnConsentInfoUpdateFailureListener {

            })

        if (consentInformation.canRequestAds()) {
            initializeMobileAdsSdk()
        }
    }

最後にメッセージロード後の処理を追加して完了です。

    private fun initializeMobileAdsSdk() {
        if (isMobileAdsInitializeCalled.get()) {
            return
        }
        isMobileAdsInitializeCalled.set(true)

        MobileAds.initialize(this)
    }

ステップ3.デバッグする

最後に動作確認をします。

まずはデバッグ用のパラメータを追加します。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val debugSettings = ConsentDebugSettings.Builder(this)
            .setDebugGeography(ConsentDebugSettings.DebugGeography.DEBUG_GEOGRAPHY_EEA)
            .addTestDeviceHashedId("46********************E1")←デバッグ機のデバイスID
            .build()

        val params = ConsentRequestParameters
            .Builder()
//            .setTagForUnderAgeOfConsent(false)
            .setConsentDebugSettings(debugSettings)
            .build()

        consentInformation = UserMessagingPlatform.getConsentInformation(this)
        consentInformation.requestConsentInfoUpdate(
            this,
            params,
     ~
    }

デバッグするには、デバッグ機のデバイスIDが必要になります。

アプリを起動するとログにデバイスIDが出力されます。

ログは「.addTestDeviceHash」で絞り込むと見やすいです。

アプリを起動させ、以下のような画面が表示されたら実装成功です。

もう1度確認したい場合は、

consentInformation.requestConsentInfoUpdateの前に以下を追加すると

同意を行った後もまた案内文が表示されるようになります。

        consentInformation.reset()

ここまで動作確認できれば、あとはリリースするだけです。

お疲れさまでした。

ポリシー違反「ユーザーの意図しないクリック:レイアウト」を解決した話

2024年2月12日

開発環境
OS:Windows 11
SDK:Android Studio Flamingo | 2022.2.1

概要

ポリシー違反「ユーザーの意図しないクリック:レイアウト」の警告メールが届きました。

対応から解決までの話。

警告メールが届いてから2日で広告配信停止

ポリシー違反「ユーザーの意図しないクリック:レイアウト」の警告メールが届きました。

指摘を受けたアプリは「サムズアップ」です。

あとで対応すればいいかとしばらく放置していた2月11日(日)。

広告配信停止通知がきてしまいました。

はやくないですか!?

3連休中ののんびりモードも一転。

慌てて指摘内容を確認します。

バナー広告のすぐ上にカウントボタンを配置しているのですが、

どうやらそれを指摘されているようです。

対応する

指摘内容を踏まえ、バナー広告の配置を下から上に変更。

これでバナー広告周辺にクリックするものはなくなりました。

あとは修正版アプリをリリース。

リリースが反映されたのを確認し、審査をリクエストします。

ポリシー違反解除

審査リクエストを出した17時間後、ポリシー違反が解除されました。

ポリシー違反「サイトの仕様:ナビゲーション」を解決した(?)話

2024年2月12日

開発環境
OS:Windows 11
SDK:Android Studio Flamingo | 2022.2.1

概要

ポリシー違反「サイトの仕様:ナビゲーション」の警告メールが届いたのですが

どうも腑に落ちません。

そんなときの対応から解決までの話。

意図した動作ではないものに対する指摘

ポリシー違反「サイトの仕様:ナビゲーション」の警告メールが届きました。

指摘を受けたアプリは「みてみて」です。

そして指摘内容が以下。

添付されていた画像は2枚。

2枚目の画像はアプリが反応していないエラー画面のようです。

そして、問題として挙げられた「サイトの仕様:ナビゲーション」について確認すると。

どうやらアプリの「START」をタップしたが、反応がなくエラーとなった。

コンテンツが存在しないのではないか。

そのような指摘に思われます。

ちょっと待て、と言ってみる

アプリの仕組みとしては、「START」をタップするとFirebaseから投稿データを取得し、

マップ画面を表示するのですが、ネットワークが悪いのか、Firebaseのアクセスが遅延したのか、

アプリがエラーとなったようです。

これは外部要因によるエラー。

アプリとしては対応いたしかねます。

そこで「審査をリクエスト」からアプリのコンテンツが用意されていることを訴え、異議申し立てをしてみました。

ポリシー違反解除

審査リクエストを出した9時間後、ポリシー違反が解除されました。

こういうこともあるんですね。

AI生成画像をモバイルアプリに取り込んでみる。(4)

2024年1月24日

開発環境
OS:Windows 11
モバイルSDK:Android Studio Flamingo | 2022.2.1
AI画像生成ソフト:Fooocus_win64_2-1-791

概要

モバイル用ランチャーアプリ「ふぁいらんちゃ」のキャラクター画像を画像生成AIで作成して映えを目指すチャレンジ企画。

今回は生成画像をアプリに取り込んでリリースします。

モバイルアプリに取り込む

まだまだプロンプトを試したかったが、スペック不足による生成失敗が続き、

これ以上の画像生成は断念。

とりあえず手持ちの画像からピックアップしてアプリに取り込むことにします。

まずは過去に生成した画像を見直します。

過去に生成した画像はoutputフォルダに格納されています。

生成画像を見直し、アイコン画像候補を決定!

個人的に1番印象が強かった画像をアイコン画像として使うことにしました。

そして、その画像をベースに生成した半身画像をアプリ内のキャラクター画像として使用することに。

全身を出力するのは難しい・・・

アプリリリース

そして、アプリリリース。

画のセンスがないのでそこを画像生成AIで補完できるのは魅力的ですね!

あとはプロンプトでどこまでできるか。

全身を出力する、同じキャラクターでポーズを変える、服装を変える、

まだまだ試したいことがいろいろあります、が。

その前にGPUをどうにかしないと・・・

(3)へ

AI生成画像をモバイルアプリに取り込んでみる。(3)

2024年1月13日

開発環境
OS:Windows 11
モバイルSDK:Android Studio Flamingo | 2022.2.1
AI画像生成ソフト:Fooocus_win64_2-1-791

概要

モバイル用ランチャーアプリ「ふぁいらんちゃ」のキャラクター画像を画像生成AIで作成して映えを目指すチャレンジ企画。

今回は自作画像をインプットにして自分のイメージに近い画像の生成を試みます。

モバイルアプリ用の画像を生成する

いよいよモバイルアプリ用の画像を生成します。

必要な画像はアニメ画像になるのでrun_anime.batで起動します。

Webブラウザが立ち上がったら「Input Image」と「Advanced」で生成要素をカスタマイズします。

「Input Image」にアプリ画像を投入します。

「Advanced」では

モデルをemiに切り替え、生成パフォーマンスを「Quality」にしました。

そして、出力した結果がこちら。

できれば全身画像が欲しい・・・

そこでプロンプトの調整や出力画像をインプットに再投入するなど試行錯誤します。

そしてついに全身画像の生成に成功。

あとはコスチュームやポーズ、顏の表情などを調整したい、

と思ってgenerateを繰り返していたら・・・

スペックの壁

画像の生成が完了する前に生成処理が落ちるようになってしまいました。

どうやらGPUのメモリ不足のようです。

マシンスペックを確認してみると

GPU3GBで頑張ってました・・・

むしろここまでよく動いたな。

まだまだプロンプトを変えて色々と試したかったがここまで。

生成した画像を元にアプリの改修をかけようと思います。

AI生成画像をモバイルアプリに取り込んでみる。(2)

2024年1月13日

開発環境
OS:Windows 11
モバイルSDK:Android Studio Flamingo | 2022.2.1
AI画像生成ソフト:Fooocus_win64_2-1-791

概要

モバイル用ランチャーアプリ「ふぁいらんちゃ」のキャラクター画像を画像生成AIで作成して映えを目指すチャレンジ企画。

今回は画像生成AI、Fooocusを実際に動かして画像をアウトプットしていきます。

動かしてみる

環境構築が完了したので早速動かしてみます。

バッチファイルをダブルクリックすると起動します。

手始めにrun.batをダブルクリックします。

コマンドプロンプトが立ち上がり、セットアップが実行され、最終的にWebブラウザが立ち上がります。

あとは「Generate」ボタンをクリックするとAI画像が生成されます。

プロンプトに「japanese girl」と入力し、generateした結果が以下です。

「Advanced」をチェックすることで生成要素をカスタマイズできます。

・生成パフォーマンス(速度重視か、質重視か)

・画像サイズ

・出力枚数(デフォルト2枚)

・シード

・スタイル

・モデル

などなど

気を付けること

AI生成画像をモバイルアプリに取り込んでみる。(1)

2024年1月13日

開発環境
OS:Windows 11
モバイルSDK:Android Studio Flamingo | 2022.2.1
AI画像生成ソフト:Fooocus_win64_2-1-791

概要

モバイル用ランチャーアプリ「ふぁいらんちゃ」。

キャラクター「ふぁい」がアプリの立ち上げをサポートしてくれる、というコンセプトで

キャラクター「ふぁい」を自作し、拙い画像ながらもプロトタイプ版をリリース。

さてどうブラッシュアップしていくか。

長考の末に行きついたのがAI生成画像。

ということでチャレンジしてみることに。

環境構築

まずはAI画像生成ソフトをインストールします。

インストールについては以下のサイトを参考に行いました。

https://ascii.jp/elem/000/004/159/4159726/

必要なもの、及び、インストール手順をピックアップすると以下。

必要なもの

・Windows、または、Linux

・GPU(NVIDIA GeForceがいいらしい)

・Githubアカウント

・Hugging Faceアカウント

インストール手順

・Githubからfooocusをダウンロードし、zipファイルを解凍する。

・HuggingFaceからemi_stable.safetensorsをインストールし、fooocusのモデルフォルダにコピーする

気を付けること

 GPUのメモリは最低4GBは欲しい、推奨は8GB~12GBのようです。

 HDDも画像を生成するごとにモデルデータを自動インストールするため数GBはあっというまに消費されていきます。

 Cドライブに100GB以上の空きが欲しいところ。

(2)へ

ポリシー違反「動的コンテンツについて」を解決した話

2024年1月7日

開発環境
OS:Windows 11
SDK:Android Studio Flamingo | 2022.2.1

概要

ポリシー違反「偶発的クリックを誘導するレイアウト – 予期しないタイミングでのインタースティシャル広告の表示」を解決した2日後のこと。

ポリシー違反「動的コンテンツについて」の警告メールが届きました。

ポリシー違反「偶発的クリックを誘導するレイアウト – 予期しないタイミングでのインタースティシャル広告の表示」を解決した話については以下を参照ください。

ポリシー違反は何度も届く

ポリシー違反を解決して安堵したのもつかのま、またしても警告メールが届きました。

指摘されたアプリは前回同様、「エストーク」、サーバーレスでも動くチャットアプリです。

前回のポリシー違反が解決できていなかったのか?

不安を胸にポリシーセンターを表示します。

検出された問題は、

「動的コンテンツについて」

添付画像はありません。

前回のポリシー違反ではなかったとのことでまずは一安心。

今回の指摘は分かりやすい内容です。

「動的コンテンツがメインとなっているページではGoogle広告を表示できない」とのこと。

前回のポリシー違反で整理したアプリ「エストーク」のインタースティシャル広告表示タイミングを見直すとフレンドリスト表示時、画像リスト表示時、チャット画面表示時の3か所です。

確かに動的コンテンツ(チャット)をメインとする画面でインタースティシャル広告を表示しています。

そこで指摘に従い、チャット画面表示時はインタースティシャル広告を表示しないよう改修しました。

ポリシー違反解除

審査リクエストを出した翌日、ポリシー違反が解除されました。

動的コンテンツがメインとなっているページではGoogle広告を表示できない。

勉強になりました。