2012-10-27 69 views
5

我已經構建了一個小應用程序,使用類AudioManager將音樂流靜音/取消靜音。實際上,它在我關閉應用程序之前一直有效。即我已經靜音了,我關閉了應用程序,重新啓動了應用程序,並且按鈕不再取消靜音。我在網上搜索過,但似乎沒有人遇到過這個問題。Android中的屏蔽流

這裏是我的代碼:

public class ControlloVolume extends Activity { 
ToggleButton tb_mute; 
Button btn_mute; 
AudioManager mAudioManager; 
boolean mute; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_controllo_volume); 

    tb_mute = (ToggleButton) findViewById(R.id.tb_mute); 
    btn_mute = (Button) findViewById(R.id.btn_mute); 
    mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 

    if(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0){ 
     mute = true; 
     tb_mute.setChecked(mute); 
    }else{ 
     mute = false; 
     tb_mute.setChecked(mute); 
    } 

    } 

public void onButtonClicked(View view){ 
    if(!mute){ 
     mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true); 
     tb_mute.setChecked(true); 
     mute = true; 
    }else{ 
     mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, false); 
     tb_mute.setChecked(false); 
     mute = false; 
    } 
} 
+1

當你說「關閉」時,你的意思是說你的應用程序被銷燬或放在後臺?當您重新啓動應用程序時,getStreamVolume是否返回0? – Michael

回答

0

首先,謹防it's not recommended

爲了更好的用戶體驗,應用程序必須在的onPause(靜音靜音流 )和的onResume再次將其靜音()如果合適的話。

但我假設你知道你在做什麼,所以我們走了。

注意此線從所述文檔上setStreamMute

靜音命令針對客戶端進程死亡的保護:如果一個 過程與上一個流的有源靜音請求模具,這個流將 被自動取消靜音。

我檢查過我的設備,事實上,當我剛退出我的活動時,流保持靜音。但只要我殺了這個過程,靜音就會消失。 看看activity lifecycle。由於您當前的方法無法可靠運行,因此您可以編寫一個foreground service,這將觸發靜音 - 從您的活動中啓動該服務。 你也可能需要setStreamSolo

兩個重要東西。

  1. Volume==0muted不是同一回事。即流可以有體積== 0但不能靜音。雖然如果流靜音,音量將始終爲0
  2. 靜音請求是累積的。即如果您將靜音設置了兩次,則您必須取消靜音兩次 - 您的代碼無法處理該問題

請注意,對於此類應用程序,您可能希望使用小部件而不是活動。


偏離主題。似乎令人驚訝的是,很多人並不完全瞭解布爾值是如何工作的。 正如我看到的代碼,如你的regulary,這裏有點簡化重寫。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // ... setup just like you did 

    // boolean is just like any other type. You can assign not only 
    // constants, but expressions too 
    mute = (mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0); 
    tb_mute.setChecked(mute); 
} 

public void onButtonClicked(View view){ 
    mute = !mute; // invert value 
    mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, mute); 
    tb_mute.setChecked(mute); 
} 
+1

說,adjustStreamVolume的Android 6(API 23)的新API怎麼樣? 「setStreamMute」已棄用,建議使用adjustStreamVolume。自動還原音量是否仍然適用於應用程序被殺的時間?什麼改變了? –

+0

@androiddeveloper不知道,我還沒碰過Android一年左右 –

+0

哦。謝謝。 –