寒川アクアブログ

美容師しながらアプリ開発していて水草が趣味の私のブログです

Androidアプリ終了に広告を出すとポリシー違反になる!?

ポリシー違反の回避と、長く使ってもらうアプリにするための考察

 アプリ終了時にインタースティシャルなどの広告を表示するのは、
Googleデベロッパーポリシー違反にあたります。
Androidに慣れ親しんでいるユーザーは、端末のバックボタンを押したら、
一つ前に見ていた画面に戻るということを、経験則から予測しています。
新しい端末に買い換えたときでも、Androidであればすぐに不自由なく操作ができるわけですが、
この一貫性を損なうような振る舞いをしてはいけません。

 ユーザーの期待する動作を妨げてはいけません。
時間がない時、すぐに終電を調べたいのに、アプリを切り替える時に突然広告が出てきたらとても困ります。
テレビCMのように、ある程度予測できるタイミングにする必要があります。
「このアプリの機能を無料で提供するので、ちょっとだけ広告を見て頂けませんか?」というくらいの気持ちで、
極力ストレスにならないようなタイミングで表示するべき。
よく言われていますが、緊張が解けたタイミングが、ベストだと思います。

ユーザーの事を考えてみる

 普段、無料のアプリを利用するユーザーは、
開発者たちがどのようにして収益を得ているかを知っているとは限りません。

 アプリとユーザーで、WIN-WINの関係が保てることが大切です。
広告に対して不快な思いが強くなってしまえば、WINーLOSEとなり、
アプリがアンインストールされてしまうと、
結局LOSEーLOSEになってしまいます。
当たり前のようですが、長く使ってもらうにはユーザーの気持ちになって考えることが大切であると思います。

対策案

1.ネイティブ広告に変える

 アプリのデザインに溶け込むデザインの広告を使うと、視覚的なわずらわしさを解消できます。
広告というのは意識を向けさせるために、色鮮やかだったり、点滅したりしているが、
色数を抑えられた落ち着いたものにするだけでも効果的。
アプリにはあまり多くの色を使わないほうが良い。
不快ではないから「そのまま無視で問題ナシ」と思われるのか
収益的にはあまり良くなかった。
それでも、前途のLOSEになることは防げるのではないでしょうか。

2.インストール時に位置情報などのパーミッションを要求する

 インストール時に、ユーザーの質をふるいにかけます。
「電卓アプリなのに、なぜ位置情報?」と懐疑心を抱くユーザーは、
広告に対しても消極的でしょう。
逆にあまり疑わずにインストールする人は、
広告に対しても警戒心が低いかもしれません。
結局広告に興味を持ち、クリックしてもらわないことには収益に繋がらないので、
意地でも広告をクリックしないという人には初めからインストールをご遠慮いただくというのもひとつの方法です。
予算に余裕がある場合は別ですが。
インストールしてくれたユーザーには、
位置情報からより適切な広告を表示することができます。

「位置情報は疑問だったが、どうしてもこのアプリの機能を使いたくて」インストールした方のために、
個人情報保護方針(プライバシーポリシー)を明記します。
なぜ、このアプリは位置情報を取得したのか。

「このアプリには○○、○○などの第三者の広告事業者による広告が表示されることがありますが、
お客様を特定しない範囲での情報(電話番号を含まない端末情報、性別、現在の位置情報など)を
利用することで、より適した広告を表示することができます。」
というように、透明性をアピールすることで、
納得でき、アプリと、広告に対して信頼感も得られるかもしれません。

Googleでは、機密情報を取得するアプリには、アプリ内と、アプリストアの目立つところに、
プライバシーポリシー(へのリンク)を記載するように示唆していますので、
いずれにしても、プライバシーポリシー記載は必要です。
play.google.com

3.ビデオ広告を見てくれたら、バナー広告を非表示にします

3日間などの期限を決めて広告を非表示にする代わりに、高単価のリワード広告を視聴してもらうというもの。
WIN-WINな取引のようであるが、広告に焦点が当たりすぎているので、少々胡散臭さが出てしまうかもしれません。
ユーザーに選択肢を与えるという意味では良いかもしれないが、ユーザーにとってメリットが薄い。
いままでマイナスだったものがゼロになる程度のもので、
私のアプリの場合、実装後数回再生されたものの、しばらくしたらほとんど再生されなくなった。
一度試して期限が終了したら、今後は他の広告くらい我慢できてしまう。
ゲームで劇的な効果を上げるアイテムとの取引なら応じてくれるかもしれないが、
私はゲームは作らないので検証できず。
ツール系アプリなら、便利な機能の開放など、大きなメリットを提示しないと難しそうです。
ツール系は長くつかってもらいたいので、信頼度を下げないように注意したい。

結果

あくまで個人開発者目線ですが、
最も効果が高かったのが、以下の実装方法でした。
具体的に、

キッチンタイマーのアプリで、普段よく計測する時間をリスト表示する画面の、
下部に設置したダブルサイズのバナー広告

ネイティブではなく普通のバナー広告です。
おそらく前途の、ユーザーにうっとおしさを与えないという意味で、
適切な場所なのだと思います。
ダブルサイズでも、「広告が邪魔」といった内容のレビューもありません。

結局のところ、良いアプリをユーザーの気持ちになって、
丁寧に作っていくのことがなにより大切なのかもしれません。

ViewSwitcherの任意のページに飛ぶ

ViewSwitcherは2つのビューを切り替えることができますが、
切り替えるメソッドがshowPrevious()かshowNext()しかないため、
「進む」「戻る」しができず、
ページを指定して切り替えることができません。

そこで、getDisplayedChild()を呼び出すと、現在表示されているページが0か、1かを取得できるので、
その値に応じて処理を分岐することで、任意のページを表示することができます。

最初のページに飛ぶサンプル
private void jumpToPage1(){
    if (yourViewSwitcher.getDisplayedChild() == 1){
        yourViewSwitcher.showPrevious();
    } 
}

アニメーションを付加する際は、求める挙動にあわせて「進む」か「戻る」を設定します。

端末の音量をコードから変更する

端末の音量を設定するには、AudioManagerを介して行います。
各ストリームごとの、音量を設定、現在の音量を取得、最大値を知る等のことができます。
最大値は端末によって違い、7だったり15だったりするので、
独自にシークバーなどを実装するときは、最大値を知っておく必要があります。
ですが、最大値以上(100など)をセットしても、最大値に設定されます。


AudioManagerを取得する

private AudioManager mAudioManager;
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);


各ストリームの最大音量を取得する(以下、アラームのストリームの例)

int maxVol = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);

現在の音量を取得する

int nowVol = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM);

設定を変更する

int value = 3;
mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM,value,AudioManager.FLAG_SHOW_UI);

第3引数のフラグ

AudioManager.FLAG_SHOW_UI は、端末上部にシークバーが表示され、ユーザーは操作ができます。
AudioManager.FLAG_PLAY_SOUND は、上記に加えて、現在の音量で「ピッ」と鳴る。
0を指定した場合は、設定変更されるが、なにも表示されません。

NumberPickerの5つ刻みなどに変更する

デフォルトでは1ずつ刻みのNumberPickerを、5つ刻みなどに変更する方法です。

f:id:kentaro198477:20170208233759p:plain

私の場合、どうもうまく行かなくて、以下のような回りくどいやり方にしたら
思ったように実行できました。


ナンバーピッカーを拡張して、カスタムナンバーピッカーを作り、
以下のメソッドを追加しました。

public void setValues(int min ,int max, int step){
        
    setMinValue(min);
    setMaxValue((max / step));

    String string = "";
    for (int i = min; i <= max; i += step) {
        string += i;
        if (i != max) {
            string += ",";
        }
    }

    setDisplayedValues(string.split(","));

}

ちょっと変なやり方です(笑)。
文字列に”,”(カンマ)を使う場合はsplitで分割する目印を変えて下さい。

ナンバーピッカーのインスタンスを作り、setValues()を呼びます。
0~55までの5刻みの場合は、
yourNumberPicker.setValues(0,55,5);
とすると、5刻みの表示になります。

値を取得するときは、表示されている値ではなくポジションとして返ってくるので、
またstep分だけ掛ける必要があります。

プライバシーポリシー

プライバシーポリシー

制定 2017年2月7日
最終改定日 2017年2月8日
責任者 Kojitto
連絡先 kentaro198477@gmai.com

Kojittoは、Kojittoの提供するアプリ(以下、当アプリ)上で提供するサービスにおける
プライバシー情報の取り扱いについて、以下の通り
プライバシーポリシーを定めます。

プライバシー情報について

1.プライバシー情報のうち「個人情報」とは、個人情報保護法にいう
「個人情報」を指すものとし、生存する個人に関する情報であって、
当該情報に含まれる氏名、生年月日、住所、電話番号、連絡先その他
の記述により特定の個人を識別できる情報を指します。

2.プライバシー情報のうち「履歴情報および特性情報」とは、
上記に定める「個人情報」以外のものをいい、ご利用頂いたサービスや、
ご購入された商品、ご覧になったページや広告の履歴、
検索されたキーワード、ご利用日時、ご利用の方法、ご利用環境、
郵便番号や性別、職業、年齢、ユーザーのIPアドレス、クッキー情報、
位置情報、端末の固体識別情報などを指します。

当アプリに掲載される広告について

当アプリでは、第三者配信の広告サービスを利用しています。
このような広告配信事業者は、ユーザーの興味に応じた商品やサービス
の広告を表示するため、ユーザーの特性(性別、生年月日、位置情報、過去に閲覧したページや購入した商品など)
に関する情報を利用することがあります。

当アプリで取得される個人情報と利用目的について

1.上記の広告配信に際し、「履歴情報および特性情報」にあたるユーザーの特性に関する情報に限り、適正な方法で取得し、広告配信事業者に提供することがあります。
利点としては、女性のユーザーに対して男性を対象にしたサービスのように、関連性の低い広告が頻繁に表示されるのを防ぎます。
Kojittoとしては、これがプライバシー情報の利用目的の全てであり、
提携する広告事業者以外の第三者に情報を開示することはありません。

2.ユーザーの操作に応じて、端末・SDカード内のデータを参照することがあります。
これらは、当アプリ内の「閉じた環境」において、外観や通知音などをカスタマイズする目的でのみ利用されます。

インストール時にカメラ機能の権限を要求するアプリについて

当アプリの一部には、演出や、ユーザーへの通知の手段として、カメラのフラッシュ機能を利用するアプリがあります。
フラッシュの利用にあたって端末のカメラ機能へのアクセスが必要となります。
カメラ機能の権限は上記目的でのみ利用され、撮影データの取得、保存等は一切行われません。


プライバシーポリシーの変更が生じた場合は、当ページで通知いたします。

Shapeでアクアボタン風リソース

Shapeで作ってみた

f:id:kentaro198477:20170206235029p:plain

前回記事と同様に、こんどは横長のアクアボタン風リソースを作ってみました。
ちょっと違うけど、なんとなくそれっぽいのではないかと思います。
緑のボタンはテキストシャドウを設定しています。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>

        <layer-list>

            <item>
                <shape android:shape="rectangle" >
                    <corners android:radius="100dp" />
                    <gradient
                        android:endColor="#15000000"
                        android:startColor="#23000000"
                        android:angle="90"/>
                    <padding android:top="3dp" android:bottom="3dp" android:left="3dp" android:right="3dp"/>
                </shape>
            </item>

            <item >
                <shape android:shape="rectangle" >
                    <corners android:radius="100dp" />
                    <solid android:color="#00bfff"/>
                </shape>
            </item>

            <item>
                <shape android:shape="rectangle" >
                    <corners android:radius="100dp" />
                    <gradient
                        android:startColor="#b7000000"
                        android:endColor="#00ffffff"
                        android:angle="270" />
                </shape>
            </item>

            <item android:top="3dp" android:left="3dp" android:right="3dp" android:bottom="3dp">
                <shape android:shape="rectangle" >
                    <corners android:radius="100dp"/>
                    <gradient
                        android:centerY="0.7"
                        android:startColor="#b0ffffff"
                        android:centerColor="#3b8b8b8b"
                        android:endColor="#d0ffffff"
                        android:angle="90" />
                </shape>
            </item>

        </layer-list>
    </item>
</selector>

今回も、レイヤーリストでいくつかの画像を重ねています。
を指定して調整して作ると、もっとそれっぽい画像になったんですが、
Buttonのバックグラウンドとして使うと、が無視されてしまうため、
一部が伸びてしまったりしてバランスが変になります。
(ImageViewだと綺麗に表示されるが、テキストも表示したい)

また、Shapeはボカした感じの表現が難しいので、
ふちがくっきりしすぎています。
少しでも雰囲気をプラスするために、
グリーンのボタンには
テキストにシャドウを施してみました。


AQUAなボタン、なんか押したくなりますよね♪

Shapeでアクアなボタンを作ってみた

以下のようなリソースを作ってみました。
f:id:kentaro198477:20170202230555p:plain
レイヤーリストに、左から①②③④のアイテムを順次描画しています。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>        
        <layer-list>

            <!--①-->
            <item >
                <shape android:shape="oval" >
                    <size android:height="100dp" android:width="100dp"/>
                    <solid android:color="#0000ff"/>
                </shape>
            </item>

            <!--②-->
            <item>
                <shape android:shape="oval" >
                    <gradient
                        android:centerColor="#a8000000"
                        android:centerX="0.5" android:centerY="0.7"
                        android:gradientRadius="100dp"
                        android:type="radial" />
                </shape>
            </item>

            <!--③-->
            <item>
                <shape android:shape="oval" >
                    <gradient
                        android:startColor="#7affffff"
                        android:centerX="0.5" android:centerY="0.9"
                        android:gradientRadius="100dp"
                        android:type="radial" />
                </shape>
            </item>

            <!--④-->
            <item   android:top="4dp" android:left="16dp" android:right="16dp" android:bottom="48dp" >
                <shape android:shape="oval" >
                    <gradient android:startColor="#00ffffff" android:endColor="#ffffff" android:angle="90"/>
                </shape>
            </item>

        </layer-list>        
    </item>   
</selector>
<||

汎用性を考え、色味の部分は①だけです。
②や③で上手く色を混ぜられたら、より深みのある表現になりそうです。
縁取りをぼかせていないので、アクアというより、ガラス玉のような質感になってしまいました。