特定のアプリの音量をセットできないかという話-その3

※前回までのあらすじ

nの人:特定のアプリのならしている音が大きくていやだなあ

tの人とsobaの人:

それってひょっとして、アプリ起動前に音量設定すればいいんじゃない?

俺:なんかおもしろそう

tの人とsobaの人:どうぞどうぞ。

と、愛あるウエシマ作戦のおかげで、なんだかいろいろと追い込まれることになったような気がしないでもないですが、前回までは、音を出す仕組みと大体こうすりゃいいんじゃね?みたいな方針までは決まったわけですが、これがまあ、あまり想定した方法とは違っていたと言うことで、なぜかSDKのソースを読んでいる俺がいますよ。

というわけで、今回も全然進めそうにありませんが、続き。(1日おきにしようかなあーーー)

apkをコピーしてきて、smaliかけて中身を見ればいいじゃないというささやきを振り切って、困ったときのソース頼み。

困ったときのGrepCodeさまさま。というわけで、まずはRingtone行ってみましょう。

GrepCode:android.media.Ringtone

コンストラクタは、Contextを渡すわけですね。Contextを渡すってことは、そのアプリ自身の情報を持っているのかもしれないなあ。という仮説だけ立てておいて。

Ringtone(Context context) {

  mContext = context;

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

}

どっかで見たことあるそのまんま。

デフォルトでは、AudioManager.STREAM_RINGを使って再生させるわけで、それでも機種によっては違うところを使う可能性もあるので、setStreamTypeで再生チャンネルを変更できるようにしてあります。

肝心の再生部分は、openMediaPlayer()とplay()を見ると出てきます。playの中からopenMediaPlayer()が呼ばれる形になっています。すでにmAudioがnull以外に初期化されているならば、これは呼び出し音を読み込み済みということになります。そうでなければ、MediaPlayerをインスタンス化して、呼び出し音のファイルを読み込んで準備しておきます。

というわけで、Ringtoneも中を見てしまえば、MediaPlayerと一緒。ということであまり収穫のないままに次はMediaPlayerを見ていこうと思います。

 

MediaPlayerもContextを渡して初期化するので、Contextにある情報を見てそれが特定のアプリかどうかを探すことができないかなと思っています。

実際のところ、サービスとかで常駐しておいて音が出たときにその音を出してるのがどのアプリなのかっていうのがわかれば、それに越したことはないし、それで音を出す部分を横取りして自分で必要な音量をセットして再生するのが現実的だと思うんだけど、その辺りのよい解決方法がわからないので、音周りのソースを読んでいるというわけです。

 

でも、今日はここまで。次は→GrepCode:android.media.MediaPlayer

 

 

Crysis2の体験版はマルチプレイなので人がいないとできませんでした。

ユーザー登録しろっていうからおかしいなーって思ったんだよ。デモ見て満足してるからいいけど。

広告

About sato_c

小学生の頃にインベーダーゲームやPC-8001やApple][といったものを知ってしまい、それ以降ずーっとゲーム好き。でも、あんまりうまくはありません。 仕事は当初はゲーム関係のプログラムやサウンドをやっていましたが、WEB関係を通ったあと、遊技機関係のプログラムやサウンドをやっています。あまり節操がないのか。 現在はJavaですてきなコードを書けるように勉強中。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。