Так, я разобрался, и готов продемонстрировать свое решение этой проблемы посетителям Хабра. Тем более, что советов по данному вопросу здесь получено не было ( все-таки суббота, нормальные люди отдыхают).
Итак, обо всем по порядку:
Что я хотел сделать?
А хотел я сделать в своем приложении кнопку включения и выключения звука, которая при нажатии на нее отключает звук, а при повторном нажатии включает. Многие скажут, что такое лучше делать при помощи 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
Кнопка UNMUTE_btn:
id=
sound_play
В коде нашей деятельности (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-приложений. Свои предложения и варианты реализации можете писать ниже. Мой же код точно не тянет на лучшую реализацию, т.к. я не имею большой опыт разработки.