Отправьте дополнительные данные в объект Audio Manager, чтобы убедиться, что android.media.Приемник действия RINGER_MODE_CHANGED получает эту информацию

#android #android-audiomanager

#Android #android-audiomanager

Вопрос:

У меня есть широковещательный приемник, который прослушивает действие изменения режима звонка следующим образом:

 public class RingerModeStateChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("RECEIVER", "Ringer Change detected.");
    }
}
 

Объявление манифеста выглядит следующим образом:

 <receiver android:name=".receivers.RingerModeStateChangeReceiver" >
    <intent-filter>
        <action android:name="android.media.RINGER_MODE_CHANGED" />
    </intent-filter>
</receiver>
 

Мое приложение изменяет режим звонка, используя Audio Manager, как показано ниже:

 AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if(someCondition) {
   audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
} else {
   audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
}

 

Есть ли способ обнаружить изменение звонка, поступающее из Audio Manager (возможно, путем добавления дополнительного содержимого в объект audio Manager) в моем широковещательном приемнике?

Обновить:

Я решил эту проблему, используя 2 логические переменные, одна из которых представляет обновления, внесенные в RINGER какой-либо внешней силой, а другая представляет обновления, внесенные моим кодом. Первое значение по умолчанию равно true, а второе false. Последнее становится истинным только тогда, когда мой код собирается обновить Ringer.

Это позволяет широковещательному приемнику различать внешние и внутренние изменения, внесенные в звонок.

Хотя это все еще обходной путь, и я все еще не близок к поиску решения, внутреннего для системы Android (если оно вообще существует).

Комментарии:

1. Код успешно получает RINGER_MODE_CHANGED в onReceive, но вы пытаетесь отличить, когда режим звонка изменяется внутри вашего приложения, от того, когда он изменяется через внешний источник?

2. @Elletlar вы попали в самую точку. Это мой точный вариант использования. Мой код изменит статус звонка с помощью Audio Manager на основе некоторого условия. Также возможно, что пользователь изменит статус звонка с устройства. Затем я хотел бы знать, откуда произошли изменения в моем приемнике (действие RINGER_MODE_CHANGED). Любая помощь в этом отношении высоко ценится.

3. Вы можете указать дополнительную информацию в IntentFilter при регистрации получателя, но я не знаю ни одного способа заставить его передать какие-либо из этих данных обратно. Конечно, вы могли бы записать ожидаемый режим звонка и громкость. Если настройки соответствуют требованиям приложения, будет ли иметь какое-либо значение, если приложение или внешний источник изменили его?

4. Да, это имеет значение. Мое приложение изменит режим звонка в зависимости от нескольких условий. Например, в зависимости от текущего местоположения режим звонка может измениться (и эта проверка выполняется постоянно в какой-либо службе). Как следствие, я бы не знал, каким должен быть звонок. Что касается IntentFilter, я действительно пытался воспользоваться этим маршрутом, но так и не нашел возможности отправить дополнительные данные (есть ли какой-то конкретный метод?). Даже если он есть, как это поможет нам отличить внутренние обновления от внешних?

5. @Elletlar Чтобы добавить к моему предыдущему заявлению, в зависимости от того, кто изменил режим звонка, я бы / не стал предпринимать конкретные действия. Поэтому очень важно понимать, откуда происходят изменения.