受け入れ答えは、システムをミュートに正常に動作していますが、状態を復元する必要がある場合(ユーザーが一時停止したときなど/あなたのアプリを終了する)、adjustStreamVolume
とsetStreamMute
メソッドのセマンティクスが異なることに注意してください。 setStreamMute
について
、ドキュメントから:AudioManagerが oからいくつかのミュート要求を受信することができる:
与えられたストリームのためのミュート要求 累積されne以上のクライアントであり、ストリームは同じ の数のアンミュート要求を受信した場合にのみミュート解除されます。
adjustStreamVolume
の場合は、AudioManager.ADJUST_MUTE
の場合はそうではありません。つまり、ストリームのステータスがsetStreamMute (stream, true)
でミュートされる前に既にミュートされている場合、即時setStreamMute (stream, false)
はミュート状態になり、adjustStreamVolume
とAudioManager.ADJUST_UNMUTE
はストリームのミュートを解除することがあります。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!audioManager.isStreamMute(stream)) {
savedStreamMuted = true;
audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
}
} else {
audioManager.setStreamMute(stream, true);
}
はミュートを解除するには:
はミュートするには -
古いセマンティクスをエミュレートするために、ユースケースによっては、一つの方法は、ミュートする前に、以下のようなものをミュート状態をチェックすることですこれは、ユーザーがイン間のストリームをミュートし、ストリームはアプリのミュート解除(後にミュートに滞在することを期待するために別のアプリを起動する可能性は低いと仮定し
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (savedStreamMuted) {
audioManager.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0);
savedStreamMuted = false;
}
} else {
// Note that this must be the same instance of audioManager that mutes
// http://stackoverflow.com/questions/7908962/setstreammute-never-unmutes?rq=1
audioManager.setStreamMute(stream, false);
}
とにかくする方法はありませんようですこれをチェックして)。
ちなみに、isStreamMute
メソッドは以前は隠されていて、API 23では表示されず、この目的でその使用が可能でした。
しかし、23未満のapiについても、より良い解決策があるはずはありませんか? – dor00012
それは解決策です。 APIが23未満の場合、elseが実行されます。私がそれをもっとうまくできる唯一の方法については、メソッドでラップすることです。 – phxhawke
23より小さいapiのためのより良い解決策を言うことによって、私は 'setStreamMute'の代わりに非難されないメソッドを意味しました。私はおそらくそうではないことを理解しています、ありがとう。 – dor00012