fastapple's blog

時系列関係なく、情報を追記・分割・統合などします。ブログに記載の内容のうち、引用ではなく、私自身が記載している文章・コードなどについては、自由にご利用ください。

Androidの音量調節について【Android6.0対応版】(前篇)


広告


はじめに

以前、Androidの音量調節の記事を書いていたが、Android5.0以降から内容が古くなってしまったので、書きなおすことにした。いくつかは以前の記事の焼き直しである。なお、書いているうちにすごいボリュームになってきたので、前篇と後篇に分けることにした。

まず、Androidを初めて使ったユーザーがハマりがちだが、Androidの音量調節というのは、通話、音楽、アラームなどなどによって異なっている。という事を知らない。というか、ずっとAndroidを使っているユーザーですら、わかっていないひとがあまりにも多い。

通常の待ち受け画面の状態で音量調節のサイドボタンを操作しても、「着信音量」しか変更できない。例えば音楽を聞いている時に初めて、メディア音量を調整できるのである。なお、(おそらく)Android6.0からは状況は少しマシになっている。どういうことかというと、音量ボタンをおした時に、上部の通知領域に音量が表示されるのだが、

f:id:fastapple:20160429183806p:plain

右側に出ている、∨(または)みたいなマークが押してくれと言わんばかりに主張してくるので、押す。すると、

f:id:fastapple:20160429184434p:plain

右側のマークが∧(かつ)みたいなマークに変わったのは本題ではないが、他にも、隠された設定たちがでてくる。

上から、通知音量(着信音量)、メディア音量、アラーム音量だ。音量サイドバーからすぐにコントロールできる項目が増えたので、ユーザーにとってはうれしい。

~~長い補足~~

さっきから通知音量(着信音量)のように書いているのは、この2つは違う設定と見せかけて、通常は、別々にはコントロールできないからである。多分殆どの場合、これを別々にしたいモチベーションというのはない気がする。なお、この2つの設定がリンクされたのは、Android4からのようである。さらにいうと、システム音量というのもあるんだが、Android5以降では、これもリンクしているので、Android5以降では、この3つの設定は実質同じということになる。

これについては、以下のブログが詳しかった。
「Android 4.0以上」着信音とメールやLINEの通知音の音量を個別設定する2つの方法 | FeeeeeLog (フィーログ)

AndroidのAudioManagerの項目をみると、STREAM_NOTIFICATION(通知音ストリーム)とSTREAM_RING(着信音ストリーム)は別々に存在していることがわかる。この設定のリンクが実際にどのような形で実現されているのかはよくわからない。
AudioManager | Android Developers

~~~~~~~~

Android6.0からボリュームのコントロールが更にやりやすくなったが、ボリュームをすぐに調節できるアプリの需要はAndroid6.0になってもなくならない。そこで、まずはこのアプリを入れたいところだ。

1.ボリュームコントロールプラス

https://play.google.com/store/apps/details?id=com.cb.volumePlus&hl=ja

このアプリをインストールし、設定画面を開けば、ようやくAndroidの音量というのが、項目別になっていると理解できるだろう。

まず左下のスピーカーみたいなアイコンが青になっている状態では、通常時の音量の設定を保存できる。ここでは全部の音量をある程度の大きさで設定しておくのがいいだろう。下画像のような感じだ。
f:id:fastapple:20140629024844j:plain

さて次は、マナーモード時の音量である。中央下の携帯が震えるようなアイコン(以下、マナーモードのアイコンとよぶ)をタップし、青にした状態で、設定する。大体マナーモードの時でも鳴って欲しい音が個別にあるなんてことは滅多にないが、マナーモードの時にメディアの音量が調節できてしまうのが諸悪の根源なわけである。ただ電話をとって相手の声が聞こえないのは流石にいただけない。この設定は通話音である。よって、通話音だけにするのがイカした設定だ。次のようにする。

f:id:fastapple:20140629025520j:plain

さて、これでマナーモードにしたいときは、このアプリを起動して、マナーモードのアイコンをタップすればいい。ちなみに別の設定画面で、マナーモードの時にメディアの音量とアラームの音量をミュートにする。という安心設定があり、(多分デフォルトで)チェックが入っているので、この画面でせっかくアラームを大きくしても、いざマナーモードにするとアラームがならなくなる。なってほしい場合は、そちらの設定をオフにした上で、マナーモードの設定を変更しよう。

(補足)
さて、このアプリのレビューで、通知音量と着信音量をわけられなくなった。みたいなレビューをみつけるんだけど、Androidのバージョンが上がったからなので、諦めるか、これを分けられるようにするアプリとかもあるようなので、調べたことはないけど、分けたい人はそれを探すといいだろう。なお、このアプリ、着信音量と通知音量がリンクしていることは、着信音量を上げるとすぐに通知音量もあがるので直感的に理解できるのだが、Android5.0以降で、システム音量もリンクしていることには対応できていない。あたかも別々に設定できるように見えてしまうが、アプリを閉じて再度開くと、最後に設定した音量で、着信・通知・システムに関しては同一で設定されているだろうから、注意が必要だ。


さて、これだけでも十分効果的だが、さらにイヤホンやヘッドホンで音楽を聞く人は、イヤホンを抜き差しした時に自動で音量を変えてほしいといった需要があるだろう。ここでHeadset Volume Watcherを紹介していたが、Android5以降には対応していない。そこで、やりたいことに対してかなりオーバースペックではあるが、Automateを紹介したい。

2.Automate

Android自動化アプリとして、Llamaなどを紹介していたが、Llamaは最近更新が途絶えてきてしまい、Android5.0以降では動作に不満がでるようになってしまった。ここで紹介するAutomateは、2016年4月現在もアップデートが続いており、ほとんどなんでもできてしまうアプリだ。

play.google.com

やりたいことをフローチャートで書いていくのだが、最初はややとっつきにくいことと、やれることが多く複雑と思えるので敬遠しがちだが、フローをつくるのは結構面白い。カスタマイズ性も高いので、最初から順に説明していきたい。なお、作成者がLlamaLabなんだけど、同じジャンルのLlamaを意識しているのかどうかは知らない。検索にひっかかるようにしたのならなかなかの策士だ。

Automateでプラグの抜差しに応じて音量調整しよう

今回は、このアプリを利用して、ヘッドホンプラグが刺されたらメディア音量を50にセット。外されたら0にセット。というのを実現していく。

なお、このアプリはいわゆるフリーミアムモデルを採用しており、無料で利用する場合、実行中のフローの中の、合計のブロックが30までという制限がある。これから紹介する方法は、30ブロックあれば十分無料で実行できるものばかりだ。他にもいろいろやりたくなって30ブロックでは足りないと思ったら、購入してプレミアムユーザになればいいだろう。これを書いている時点で、249円である。利用頻度を考えると良心的な価格だ。

まず、アプリを立ち上げると、FLOWSという表示とともにサンプルのフローが並んでいる。こういうのは自分はすぐ消してしまうタイプなんだが、まあ別に残しておいてもいいだろう。この画面をフロー一覧画面と呼ぼう。

まずは、実際にフローを作ってみよう。

トーストを表示してみる

まずは、+ボタンを押す。

f:id:fastapple:20160429204412p:plain

すると、フロー作成画面へ遷移する。

f:id:fastapple:20160429204835p:plain

まずは、こんにちは!と表示するだけのフローを作ってみよう。急がば回れである。

左上の三みたいなマークを押すと、ブロックを選べる。そこで、INTERFACEを押して開こう。下の方に、Toast showというのがあるので、これを押す。

f:id:fastapple:20160429205503p:plain

すると、Flow beginning(フローのはじまり)のブロックの下に、Toast show(トーストの表示)のブロックができたことがおわかりいただけただろうか。

f:id:fastapple:20160429210113p:plain

ところで、トーストとはなんだろう。トーストとは、画面に簡単なメッセージを表示してくれる便利なやつのことだ。なんでトーストなのかというと、語感的に、トースターからトーストがチン!といって出てくるような感じで表示されるという事が言いたいんだろう。チャーミングなネーミングである。

さて、Toast showのブロックを押すと、ブロックに対する詳細な設定画面がでてくる。以降、ブロック設定画面と呼ぼう。

f:id:fastapple:20160429210706p:plain

一番上の、CANCELとDONEは、設定をキャンセルしたいとき、または、設定がおわってフロー作成画面に戻りたいときに押せばいい。

その下の、青地に白抜き文字の部分は、ブロックの簡単な説明が書いてある。ここを押すと、詳細な説明がでてくる。

さて、MESSAGEの部分にこんにちは!と入力してみよう。そして、DURATION(存続期間)はSHORT(短め)に設定しておく。なお、目安だが、ショートで2秒、ロングで3.5秒の間メッセージが表示されることになる。

f:id:fastapple:20160429211108p:plain

ところで、右側にある、関数みたいなfxというマークはなんだろうか。これを押すと、アイコンが切り替わる。

便宜上、切り替わったモードを、関数入力モード、元のモードを簡易入力モードと呼ぼう。元のモードに戻るには、さらにスタンプみたいなボタンを押せば、簡易入力モードに戻ることができる。下の画像では、DURATION(存続期間)が、関数入力モードに切り替わっている。ここでは関数入力モードは利用しないが、関数入力モードでは、細かい設定が可能だ。だが、書き方はよりプログラム言語的になる。関数入力モードでは変数を利用することもできる。以下では、簡易入力モードでLongを選んだ状態で関数入力モードに切り替えたが、実際にはLongでは、3.5(秒)の設定がされていることがわかる。

f:id:fastapple:20160429213041p:plain

なお、文字列は簡易入力モードではそのまま打つことができるが、関数入力モードでは、" (ダブルクオート)で囲まれる。なお、関数入力モードでは、文字列連結は ++ (プラスプラス)で行うことができる。MESSAGEの部分を関数入力モードに変更すると、こんにちは!というメッセージが、関数入力モードでは、"こんにちは!"という風になっていることがわかる。

さて、設定が済んだので、DONEを押して元の画面に戻る。戻ったら、Flow biginningOKマークを押しながら、Toast show "こんにちは!"INマークまで、指でつなげてみよう。線がつながるはずだ。ここまでできたら、右上のチェックマークを押そう。

f:id:fastapple:20160429215519p:plain

すると、次のような画面になる。これをフロー管理画面と呼ぼう。<新規>となっているところをおして名前が変更できるので、変更しておこう。まだ全然ヘッドセットと関係ないが、ヘッドセットとしておく。

f:id:fastapple:20160429220059p:plain

Startボタンを押してみよう。下の画面のようにこんにちは!と表示されれば上手く行っている。なお、ログもでている。INFOのあとに、 220@1のような表示があるが、この@の左側の、220というのは、ファイバーの番号。そして、@の右側の1といった数字は、ブロックの番号だ。もう一度先ほどのブロック作成画面をみると、ブロックの左上に小さく数字が書かれている事がわかる。それがブロックの番号だ。なお、0は、ファイバーが終了したことを表している。

f:id:fastapple:20160429220956p:plain

ファイバーとは

なお、先程からファイバーという言葉を説明もなしに使用しているが、ファイバーとはなんだろうか。プログラム的に簡潔に言えば、ファイバーとは、フローの実行中のインスタンスのことである。つまりフローを実行するたびにファイバー君が現れて、ブロックを順番に実行していってくれるイメージだ。

無限ループを実現する

なお、ここで作ったフローはすぐ終了するフローだったが、もちろん終了しないフローをつくることができる。自動化したければ、フローは四六時中動かしておきたいので、無限ループを作る必要がある。ここで、トーストのOKを、トーストのINにつなげれば、すぐに無限ループができるが、やめておこう。なぜなら、ファイバーの実行速度が早すぎて、トーストが大量に表示されてしまう。

そこで、トーストを表示させたら、5秒待ち、また表示させるというループを作ってみよう。指定の秒数待つというブロックは、DATE & TIMEDelayブロックを利用すればいい。

Delayブロックを画面に配置し、ブロック設定画面で、PROCEED(進み方)をInexact(厳密でない)に設定する。DURATION(待ち時間)は0h0m5s(5秒)に設定する。

f:id:fastapple:20160429223518p:plain

Delayブロックで無限ループを実現するなら、PROCEEDはInexactが大抵の場合最善の選択肢だろう。Inexactの場合、正確さは犠牲になるが、Exactと比較して省電力である。Delayブロック作成したら、トーストのOKをディレイのINにつなげ、さらにディレイのOKをトーストのINにつなげると5秒おきにトーストを表示する無限ループが完成する。

f:id:fastapple:20160429223905p:plain

なお、間違えてつなげた線は、線をつなげる動作で、何もない場所で指を離すと消すことができる。

このフローを実行すると、5秒おきに、こんにちは!というトーストが現れる。フロー管理画面の右側に、歯車のようなマークの中に、1という数字が表示されている。これはフロー内での実行中のファイバーの数を表している。

f:id:fastapple:20160429225222p:plain

さて、こうしておけば、Stopを押すまでファイバーは動き続ける。もちろん、Antomateを終了しても、ファイバーは動き続ける。ただしデフォルトの設定では、Androidを再起動すると、ファイバーは消えてしまう。再起動しても動き続けてほしい場合は、フロー一覧画面の右上のマークから、Settings(設定)を選び、その中から、Run on system startup (システム起動時に実行する)にチェックを入れておけば、再起動しても、もともと実行中だったフローが再度実行される。

Androidのセーフモード

さて、Automateに慣れるといろいろ作りたくなるだろうけど、Androidの再起動が絡んだ変なフローを作ってしまって、止められないとかいう状況が万が一起きた場合、Androidをセーフモードで起動すればいい。セーフモードの方法は以下のブログが参考になる。
スマホ・タブレットが挙動不審…。そんなときは「セーフモード」を試してみよう! | andronavi(アンドロナビ) - スマホの”分からない”を解決するウェブマガジン

本題

閑話休題。一旦実行中のファイバーは止めて、いよいよ本題の処理を実現していこう。Toastブロックを長押しする。ブロックを長押しすると、ブロックをまとめて選択できるモードになる。この状態で、ディレイブロックも選択し、右上のマークから、Deleteを選択すると、ブロックと、それに紐付いていた線が消える。

f:id:fastapple:20160430014518p:plain

プラグが刺されたかどうかを判定するには、INTERFACEにある、Wired headset pluggied? (ヘッドセットが接続されたか?) というブロックを利用すればいい。以降、プラグブロックと呼ぼう。

f:id:fastapple:20160430015241p:plain

プラグブロックのブロック設定画面では、PROCEED(進み方)はWhen changed(変わったら)を選んでおく。これで、このブロックに処理が到達したら、プラグの抜き差しが行われるまで、このブロックで処理が待機することになる。

仮に、これとは別にImmediately(すぐに)があるが、Immediatelyを使うとすぐにプラグの状態を検知して、次のブロックへ処理が移動する。無限ループを作りたい場合、先の例でディレイブロックを作ったように、どこかで処理が休まるポイントを作らなければ、実行するファイバーがすごく忙しくなり、電池を消耗すると考えられる。ずっと実行させる想定でフローを作成する場合、無限ループを作ることになるが、無限ループには休憩ポイントが必要だと覚えよう。今回は、ここでWhen changedを選ぶことで休憩ポイントができる。

さてこれで、プラグブロックまで来た処理が、プラグの抜差しを検知すると、その時の状態に応じて、プラグが刺されたらYES、抜かれたらNOへ遷移する。確かめるために、それぞれ、トーストブロックを配置して、YESの後続のトーストで刺したNOの後続のトーストで抜いた。と表示するように配置してみよう。以下のような感じだ。(これまで説明したとおり、トーストブロック(Toast show)はINTERFACEにある)

f:id:fastapple:20160430021756p:plain

これをStartさせてヘッドセットを刺すと、確かに刺したと表示されるが、それでフローが止まってしまう。それもそのはず、その後の処理がないからだ。なので、トーストを表示させる処理をしたらすぐにまた、ヘッドセットの検知を再開するようにしよう。つまり以下のようにそれぞれのトーストブロックのOKから、プラグブロックのINに対して、線を接続する。

f:id:fastapple:20160430022602p:plain

さて、これをStartさせて、ヘッドセットを抜差しすれば、それに応じてトーストが表示される。そして、ファイバーが停止することもなくなる。

あとはこのトーストブロックを実際に音量調節を行うブロックに変えてやればいい。CAMERA & SOUND から、Audio volume set というブロックを選択する。(以降、音量設定ブロックと呼ぼう)

まずはプラグを刺した時のブロックを作ろう。音量調節ブロックの設定画面で、VOLUMEは50にし、AUDIO STREAM はMUSIC(メディア音量)にする。POPUPのShow volume popupにチェックすれば、ボリュームを変更した時に、同時にボリュームの数字をトーストで表示する。必要ならチェックする。以下のようになる。

f:id:fastapple:20160430023655p:plain

作成したブロックをコピーして、貼り付けてもう一つ作成し、そちらはVOLUMEを0に設定するようにする。

そして、プラグが刺されたらボリュームを50にするブロックへ、プラグが抜かれたら0にするブロックへ行くように設定する。それをトーストブロックと入れ替えてしまおう。下記のようになる。

f:id:fastapple:20160430025725p:plain

これで、あとはStartを押してずっと動かしっぱなしにしておけばいい。

Communityからのダウンロード

てっとり早く動かしたいひとは、ここまでで作成したヘッドセットのフローを実はコミュニティにアップロードしているので、それを利用すればいい。

フロー選択画面の右上部にある、3人の人がいるボタンを押してみると、コミュニティの画面へ飛ぶ。ここで、ヘッドセットで検索してもらうと、作成したフローがでてくるので、Downloadを押してダウンロードが可能だ。

ダウンロードしたフローや、インポートしたフローを実行する場合は、実行前に警告がでる。その画面で更にStartを押せば実行される。

今回作成したフローのブロック数は、4ブロックだ。無料ユーザーでもまだ26ブロックが実行可能なので、無料の範囲でも、まだまだ便利な他のフローを利用することができる。

前篇のまとめ

今回の記事では、Androidで音量調節を簡単にやるためのアプリと、さらにヘッドセットが抜差しされたときの音量調節を自動で行う方法について書いた。

以前の記事では、さらに、家にいるときに音量をONにし、外に出た時にはOFFにするという設定についても触れていた。今回、Automateの紹介込みで記事が長くなってしまたので、それをAndroid5.0以降で実現する方法については、引き続き後篇の記事で紹介する。後篇もAutomateを利用していく。
fastapple.hatenablog.com