2015-10-10 23 views
8

AudioManger.setStreamMuteは現在、API 23で廃止されており、私の問題は私のアプリが16廃止予定のAudioManger.setStreamMuteの代替ですか?

最小のAPIである一方、フラグのこの種のAPIのみ23でサポートされていることであるAudioManager.ADJUST_MUTE.

AudioManager.adjustStreamVolumeを使用することが好ましいですシステム全体をミュートする別の方法はありますか?

もしそうでない場合、Googleはこの方法を非難するのですか?

答えて

14

私が行う方法は、アプリケーションが現在実行中のAndroidのバージョンに応じて適切な呼び出しを使用するif/elseブロックを使用することです。

// Change the stream to your stream of choice. 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
    am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0); 
} else { 
    am.setStreamMute(AudioManager.STREAM_MUSIC, true); 
} 
+0

しかし、23未満のapiについても、より良い解決策があるはずはありませんか? – dor00012

+0

それは解決策です。 APIが23未満の場合、elseが実行されます。私がそれをもっとうまくできる唯一の方法については、メソッドでラップすることです。 – phxhawke

+0

23より小さいapiのためのより良い解決策を言うことによって、私は 'setStreamMute'の代わりに非難されないメソッドを意味しました。私はおそらくそうではないことを理解しています、ありがとう。 – dor00012

7

受け入れ答えは、システムをミュートに正常に動作していますが、状態を復元する必要がある場合(ユーザーが一時停止したときなど/あなたのアプリを終了する)、adjustStreamVolumesetStreamMuteメソッドのセマンティクスが異なることに注意してください。 setStreamMuteについて

、ドキュメントから:AudioManagerが oからいくつかのミュート要求を受信することができる:

与えられたストリームのためのミュート要求 累積されne以上のクライアントであり、ストリームは同じ の数のアンミュート要求を受信した場合にのみミュート解除されます。

adjustStreamVolumeの場合は、AudioManager.ADJUST_MUTEの場合はそうではありません。つまり、ストリームのステータスがsetStreamMute (stream, true)でミュートされる前に既にミュートされている場合、即時setStreamMute (stream, false)はミュート状態になり、adjustStreamVolumeAudioManager.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では表示されず、この目的でその使用が可能でした。

関連する問題