2011-10-26 4 views
5

をミュート解除ことはありません、それは言われている。setStreamMuteがドキュメントで

ミュートコマンドは、クライアント・プロセスの死に対して保護されています:ストリーム上のアクティブなミュート要求にプロセスが死んだ場合、このストリームは、自動的にミュートになります。

特定のストリームのミュート要求は累積的です。AudioManagerは1つまたは複数のクライアントから複数のミュート要求を受信でき、同じ数のミュート解除要求が受信された場合にのみストリームがミュートされます。

まあ、最初の段落は真です。プロセスが終了するたびに、ミュートされたすべてのストリームは自動的にミュートされません。 しかし、何度も私がsetStreamMute(someStream, false)と呼んでも、それは決して切れません。 前回は、1回だけミュートした後に100万回以上呼び出してみましたが、何も起こりません!

ちょうど言及すると - 同じ方法でミュートを解除すると、ミュートされます - ミュートされません。しかし、同じメソッドへの次の呼び出しで - 決して解除されません。

ブロードキャスト受信機onReceiveメソッドでミュートしていますが、アラームマネージャを使用しています。私のアプリがミュート中のコールとミュート解除されているコールの間に殺されたからでしょうか? (しかし、私のアプリはまだRAM内に留まる)

私は(異なるインスタンスを毎回取得する?)AlarmManagerへの参照を保持しておりませんので

誰もがこの問題に遭遇しました。この問題はできますか?

答えて

21

Apperantly、は、これらのAndroidのバージョンではバグがあります。バージョン2.2と2.3.3でテストされ、バグが存在します。どんなに何回

am = null; 
am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 

:その後、新しい参照を取得していない、

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

、あなたがあなたの参照を失う:あなたはAudioManagerオブジェクトにsetStreamMuteを呼び出す場合 は、のように見えます今すぐam.setStreamMute(..., false)と呼ぶと、は決してになります。あなたのAudioManagerに静的参照してください:

は私が病気に報告書は、このバグは今..

レッスンと思います。

@Michell Bak、Androidソフトウェアのバグかどうかを確認するアイデアを教えてくれてありがとう:私はあまりにも多くの時間のためにこのことに固執していました。失敗。

+0

私はアンドロイド4.0のバージョンと同じ問題をここで使用している、見てみるhttp://stackoverflow.com/questions/14899395/how-to-mute-and-unmute-it-on-the-onpause- and-onresume –

+0

「AudioManager」の同じインスタンスへの参照を保持すること(好ましくは、アクティビティクラスのメンバとして) – Jong

1

以前はこのAPIを使用したことはありませんでしたが、すばらしいGoogle検索では機能しないという結果が返されました。まだアンドロイド2.3に存在しますバグのようです:

http://code.google.com/p/android/issues/detail?id=4235

+0

私のプロジェクトは、Android 2.2であります – Jong

+0

しかし、この問題は、ミュートに失敗し、ミュート解除に失敗しなかったということでした。他の結果は見ましたか?私はしていない – Jong

1

私はその後、私の活動のクラスでこの機能を追加するアプリケーションで

public class myApplication extends Application { 


    static AudioManager am; 
     public void onCreate() { 
    super.onCreate(); 
    am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    this.setMute(false); 
     } 
    } 

をオーディオマネージャ変数を置くことによって問題を解決:

private AudioManager getAM() { 
return ((elpApplication)getApplication()).am; 

} 

、ここでは、私はgetAMを(使用方法です) ;

private void toogleMediaPlayerMute() { 

    //defaultVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC); 
    elpApplication app = getElpApp(); 
    Log.d("appmute", String.valueOf(app.isMute())); 
    if (!app.isMute()) { 
     getAM().setStreamVolume(AudioManager.STREAM_MUSIC, 0, 
       AudioManager.FLAG_PLAY_SOUND); 
     getAM().setStreamMute(AudioManager.STREAM_MUSIC, true); 
     ismute = true; 

    } else { 
     int maxVolume = getAM().getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     Log.d("maxvol", String.valueOf(maxVolume)); 
     getAM().setStreamMute(AudioManager.STREAM_MUSIC, false); 
     getAM().setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, 
       AudioManager.FLAG_SHOW_UI); 

     ismute = false; 
     // app.setMute(ismute); 
    } 
    app.setMute(ismute); 
} 
+0

はい、これも私の解決策でした。できます。 – Jong

0

新しいバージョンのAPIで同じ問題が発生しています。だから、この問題を回避するために、私は少し古い学校のソリューションを実装しました。あなたのデザインは、あなたが/バイトストリームを取得し、直接バイトストリームを送信して扱うようになっている場合 - ミュートが選択されている場合はゼロで埋めバイト配列を送信します。 *

... 
byte[] whatToSend = realByteData; 
byte [] mutedOutput = new byte[recBuffSize]; 
Array.setByte(mutedOutput, 0, (byte) 0); 
... 
if (muteSet) 
    whatToSend = mutedOutput; 

amountWritten = audioTrack.write(whatToSend, 0, amountRead); 

*

関連する問題