Как программно настроить громкость автомагнитолы — Android-приложение на JavaJAVA

Программисты JAVA общаются здесь
Anonymous
Как программно настроить громкость автомагнитолы — Android-приложение на Java

Сообщение Anonymous »

Я пишу приложение, которое предназначено для работы с автомобильным радио, и я хотел бы добавить функцию, позволяющую устанавливать громкость на определенный уровень, а точнее - приглушать ее из соображений безопасности при движении задним ходом.К сожалению, ни один из методов AudioManager, которые работают на моем телефоне, не работают на радио. Оба устройства работают на Android 10 (обновить радио невозможно). Модель автомобильного радио: uis8581 FYT.
Я проверил isVolumeFixed из библиотеки AudioManager, он возвращает false на обоих устройствах, однако мое приложение действует на радио, как если бы isVolumeFixed было правдой. Описание isVolumeFixed.
Что пробовали:

Код: Выделить всё

    private AudioManager am;
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setStreamVolume(AudioManager.STREAM_MUSIC, 2, 0);
и другой вариант:

Код: Выделить всё

    private AudioManager am;
am.setStreamVolume(AudioManager.STREAM_MUSIC, 2, 0);
На телефоне работает в обоих случаях, по радио не работает.
  • Код: Выделить всё

    AudioTrack.setVolume()
    и MediaPlayer.setVolume() согласно этому руководству, однако я не ожидал, что это сработает, поскольку приложение должно управлять системным звуком, а не воспроизводить музыку само по себе. Не работает.
  • Вызов ключевого намерения с помощью команд оболочки с помощью кода ниже:

Код: Выделить всё

    public void sudo(String command) {
try{
Process su = Runtime.getRuntime().exec("su");
DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

outputStream.writeBytes(command+"\n");
outputStream.flush();

outputStream.writeBytes("exit\n");
outputStream.flush();
try {
su.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
outputStream.close();
}catch(IOException e){
e.printStackTrace();
}
}

Код: Выделить всё

sudo("input keyevent X");

Код: Выделить всё

24 -->  "KEYCODE_VOLUME_UP"
25 -->  "KEYCODE_VOLUME_DOWN"
164 -->  "KEYCODE_MUTE"
Работает на обоих устройствах.

Код: Выделить всё

sudo("media volume --show --stream 3 --set 11");
Работает по телефону, не работает по радио.

Код: Выделить всё

sudo("am broadcast -a com.microntek.irkeyDown --ei keyCode 281");
Это должно уменьшить громкость. Не работает, однако я не ожидал, что это сработает, потому что на радио нет приложения/сервиса microntek. На всякий случай попробовал.
  • Приложения, предположительно позволяющие изменять громкость, в частности FCC Car Launcher согласно этому вопросу и тот: https://github.com/d51x/KaierUtils (также использует пакет android.tw.john.TWUtil, который, похоже, каким-то образом управляет громкостью). Оба приложения работают не так хорошо, как другие объемные приложения из Play Store.
  • Я просмотрел журналы. Из того, что мне удалось отфильтровать, появились следующие сообщения:

Код: Выделить всё

    15:25:40 AS.AudioService: setStreamVolume(stream=4, index=0, calling=com.syu.ms)
15:25:40 AS.AudioService: setStreamVolume(stream=3, index=25, calling=com.syu.ms)
15:25:40 AS.AudioService: setStreamVolume(stream=1, index=7, calling=com.syu.ms
(они были зарегистрированы несколько раз в течение одних и тех же миллисекунд)
и

Код: Выделить всё

15:25:40 soundMute: ================>>> volume value: 19
Это соответствует громкости, которую я установил с помощью физических кнопок.
Я заметил, что стандартный Android на телефоне имеет градацию от 1 до 25, а по радио - до 36.
Временное решение — использовать код клавиши отключения звука (164, вызываемый оболочкой) или определение текущей громкости с помощью AudioManager и уменьшать/увеличивать его с помощью цикла с использованием команд оболочки. Увы, оба варианта отображают ползунок: первый отключает громкость вместо того, чтобы приглушить ее, как предполагалось, а второй не мгновенный. Я ищу более элегантный способ. Любая помощь будет оценена по достоинству!

Подробнее здесь: https://stackoverflow.com/questions/787 ... pp-in-java

Вернуться в «JAVA»