6

サウンドを再生する必要があるアプリがあり、音量を常に 100% に設定する必要があります (これはアラーム音です)。私はこのコードを使用します:

// First I set the volume to 100%
AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

// Now I play the sound
MediaPlayer mp = MediaPlayer.create(this, R.raw.alarm_sound);
mp.setLooping(true);
mp.prepare();
mp.start();

「マルチメディア ボリューム」が 0% の場合、100% に設定され、サウンドが再生されます。問題は、別のアプリがサウンドを再生している場合 (バックグラウンドで音楽アプリなど)、その音量も 100% に設定されることです。そのため、自分のサウンドと他のアプリのサウンドが 100% 一緒に再生されます。

他のアプリのすべてのマルチメディア サウンドを停止して、自分のアプリだけを聞くようにしたい。出来ますか?

4

1 に答える 1

6

これは古い質問だと思いますが、私は自分で同じことをして、それを理解しているときにこれに出くわしました。

ターゲティングAPI8+(フローズンヨーグルト)

API 8以降をターゲットにしている場合は、http://developer.android.com/training/managing-audio/audio-focus.htmlをご覧ください。オーディオフォーカスの概念の使用について説明されており、自分ができることを実行できるはずです。欲しいです。これにより、ストリームでオーディオを再生する唯一のアプリになるようにリクエストできます。

これはシンプルなバージョンです。

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

// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                                 // Use the music stream.
                                 AudioManager.STREAM_MUSIC,
                                 // Request permanent focus.
                                 AudioManager.AUDIOFOCUS_GAIN);

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // Start playback.
}

ターゲットAPI7+(Eclair)

ただし、あなたが私のようで、API 7以降をターゲットにしたい場合は、以下の堅牢性の低い方法を使用する必要があります。

あなたはアラームを鳴らしているので、あなたの最善の策はAudioManager.STREAM_ALARM代わりに使うことでAudioManager.STREAM_MUSICあり、あなたはまた、うまくいくものからそれほど遠くありません。setStreamSolo(int streamType、boolean state)メソッドを使用して、他のストリームをミュートします。これは、アラームストリームを使用する場合に簡単です。

私の知る限り、アラームストリームの理由は、APIの動作方法によるものです。ミュートできるのは、ストリーム全体(最後を参照)または1つのストリームを除くすべて(この例)のみです。API 7を使用して、同じストリーム上の特定のアプリケーションや他のアプリをミュートすることはできません。

AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
// save initial volume
int mInitialVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM);

// set the alarm stream to 100%
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

// Now play the sound
MediaPlayer mp = MediaPlayer.create(this, R.raw.alarm_sound);
// change here is to set it to play on the alarm stream
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setLooping(true);
mp.prepare();

// setSoloStream(...) will mute all other streams
mAudioManager.setStreamSolo(AudioManager.STREAM_ALARM, true);
mp.start();

停止するときは、リソースを片付けます

mp.stop();
mp.reset();
mp.release();

// release the solo steam to unmute the other streams
mAudioManager.setStreamSolo(AudioManager.STREAM_ALARM, false);

// restore the initial stream volume
mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, mInitialVolume, AudioManager.FLAG_ALLOW_RINGER_MODES);

初期ボリュームを復元すると、ストリームは100%に設定する前の状態に戻ります。

また、特定のストリームをミュートする場合は、setStreamMute(int、boolean)を使用して特定のストリームをミュートできます。例えば

AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);

でミュートを解除します

am.setStreamMute(AudioManager.STREAM_MUSIC, false);

メディアストリームをミュートすると、別のメディアストリームで再生する必要があるため、メディアストリームでオーディオを再生できないことに注意してください。

于 2012-08-22T05:32:59.277 に答える