2011-10-26 122 views
5

在本文檔中,它是說:setStreamMute從未取消靜音

靜音指令是對客戶端進程死亡保護:如果對流活動靜音請求一個進程死亡,這個流將自動靜音。

給定流的靜音請求是累積的:AudioManager可以接收來自一個或多個客戶端的多個靜音請求,並且只有在接收到相同數量的取消靜音請求時,流纔會取消靜音。

那麼,第一段是真的;每當我的流程死亡時,我靜音的所有流都會自動取消靜音。 但是,無論我打電話多少次setStreamMute(someStream, false)它永遠不會取消靜音。 我最後一次嘗試將它調用超過100萬次後,只有一次靜音,沒有任何事情發生!

只要提及 - 如果我用相同的方法取消靜音,則將其靜音 - 保持靜音。但在接下來的調用相同的方法 - 它永遠不會取消靜音。

我在Broadcast Receiver onReceive方法中靜音,我開始使用鬧鐘管理器。所以也許是因爲我的應用程序在屏蔽呼叫和非屏蔽呼叫之間的時間內被殺害了? (但我的應用程序仍然在RAM保持)

這個問題可能是因爲我沒有保持一個參考AlarmManager(每次獲得不同的實例?)

有沒有人遇到這樣的問題?

回答

21

Apperantly,有在這些Android版本的bug;測試版本2.2和2.3.3,並存在錯誤。 的樣子,如果你調用setStreamMute一個AudioManager對象:

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

,你失去您參考,然後得到一個參考:

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

無論如何多次你現在打電話am.setStreamMute(..., false),它會從不 unmutes。

我覺得生病報告這個錯誤現在..

課:保持靜態參考您的AudioManager。

@Michell Bak,感謝給我這個想法,檢查它是否是Android軟件的bug :)我一直被困在這個東西上太多時間了,我從來沒有想過看看它不是我的故障。

+0

我正在使用Android 4.0版本和同樣的問題在這裏,看看http://stackoverflow.com/questions/14899395/how-to-mute-and-unmute-it-on-the-onpause- and-onresume –

+0

保留對'AudioManager'的相同實例的引用(最好是作爲您的活動類的成員) – Jong

1

我從來沒有使用過這個API,但一個快速的谷歌搜索,返回了一些結果,它不工作。這似乎是仍然存在的是Android 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

我一直有同樣的問題w /新版本的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); 

*