2022年9月11日日曜日

Android アプリ AdMob GDPR 同意メッセージ

やりたいこと
GDPRに対応したメッセージをアプリの起動時に表示させることができたので、
その方法をメモしておきます。



背景
ここはよみとばして大丈夫です。

詳しいことは忘れてしまったのですが、admobかgoogleからGDPRに対応してねというメールかなにか来たか、
PlayConsoleかAdmobの管理画面でそういう通知がきてたかだったと思います。

過去の通知とかを漁ったのですがどれがそれなのかよくわかりませんでした。

ざっくり言うと、Admobを使っていて、EUを販売対象としている場合は、メッセージをだして同意を求める必要があるというものになります。

Admob > プライバシーとメッセージ > GDPR > 設定ボタン を押すと表示される画面にそういう内容が書いてあります。


(引用元 : Google Admobの管理画面)
ということで、やっとそのメッセージが表示できるようになったので、
やりかたをメモしておきます。

環境
Win11 21h2
Android Studio 2021.2.1 Patch 2
admobの広告は設定済み
参考にしたサイト
Admobのサイト
https://developers.google.com/admob/ump/android/quick-start

こちらを主に参考にしました。

デバイスIDの調べ方
https://www.howtodroid.com/how-to-find-hashed-device-id-for-admob.html
 
ざっくりいうと
ざっくりいうと、Admobのページでメッセージを出す設定に変更して、
その後にプログラムを修正する。という流れになります。

Step.1
最初にAdmobのサイトで設定をしておきます。
Admobのページにログインし、プライバシーメッセージに遷移します。
GDPRをクリック(たしか設定ボタンだったかも。)


GDPRを使ってみるの画面に遷移するので、続行をクリックする。

3ステップでGDPRメッセージを作成の画面に遷移するので、
GCPRメッセージを作成ボタンをクリックする。


次の画面でプライバシーポリシーのURLを設定する必要があります。
プライバシーポリシーは前回つくったので、そちらをURLをいれました。
(まったく自身がないプライバシーポリシーですが。)

次に言語と、表示するメッセージを選択する画面に遷移するので、
設定します。

確定するとメッセージのプレビュー画面に遷移するので、公開ボタンをクリックしてStep1は完了です。







Step.2
ここからはコードの方の話になります。
参考サイトのWebページに従って実装していきます。

まずは、*.appの方のBuild Gradleに以下の最終行を追加します。

dependencies {

    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    implementation 'androidx.navigation:navigation-fragment:2.4.1'
    implementation 'androidx.navigation:navigation-ui:2.4.1'
    implementation 'androidx.preference:preference:1.1.1'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    // for admob
    implementation 'com.google.android.gms:play-services-ads:21.0.0'

    // for EU
    implementation 'com.google.android.ump:user-messaging-platform:2.0.0'
}
Step.3
AndroidManifest.xmlに広告IDを記載します。
 (テスト用でなくて本物の方じゃないとだめか?)



Step.4
MainActivityにメンバ変数を二つ追加。下の2行です。
public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration appBarConfiguration;
    private ActivityMainBinding binding;

    // for EU ①
    private ConsentInformation consentInformation;
    private ConsentForm consentForm;

Step.5
MainActivityのonCreate()メソッドに、14行目以降を追加します。
for EU for DEBUG 以下を全部追加します。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        setSupportActionBar(Objects.requireNonNull(binding.toolbar));

        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
        appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);

        // for EU for DEBUG
//        ConsentDebugSettings debugSettings = new ConsentDebugSettings.Builder(this)
//                .setDebugGeography(ConsentDebugSettings
//                        .DebugGeography
//                        .DEBUG_GEOGRAPHY_EEA)
//                .addTestDeviceHashedId("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
//                .build();


        // for EU ②
        // Set tag for underage of consent. Here false means users are not underage.
        ConsentRequestParameters params = new ConsentRequestParameters
                .Builder()
        		// for EU for DEBUG
                //.setConsentDebugSettings(debugSettings)   // for DEBUG
                .setTagForUnderAgeOfConsent(false)
                .build();

        consentInformation = UserMessagingPlatform.getConsentInformation(this);

        // for EU for DEBUG
        //consentInformation.reset();

        consentInformation.requestConsentInfoUpdate(
                this,
                params,
                new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
                    @Override
                    public void onConsentInfoUpdateSuccess() {
                        // The consent information state was updated.
                        // You are now ready to check if a form is available.
                        if (consentInformation.isConsentFormAvailable()) {
                            loadForm();
                        }
                    }
                },
                new ConsentInformation.OnConsentInfoUpdateFailureListener() {
                    @Override
                    public void onConsentInfoUpdateFailure(FormError formError) {
                        // Handle the error.
                        Log.d("error", "error_ConsentInfoUpdateFailure");
                    }
                });

    }

Step.6
MainActivity に loadForm()を追加する。
    public void loadForm() {
        UserMessagingPlatform.loadConsentForm(
                this, new UserMessagingPlatform.OnConsentFormLoadSuccessListener() {
                    @Override
                    public void onConsentFormLoadSuccess(ConsentForm consentForm) {
                        MainActivity.this.consentForm = consentForm;
                        if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.REQUIRED) {
                            consentForm.show(
                                    MainActivity.this,
                                    new ConsentForm.OnConsentFormDismissedListener() {
                                        @Override
                                        public void onConsentFormDismissed(@Nullable FormError formError) {
                                            // Handle dismissal by reloading form.
                                            loadForm();
                                        }
                                    });
                        }
                    }
                },
                new UserMessagingPlatform.OnConsentFormLoadFailureListener() {
                    @Override
                    public void onConsentFormLoadFailure(FormError formError) {
                        // Handle the error.
                        Log.d("error", "error_ConsentFormLoadFailure");
                    }
                });
    }
Step.7 テストの準備
これだと、日本では、メッセージが表示されないので、強制的に地域をEUに変更するテストコードを追加します。

テストコードを追加するまえに、テストするデバイスのデバイスハッシュIDというのが必要になるので、まずはそれを調べます。

デバッグ対象のデバイス( emulatorとか )でアプリを実行します。

Logcat Windowで、「addtestdevice」で検索すると、ハッシュIDが表示されるので、どこかにメモっておきます。




Step.8 テスト
それでは、先ほどの強制的に地域をEUに変更するコードを追加するのですが、
実はStep5ですでに追加はしてあって、コメントアウトしているので、それを生かします。

3か所あります。

1個目が、Step5のコードの14行目の「for EU for DEBUG」とコメントがあるこの部分です。
    
        // for EU for DEBUG
        ConsentDebugSettings debugSettings = new ConsentDebugSettings.Builder(this)
                .setDebugGeography(ConsentDebugSettings
                        .DebugGeography
                        .DEBUG_GEOGRAPHY_EEA)
                .addTestDeviceHashedId("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
                .build();
    
XXXにはStep7で調べたハッシュIDを入れます。

2個目がStep5のコードの27行目のコメント部分を生かします。
    
        		// for EU for DEBUG
                //.setConsentDebugSettings(debugSettings)   // for DEBUG
    
3個目がStep5のコードの34行目のコメント部分を生かします。
これはユーザーが同意のメッセージを選択したことをリセットする処理になります。
// for EU for DEBUG
とコメントがあるこちらです。
    
        // for EU for DEBUG
        //consentInformation.reset();
おわり
これで実行すると、同意のメッセージが表示されます。
たぶんされるはず。

まとめ
Andorid アプリで GDPRの同意メッセージを表示する方法について記載いたしました。
最初にAdmobの設定で同意メッセージを表示するという設定を行い、
次に、コードを変更して同意メッセージを表示するコードを記載しました。

また、テストのために地域を変更する方法と、同意した内容をリセットする方法を記載しました。

これで一応メッセージが表示できるようになったのですが、これが正解なのかどうかがいまいち自身はないです。

苦労した点
①Step1をするということがわからず、コードだけ直して、いくらやってもメッセージがでてこないので、
そこに気づくのにとても時間をかけてしまいました。
<

2022年8月27日土曜日

ひさしぶりのAndroid Studio 8 プライバシーポリシー

やりたいこと
Android のアプリを登録している「Play Console」でエラーが発生しており、これを解決するため、
以下の二つの対応をしました。

①データセーフティーフォームに入力
②プライバシーポリシーの作成

とりあえず自分へのメモ用に参考にしたサイトとかを記録しておきます。

すでに期限はすぎてはいるのですが...



①データセーフティーフォームに入力
作っているアプリ自体はユーザーの情報を取得したりはしないのですが、
admobを使って広告を表示しているので、そういう場合は情報取得していることになるそうで、
以下のサイトなどを参考にフォームに入力しました。

https://kingmo.jp/kumonos/tips-googleplayconsole-datasafety-admob/

このあたりも参考にしました。
公式な情報
https://developers.google.com/admob/android/play-data-disclosure

②プライバシーポリシーの作成
こちらが正解がよくわからないのですが、何となく作ってみました。
作ったのはこちらです。
https://pdfandfont.blogspot.com/p/blog-page_27.html

こちらのプライバシーポリシーのところを見出しにして、埋めるように作文してみました。
https://support.google.com/googleplay/android-developer/answer/10144311?visit_id=637971628796139234-3790898462&rd=1

googleのサイトだと、プライバシーポリシーは弁護士と相談しろと書いてあるのですが、してないです。
https://support.google.com/googleplay/android-developer/answer/9859455?hl=ja

弁護士と相談。う~ん。

2022年8月16日火曜日

ひさしぶりの android studio7 admob

やりたいこと
admobのバナー広告をつけたので、そのメモです。
とりあえず簡単に。
前提
・admob自体は以前に登録済み。、アプリのIDと広告のIDはとってある。
・環境
Win11 21h2
Android Studio 2021.2.1 Patch 2
参考にしたサイト
・全体的にこちらを参考にしました。
https://developers.google.com/admob/android/quick-start?hl=ja

・admobでずれる対策はこちらを参考にしました。
https://qiita.com/UCHIUMI_Shuhei/items/e421b726934b58a9d267

Step1.アプリを設定する
build.gradleファイルでbuildscriptセクションとallprojectsセクションの両方にmavenリポジトリとmavenセントラルリポジトリを含めます。...
というのは省略した。
いらなそうだったので、(ググったところそういう情報もあったので)

Step2.gradleの設定
app/build.gradleにこれを追加。
dependencies {

	....

    // for admob
    implementation 'com.google.android.gms:play-services-ads:21.0.0'
}
Step3.manifest
AndroidManifest.xmlにこれを追加。

Step4.layout xml
layout.xmlにadmobのコントロールをはりつける
fragment_second.xmlにadmobのバナー広告のコントロールをくっつける。こちらをつけました。
Step5.初期化と広告のロード
SecondFragmentのonViewCreated()に初期化と広告をロードする処理をかく。
        // for addmob
        MobileAds.initialize(requireContext(), new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
            }
        });

        mAdView = getActivity().findViewById(R.id.adView);

        // スクロールビューとバナー広告が重なって、あとでずれるのでその対策にいれた。
        int heightInPixcel = AdSize.BANNER.getHeightInPixels(requireContext());
        mAdView.setMinimumHeight(heightInPixcel);

        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);
完成

2022年8月11日木曜日

ひさしぶりの Android Studio 6 アイコン作成 (おてがるに)

やりたいこと
Android用のアイコンの作り方の紹介となります。

はるかとおいむかしこちらの記事のやりかたでやっていたのですが、
いろいろ変わっていたので、メモしておきます。
環境
Windows 11 21H2
Android Studio 2021.2.1 Patch 1
アイコン作成のツール : Vectr

完成イメージ
こんなアイコンを作ります。


大まかな流れ
1.VectrでForegroundの画像(*.svg)を作成する。

2.Android StudioのImage AssetでForegroundの画像と、背景の色を指定する。

3.完了
Step1. VectrでForegroundの画像(*.svg)を作成する。
Vectrはオンラインのツールで無料でかつsvgでエクスポートできるソフトなので、これを使ってみました。
登録しなくても使用可能でした。また、フォントも追加できるので便利です。
それではまずはこのツールを使ってForegroundの画像を作ります。

1.Vectrのサイトにアクセスし、UseOnlineボタンを押す。


2.NEW ARTWORK → 500x500 px のサイズを選択して、名前を入力してCreateする。


もし該当するサイズがなければ作ればよいと思います。

3.文字を入れてアイコンっぽくデザインする。
フォント名の右にある+ボタンをおすと、PCのフォントも登録できます。


4.文字を右クリックして、Outline Textをクリックします。 (これしないとだめだったのでやってます)


5.色を変更します。 白にしたかったので白くしたのですが、そうすると真っ白になってしまいます。
おそらく背景の色を変えたりもできるのでしょうが、よくわからないので今後の課題として、このまま続けます。
左側のアイコンからは文字が確認できます。


6.右上のエクスポートボタンからエクスポートします。
ファイル形式だけSVGにしてその他の設定はデフォルトのままにしました。


svgファイルが作成できたらstep1完了です。
Step2.Image AssetでForegroundの画像と、背景の色を指定する。
ここからはAndroid Studioの操作になります。

1.ファイルメニュー → New → Image Assetを選択して、Image Assetを起動する。


2.Image Assetで、Pathに先ほど作成したsvgファイルを指定して、
Resizeというところで、サイズを微調整します。


3.BackGround Layerタブを選択し、背景の色をお好みの色に変更します。
変更したらNextボタンを押します。


4.Finishボタンを押して完了です。


Step3. 完成
emulator(Pixel5 android8)で確認すると、こうなりました。




苦労した点
・Step1の手順を昔やったたりかたで、Excelとペイントで作って、背景を透過させて...とやったところ、
なぜか機種によってはアイコンの周りに白枠ができたので、*.svgファイルでやってみたところうまくいきました。なんでなんだろ?

2022年7月21日木曜日

ひさしぶりの Android Studio 5 ファイル入出力

むかしのコードをコピペしてみましたが、exceptionが発生してうまく動きませんでした。

 ひとまずちゃんとこの辺を読んでみようと思います。

https://developer.android.com/training/data-storage?hl=ja

2022年7月17日日曜日

ひさしぶりのAndroid studio 3 みため

 中身はまだ未実装ですが、見た目だけは昔の状態と同じような感じになりました。



ちょっとやりだしたら、面白くなってきました。

ひさしぶりの Android studio2 editoboxを追加

 editboxを1個追加するのにだいぶ時間をかけてしまいました。

一応メモしておきます。

Plain TextをD&Dするだけでした。


それとこういうワーニングがでたので、

Missing `autofillHints` attribute

Missing accessibility label: provide either a view with an `android:labelFor` that references this view or provide an `android:hint`

こういう行を追加しました。

        android:hint="@string/edit_hint"

        android:autofillHints=""


ふ~。💦

ひさしぶりのAndroid studio

 以前作ったアプリ(memontomori)が動かなくなっていたので、直そうとおもっているのですが、さっぱり作り方わすれてました。


前のソースをひっぱりだしてきましたが、エラーがいっぱい出て動かないので、あきらめることに。

新規に作りなおすことにしました。


Basic Activityを選択して、新規作成。


fragment_first.xmlを編集して...


終わる自信がちょっとないです。


2022年5月18日水曜日

windows10にログインしたけども真っ暗なままの状態になったので、スタートアップ修復したらなおった。

1.PCを起動する。

2.ログインする。

(まっくらなまま。マウスカーソルはある。)

3.ctrl + alt + delキー

4.電源のボタンをクリック > shiftキーを押しながら再起動をクリック

5.オプションの選択画面 > トラブルシューティングをクリック

6.詳細オプション

7.スタートアップ修復

8.ユーザーアカウントとパスワードを聞かれるので入れる。

しばらく待ったらログインして、真っ暗にならなくなりました。

2022年5月17日火曜日

ログインしても真っ暗なままなwindows10で、とりあえず重要なファイルをとりだす方法

1.PCを起動する。

2.ログインする。

(まっくらなまま。マウスカーソルはある。)

3.ctrl + alt + delキー

4.電源のボタンをクリック > shiftキーを押しながら再起動をクリック

5.オプションの選択画面 > トラブルシューティングをクリック

6.詳細オプション

7.コマンドプロンプトをクリック

8.このあたりで一度ログインするような画面が表示される。表示されたらログインする。

9.コマンドプロンプトが一枚ある画面になる。

10.notepad + enter

(メモ帳が起動する。)

11.メモ帳で、ファイルメニュー > 開く。

12.USBメモリをパソコンにさす。

(ここで認識されなかったら OUT)

13.メモ帳の開くの画面で、ファイルをコピーして、USBメモリに入れる。

2022年1月23日日曜日

自動テストの練習9 (Autoit編②) 断念... 

 


やりたいこと

UWPアプリの簡単なテスト(スモークテスト?)をAutoItでやってみたいというものになります。

やってみようとおもったのですが、コントロールのIDなどをうまくできず、
残念ながら断念することにしました。...


起動

アプリを起動することだけはできました。
それだけメモしておきます。

RunWait(@ComSpec & ' /c  "C:\test\memotter - ショートカット.lnk" ')