2012-10-27 33 views
5

Müzik akışını AudioManager sınıfını kullanarak sesini kısarak/sesini açan küçük bir uygulama geliştirdim. Aslında, uygulamayı kapatıncaya kadar çalışır. Yani, çıtırtıyı susturdum, uygulamayı kapatıyorum, uygulamayı yeniden başlatıyorum ve düğme akışı artık açmıyor. İnternette arama yaptım ama hiç kimse bu problemle karşılaşmamış gibi görünüyor.) (Android'de dinleme akışları

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

"Kapat" derken, uygulamanızın yok edildiğini mi yoksa sadece arka plana mı eklendiğini mi kastediyorsunuz? Uygulamayı yeniden başlattığınızda getStreamVolume 0 döndürüyor mu? – Michael

cevap

0

Öncelikle, uygulamalar OnPause (bir sessiz akışı sesini) ve onResume içinde tekrar kapatmak GEREKİR daha iyi bir kullanıcı deneyimi için it's not recommended

dikkat: Burada

kod bu Eğer uygunsa.

Ama ne yaptığınızı bildiğini sanıyorum, işte başlıyoruz.

Not setStreamMute

kapatma komutu istemci işlemi ölüme karşı korunmaktadır dokümanlar bu hat: akışı etkin bir kapatma talebi ile işlem ölürse, bu akım otomatik sesi tekrar olacaktır.

Aygıtımı kontrol ettim ve gerçekten, yalnızca etkinliğimden çıktığımda, akış sesin kesiliyor. Ama süreci öldürürdüğümde, dilsiz gider. activity lifecycle'a bir göz atın.

Şu anki yaklaşımınız güvenilir şekilde çalışmayacağından, sesi kapatmayı başaran foreground service yazabilirsiniz - bu hizmeti etkinliğinizden başlatın. Ayrıca muhtemelen setStreamSolo'a da gereksinim duyarsınız.

Önemli şeyler.
  1. Volume==0 ve muted aynı şey DEĞİLDİR. Yani Akış, == 0 birimine sahip olabilir, ancak sesini kapatmayın. Akış sessizse, birim her zaman 0
  2. sessiz istekleri birikimli olacaktır. Yani iki kez dilsiz kurduğunuz takdirde, siz de iki kez sesini olmalıdır - kodunuzu Bir yan not olarak

, böyle bir uygulama için muhtemelen Widget yerine aktivitenin kullanmak isteyeceği işlemez.

Konu dışı. Şaşırtıcı bir şekilde, pek çok insan booleanların nasıl çalıştığını tam olarak anlamıyor. Ve sizinki gibi kodları düzenli görüyorum, burada biraz akıcı yeniden yazma.

@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

De, adjustStreamVolume için yeni Android 6 API'sı (API 23) nedir? "SetStreamMute", kullanımdan kaldırılmıştır ve adjustStreamVolume kullanımı önerilir. Uygulama öldürülürken ses düzeyinin otomatik olarak geri yüklenmesi hala işe yarıyor mu? Ne değişti? –

+0

@androiddeveloper bilmiyorum, Android'e bir yıl boyunca dokunmadım –

+0

oh tamam. teşekkür ederim. –