2013年5月9日木曜日

音量の設定が変更されたという通知を受け取る

音量の設定が変更されたという通知を受け取る

副題:本体設定が変更されたことを取得する

標題について調べたところ、下記にコードがありました。
音量設定の取得について

このコードを参考に、下記のとおり私なりに作ってみました。このプログラムの実行中に、音量を変えると、ログが表示されます。
これは、本体設定が変更されたことを取得するためのプログラムなのですね。
一部の機種においては、Settings.System.VOLUME_MUSICの値が11に固定されています。固定されているということは、変更が発生しないということでありますので、その結果、ContentObserver#onChange()が呼ばれないということになってしまいます。この機種においては、"volume_music_speaker"に有効な値が代入されていました。
"volume_music_speaker"は「本体設定」の値の一覧取得プログラムを使って調べました。

public class MainActivity extends Activity{
    final private String TAG = "MainActivity";
    ContentResolver cr;
    MyObserver mo;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        cr = getContentResolver();
        int i = Settings.System.getInt(cr, "volume_music_speaker", -1);
        Uri u;
        if(i>=0){
            u = Settings.System.getUriFor("volume_music_speaker");
        }
        else{
            u = Settings.System.getUriFor(Settings.System.VOLUME_MUSIC);
        }
        mo = new MyObserver(new Handler());
        cr.registerContentObserver(u, true, mo);
    }

    @Override
    protected void onDestroy() {
        Log.v(TAG, "onDestroy()");
        cr.unregisterContentObserver(mo);
        super.onDestroy();
    }

    private class MyObserver extends ContentObserver{
        final private String TAG = "It's ME!";
        public MyObserver(Handler h){
            super(h);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
            Log.v(TAG, "onChange(). uri==" + uri +
                ". volume==" + am.getStreamVolume(AudioManager.STREAM_MUSIC));
        }

        @Override
        public void onChange(boolean selfChange){
            onChange(selfChange, null);
        }
    }
}

0 件のコメント:

コメントを投稿