Кнопка MUTE для Android-приложения?

Есть Activity, пытаюсь в методе onCreate() менять видимость (Visibility) некоторых View-элементов в зависимости от текущего уровня громкости в приложении.

Ниже несколько убогий код того, как я пытаюсь это сделать. Подозреваю, что я не понял принцип действия getStreamVolume (Я понял, что он возвращает текущее значение громкости).
int app_volume = 1;  

	         AudioManager audioManager2 = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
	    	 audioManager2.getStreamVolume(app_volume);

                 // Если громкость нулевая, то:
	    	  if(app_volume == 0){
	    	        MUTE_btn.setVisibility(View.INVISIBLE);
	    	        UNMUTE_btn.setVisibility(View.VISIBLE);
	    	  }
                  // Если нет, то:
	    	  else{
	    		MUTE_btn.setVisibility(View.INVISIBLE);
	     	        UNMUTE_btn.setVisibility(View.INVISIBLE); 
	    	  }



Кто-нибудь реализовывал что-либо похожее? поделитесь опытом?
  • Вопрос задан
  • 5591 просмотр
Пригласить эксперта
Ответы на вопрос 1
vikS
@vikS Автор вопроса
Так, я разобрался, и готов продемонстрировать свое решение этой проблемы посетителям Хабра. Тем более, что советов по данному вопросу здесь получено не было ( все-таки суббота, нормальные люди отдыхают).

Итак, обо всем по порядку:

Что я хотел сделать?

А хотел я сделать в своем приложении кнопку включения и выключения звука, которая при нажатии на нее отключает звук, а при повторном нажатии включает. Многие скажут, что такое лучше делать при помощи RadioButton, но я сделал это по-тупому по-своему при помощи двух элементов ImageView (в ходе изложения я буду называть их Button, т.к. ои по сути выполняют функцию кнопок), разумеется видимым в текущий момент времени на экране должен быть только один из этих View, в зависимости от того, какой уровень громкости установлен «ноль» или «больше ноля». При этом я хотел также учесть возможные манипуляции пользователя с качелькой громкости, чтобы не получилось такой ситуации: пользователь аппаратной кнопкой volume_up увеличил громкость, а на экране в данный момент доступна кнопка ее увеличения (хотя куда дальше увеличивать)… и наоборот.

Кодим:

Файл разметки содержит две кнопки: stop_sound (которую пользователь должен видеть, когда громкость не равна нулю, т.е. что-то играет) и кнопка play_sound (которую пользователь должен видеть, когда громкость равна нулю, т.е. ничего не играет)
      <ImageView
        android:id="@+id/stop_sound"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:background="@drawable/sound_on"
         />

    <ImageView
        android:id="@+id/play_sound"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:background="@drawable/sound_off"
         />


Вот так эти View выглядят по отдельности (Рисовал их сам в AdobeFlash):
Кнопка MUTE_btn:
id=sound_stop
image
Кнопка UNMUTE_btn:
id=sound_play
image

В коде нашей деятельности (Activity) пишем следующее:

    private ImageView MUTE_btn;    // Кнопка MUTE   (уменьшения громкости до нуля во всем приложении)
    private ImageView UNMUTE_btn;  // Кнопка UNMUTE (увеличения громкости почти до max во всем приложении)

    @Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
	      
	     // Кнопка при нажатии, на которую громкость в приложении станет НУЛЕВОЙ (MUTE_btn).
	     // Сама кнопка станет невидимой, а ВИДИМОЙ станет кнопка ВКЛючения звука (UNMUTE_btn).   

	        MUTE_btn = (ImageView)this.findViewById(R.id.stop_sound); 
	      
	        MUTE_btn.setOnClickListener(new OnClickListener(){
	               public void onClick(View v) {
	                    	  AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
	                    	  audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
	                    	  MUTE_btn.setVisibility(View.INVISIBLE);
	                    	  UNMUTE_btn.setVisibility(View.VISIBLE);
	               }
	        });

	     // Кнопка при нажатии, на которую громкость в приложеии станет почти MAX (UNMUTE_btn).
	     // Сама кнопка станет невидимой, а ВИДИМОЙ станет кнопка ВЫКЛючения звука (MUTE_btn).    

	        UNMUTE_btn = (ImageView)this.findViewById(R.id.play_sound);

	        UNMUTE_btn.setOnClickListener(new OnClickListener(){
	               public void onClick(View v) {
	                    	  AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
	                    	  audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 90, 90);
	                    	  MUTE_btn.setVisibility(View.VISIBLE);
	                    	  UNMUTE_btn.setVisibility(View.INVISIBLE);
	               }
	        });  
	        
        // Установка видимости соответствующих кнопок при запуске Activity
	  int app_volume;  

	         AudioManager audioManager2 = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
	         app_volume = audioManager2.getStreamVolume(AudioManager.STREAM_MUSIC); // вот тут у меня и была ошибка

	    	  if(app_volume == 0){
	    		 MUTE_btn.setVisibility(View.INVISIBLE);
	    	         UNMUTE_btn.setVisibility(View.VISIBLE);
	    	  }
	    	  else{
	    		MUTE_btn.setVisibility(View.VISIBLE);
	     	        UNMUTE_btn.setVisibility(View.INVISIBLE); 
	    	  } 
	     	  
	}    

      // А теперь займемся аппаратными кнопками volume_up и volume_down

       @Override
	public boolean onKeyUp(int keyCode, KeyEvent event){

          // при нажатии на кнопку громкости вверх, смена видимости соответствующих кнопок 

	    if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){

	    	     MUTE_btn.setVisibility(View.VISIBLE);
	    	     UNMUTE_btn.setVisibility(View.INVISIBLE);
	             return true;

                }
	    
	  // при нажатии на кнопку громкости вниз, смена видимости соответствующих кнопок   

	    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){

           //  заметьте, тот же код, что и в методе on Create, т.к. необходимо, чтобы фон кнопки менялся только
           // при достижении нулевого уровня громкости

	    	int app_volume;
	             AudioManager audioManager2 = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
		     app_volume = audioManager2.getStreamVolume(AudioManager.STREAM_MUSIC);
		    
		    if(app_volume == 0){

	    		   MUTE_btn.setVisibility(View.INVISIBLE);
	    	           UNMUTE_btn.setVisibility(View.VISIBLE);

	    	  }
	    	  else{

	    		 MUTE_btn.setVisibility(View.VISIBLE);
	     	         UNMUTE_btn.setVisibility(View.INVISIBLE); 

	    	  };  

	          return true;
                }    
	}




Итог:
Вуаля, все работает как надо (Проверено на моем GalaxyNexus). Теперь, если пользователь захочет он может изменять громкость нажатием на разработанную нами «кнопку», изображение которой будет оповещать о наличии или отсутствии звука. А если вдруг, пользователь будет изменять громкость аппаратными клавишами, то и в этом случае изображение кнопки будет соответствовать ситуации.

Надеюсь, описанное выше сможет кому-нибудь помочь в непростом деле разработки Android-приложений. Свои предложения и варианты реализации можете писать ниже. Мой же код точно не тянет на лучшую реализацию, т.к. я не имею большой опыт разработки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы