Задать вопрос
  • Кнопка MUTE для Android-приложения?

    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-приложений. Свои предложения и варианты реализации можете писать ниже. Мой же код точно не тянет на лучшую реализацию, т.к. я не имею большой опыт разработки.
    Ответ написан
    Комментировать
  • Интерфейс для мобильной HTML5 игры

    vikS
    @vikS
    По дизайну различных элементов для игр, многое можно посмотреть здесь
    Ответ написан
    Комментировать
  • Управление музыкой в Android-приложении?

    vikS
    @vikS Автор вопроса
    А разве без Service никак не сделать? используя только MediaPlayer?
    Ответ написан
  • Автономный Arduino-квадракоптер, управляемый по GPS?

    vikS
    @vikS Автор вопроса
    Т.е предлагаете просчитать маршрут на «Земле», а в квадрокоптер загрузить траекторию из точек?
    Ответ написан