2012-10-23 29 views
7

więc na moich urządzeniach 2.3, można odtwarzać dźwięk z SoundPool lub MediaPlayer przy maksymalnej głośności, nawet jeśli wielkość urządzenia jest ustawiony na 0/mute. Rozumiem, że trzeba ręcznie uzyskać poziom urządzenia i ustawić go podczas odtwarzania dźwięku.odtwarzania dźwięków niezależnie od poziomu głośności urządzenia

Oto jak chcę, aby to zachowanie działało.

Jednak teraz zauważyć na moim urządzeniu 4.0, że dźwięki są automatycznie odtwarzane przy ustawionym poziomie urządzenia, które nie chcę!

Czy to różnica między wersjami systemu operacyjnego? Jeśli tak, czy istnieje sposób na zignorowanie głośności urządzeń? Więc nawet jeśli jest wyciszony, mogę odtwarzać dźwięk i być słyszanym?

Nie mogę zrozumieć, dlaczego potrzebuję tej funkcji, ale naprawdę to robię.

Dzięki!

+0

Czuję, że naprawdę powinieneś wyjaśnić, dlaczego MUSISZ mieć tę funkcję. Jedyne, co przychodzi mi do głowy, to jakaś zagubiona aplikacja do lokalizacji telefonu. – cost

+0

Naprawdę nie mogę. Podpisałem umowę NDA na ten projekt, ale jest to ważna cecha. Jeśli nie mogę wymusić dźwięku, aby zignorować poziomy głośności systemu, mam do zrobienia kilka poważnych zmian. – romamnmlst

Odpowiedz

13

Miałem podobne zapotrzebowanie na aplikację z budzikiem. Oto odpowiedni kod z komentarzami dotyczącymi objętości.

To działa na moim telefonie HTC Rezound Android w wersji 4.0.3, gdy profil dźwiękowy jest wyciszony, gdy głośność strumienia alarmowego jest ręcznie ustawiona na zero, a głośność dzwonka jest ustawiona na zero.

Context context; 
    MediaPlayer mp; 
    AudioManager mAudioManager; 
    int userVolume; 


    public AlarmController(Context c) { // constructor for my alarm controller class 
     this.context = c; 
     mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 

     //remeber what the user's volume was set to before we change it. 
     userVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM); 

     mp = new MediaPlayer(); 
    } 
    public void playSound(String soundURI){ 

     Uri alarmSound = null; 
     Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 


     try{ 
      alarmSound = Uri.parse(soundURI); 
     }catch(Exception e){ 
      alarmSound = ringtoneUri; 
     } 
     finally{ 
      if(alarmSound == null){ 
       alarmSound = ringtoneUri; 
      } 
     } 



     try { 

      if(!mp.isPlaying()){ 
      mp.setDataSource(context, alarmSound); 
      mp.setAudioStreamType(AudioManager.STREAM_ALARM); 
      mp.setLooping(true); 
      mp.prepare(); 
      mp.start(); 
      } 


     } catch (IOException e) { 
      Toast.makeText(context, "Your alarm sound was unavailable.", Toast.LENGTH_LONG).show(); 

     } 
     // set the volume to what we want it to be. In this case it's max volume for the alarm stream. 
     mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), AudioManager.FLAG_PLAY_SOUND); 

    } 

    public void stopSound(){ 
// reset the volume to what it was before we changed it. 
     mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, userVolume, AudioManager.FLAG_PLAY_SOUND); 
     mp.stop(); 
     mp.reset(); 

    } 
    public void releasePlayer(){ 
     mp.release(); 
    } 
+0

Dziękuję bardzo za to ... idealnie! – romamnmlst

+0

thnx zaoszczędzisz mi dużo czasu! – mhdjazmati

0

Łatwy i alternatywny sposób odtwarzania muzyki z folderu raw;

try { 
     String uri = "android.resource://" + getPackageName() + "/" + R.raw.beep; 
     //Strign uri = "http://bla-bla-bla.com/bla-bla.wav" 
     Uri notification = Uri.parse(uri); 
     Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
     r.play(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
Powiązane problemy