今回は、 Android のシステム系の部分をコードで制御する話をしていきたいと思います。

Android ではフォントサイズや壁紙等普通であれば設定画面に行って変更しなくてはいけない部分をアプリ内で変更することができます。 それぞれ簡単に使い方を説明していきたいと思います。

Fontsize

システムのフォントサイズを任意の値に設定することができます。 ただし、あまり大きい値を設定してしまうと例えばロックスクリーンでの PIN が打てない等端末の操作自体が効かなくなってしまう可能性がありますので注意して使用しましょう。

やり方としてはまず Android Manifest.xml にパーミッションを追加します。 追加するのは以下のコードです。

 <uses-permission android:name="android.permission.WRITE_SETTINGS"/>

このパーミッションを設定することで、 Android の設定系の API を触ることができます。

そして実際にフォントサイズを設定するコードが以下になります。


float scale = 1.5f;
Settings.System.putFloat(getContentResolver(),  Settings.System.FONT_SCALE, scale);

ここで指定している scale が、標準のフォントサイズに対しての倍率になります。 この値を設定したのち、端末を再起動することで反映されます。

着信音関係

次に着信音に関しての情報をまとめていきたいと思います。

ここでは、まずシステムでデフォルトとして用意されている通知音系統の一覧を取得したり、それを再生する方法や、それらを実際に着信音として端末に設定する方法をお伝えします。

Ringtone

まずこれらの話をする際に出てくる主な登場名称である Ringtone について簡単に説明します。

Ringtone とは、 Android に用意されている着信音を司るクラスのことを指します。 これを用いることで、通知音系統の一覧の取得や再生を行うことが可能です。

また、この Ringtone 自体に再生用のメソッドが用意されているため、 mediaplayer 等を使用する必要がありません。

そしてこの Ringtone クラスを管理するための RingtoneManager というクラスがあります。 実際にコードから触ることになるのはまずこちらの Manager で、これを通して Ringtone のインスタンスを取得することが可能になっています。

音をならす

さて、 Ringtone で実際に音を鳴らしてみましょう。

一番簡単に再生を行う場合には、現在端末に設定されている着信音を取得するのが良いです。 まずは以下のように着信音の Uri を取得します。

Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);

RingtoneManager の getDefaultUri メソッドを使用することで端末に設定されてる着信音の uri を取得できました。 次に再生を行うための Ringtone クラスのインスタンスを取得します。

Ringtone ringtone = RingtoneManager.getRingtone(getApplicationContext(), uri);

RingtoneManager の getRingtone メソッドを使用することで Ringtone クラスのインスタンスを取得することができました。 これで着信音を自由に鳴らすことができます。

後は鳴らしたい箇所で Ringtone クラスの start メソッドを呼ぶことで取得した着信音の再生を行うことができます!

オマケ

MediaPlayer で音楽の再生を行う方法を、触りだけ紹介しておきます。

まずは Intent 等を使用して、取得したい mp3 等のデータへのパスを用意しておきます。 その後、 MediaPlayer の インスタンスを作成しましょう。
そこまでできたら後は MediaPlayer の setDataSource(String path) メソッドを使用してパスを渡します。 最後に MediaPlayer の準備メソッドを呼び出した後 start() , stop()で制御可能になります。

音量設定

音量の設定も、アプリから行うことができます。

Android で音量の設定を行う場合、 AudioManager を使用します。 これにより、着信音量やアラーム音量等ストリームごとに音量を任意で設定することできます。

使い方は簡単で、まず以下のように getService メソッドを使用し、 AudioManager のインスタンスを作成します。

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

後は、取得した AudioManager の setStreamVolume というメソッドを利用することで音量の変更が可能です。

int volume = 14;

audioManager.setStreamVolume(AudioManager.STREAM_ALARM, 14, 0);

setStreamVolume には 3 つの引数があります。

引数 内容
streamType int 指定するストリーム
index int 設定する volume
flag int volume 設定時のインタラクション

まずはストリームですが、 AudioManager に用意されている値から選んで使うことになります。 ストリームは以下の種類の中から選択することになります。

名前 内容
STREAM_ALARM アラーム音量
STREAM_DTMF ダイヤル音量
STREAM_MUSIC 音楽再生音量
STREAM_NOTIFICATION 通知音量
STREAM_RING 着信音量
STREAM_SYSTEM システムメッセージ音量
STREAM_VOICE_CALL 通話音量

次に volume を int で設定します。これは整数値で設定しますが、それぞれのストリームには最大音量が存在します。 最大値は getStreamMaxVolume で確認しましょう。

最後にインタラクションの flag に関してです。 これは volume を設定した際に行うインタラクションについて指定するためのものになります。

選べる値をいくつか表にまとめました。

名前 内容
FLAG_SHOW_UI 現在のボリュームを表示
FLAG_ALLOW_RINGER_MODES リンガーモードと呼ばれるものを許可する
FLAG_PLAY_SOUND 指定したボリュームで確認音を鳴らす
FLAG_REMOVE_SOUND_AND_VIBRATE 再生中の音や振動を取り除く
FLAG_VIBRATE vibrate リンガーモードの場合に振動させる

この内 RINGER_MODES 以外は書いてある内容そのままなので、場合によっては指定してあげるほうが親切でしょう。

RINGER_MODES は、例えば音量を 0 として設定した場合に、自動的にミュート状態やマナーモード状態にする機能です。 端末の機能として利用可能な場合に限り、そのようなインタラクションを表示することが可能になります。

これ以外にも幾つか値はありますが、そちらは秘匿されている値のようなので割愛します。

//フラグを複数指定する例

int flags = AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_PLAY_SOUND;

このようにフラグ同士のビット和を利用することで、複数のフラグをもたせることが可能です。

壁紙の変更

壁紙も、アプリから直接変更することが可能です。

それを行うには WallpaperManager クラスのインスタンスを取得する必要があります。 WallpapaerManager にはクラスメソッドとして getInstance メソッドが用意されてますのでそちらを利用して、インスタンスを取得しましょう。

WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);

後はこの取得した WallpaperManager インスタンスに対して、 setBitmap もしくは setResource 等を利用して画像を渡してあげると壁紙の変更が可能です。

//Android N 未満
wallpaperManager.setBitmap(bitmap);

//Android N 以上
wallpaperManager.setBitmap(bitmap, null, true, WallpaperManager.FLAG_LOCK);

上記を例として表示しました。 Android N 未満へは、 bitmap リソースオンリーしか指定できません。

しかし、 N 以上はリソース以外にも、3つ引数で渡すことができます。 それが以下の表です。

名前 内容
visibleCropHint Rect Rect を渡すとそれの分だけ拡大する。 null を渡すとアスペクト維持しつつできるだけ拡大する。
allowBackup boolean バックアップを必要とするかどうか
which int どこの壁紙を変えるかどうかのフラグ

この内 which は FLAG_LOCK と FLAG_SYSTEM に分かれていて、 FLAG_LOCK にするとなんとロックスクリーンの壁紙を変更することが可能になってしまいます。

パーミッション

これらのメソッドを使用する際には SET_WALLPAPER パーミッションが必要です。 また、このパーミッションは Runtime Permission の対象となっているものなので、関連メソッドを使用する前にそのパーミッションが許可されていることを確認しましょう。

おわりに

いかがでしたでしょうか。普段システムでいじらないといけない部分も Android であれば問題なくアプリ側から触ることができます。

とはいえ、システム面を触ると端末に不具合が生じてしまう危険性もあるので、使用する場合には正しく理解して置かないと余計な事故をおこす原因となってしまいます。 その為に今回は色々と説明をさせていただきました。この記事が皆様の参考になれば幸いです。

参考サイト

http://d.hatena.ne.jp/gae/20140131/1391145734
http://techbooster.jpn.org/andriod/application/9097/
http://techbooster.org/android/device/1253/
http://techbooster.org/android/device/16850/