2015-04-06 4 views
3

То, что я пытаюсь сделать, заключается в том, чтобы улавливать кнопки увеличения и уменьшения громкости на lockscreen на Android 4.4.Обработка смены объема на экране блокировки Android?

Google Cast Design Checklist документ описывает требование блокировки экрана «Обеспечить доступ к регулятору громкости с помощью аппаратных кнопок». Я пробовал различные способы обработки кнопок аппаратного тома на экране блокировки, но никто из них не работал.

  1. OnKeyDown/dispatchKeyEvent - Я попытался переопределить OnKeyDown, а также методы dispatchKeyEvent на активность, но ни один из них не выполняются на заблокированном экране, эти только работает, когда мое приложение ориентирована.

  2. Settings.System.CONTENT_URI/ContentObserver - Регистрация наблюдателя контента на распознавателе контента основного вида деятельности в это поймать настройки системы изменения, но это также не происходит на заблокированном экране.

  3. android.intent.action.MEDIA_BUTTON - Имея этот фильтр в манифесте, я могу получить воспроизведения/паузы действия с экрана блокировки, однако никаких изменений объема событий.

  4. android.media.VOLUME_CHANGED_ACTION - Имея этот фильтр в манифесте, это событие получило в моем BroadcastReceiver, к сожалению, его дополнительные значения не изменятся на заблокированном экране. Когда я нажимаю кнопку регулировки громкости, возвращаемый файл android.media.EXTRA_VOLUME_STREAM_VALUE остается тем же (то есть всегда 1), даже если действие CHANGED принимается моим широковещательным приемником.

  5. CastVideos-андроид - приложение ссылки андроида отправителя кажется, чтобы иметь возможность контролировать громкость приемника, даже если приободрить отправитель блокировку экрана, однако даже после ввода breakpoitns повсюду вокруг Cast.CastApi.setVolume() , их не собирают. Таким образом, кажется, что команда отправляется в приемник откуда-то, куда я не могу найти.

Я могу также увидеть некоторые другие приложения в состоянии поймать HW клавишу регулировки громкости, т.е. Play Music приложения. Поэтому мое устройство, безусловно, способно ...

Может ли кто-нибудь предложить любое рабочее решение?

+1

Для CastVideos-Android, он обрабатывается в CastCompanionLibrary. Я считаю, что [VideoCastManager] (https://github.com/googlecast/CastCompanionLibrary-android/blob/master/src/com/google/android/libraries/cast/companionlibrary/cast/VideoCastManager.java). – Andy

ответ

1

В конце концов, это оказалось мне не хватает одной строки кода:

MediaRouter.getInstance(context).addRemoteControlClient(remoteControlClient); 

или

MediaRouter.getInstance(activity).setMediaSession(session.getMediaSession()); 

здесь некоторый код из моей реализации для 4.0+:

import android.media.AudioManager; 
import android.media.RemoteControlClient; 
import android.support.v7.media.MediaRouter; 

remoteControlClient = new RemoteControlClient(pendingIntent); 
remoteControlClient.setTransportControlFlags(RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE); 

audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
audioManager.registerMediaButtonEventReceiver(receiver); 
audioManager.registerRemoteControlClient(remoteControlClient); 

MediaRouter.getInstance(context).addRemoteControlClient(remoteControlClient); 

и для 5.0+:

import android.media.AudioManager; 
import android.support.v4.media.session.MediaSessionCompat; 
import android.support.v7.media.MediaRouter; 

session = new MediaSessionCompat(activity, TAG); 
session.setPlaybackToLocal(AudioManager.STREAM_MUSIC); 

MediaRouter.getInstance(activity).setMediaSession(session.getMediaSession()); 

Интересно то, есть некоторая черная магия, которая регулирует громкость приемника внутри и собственный Cast.CastApi.setVolume() вызов не участвует на всех

2

Вам либо нужно использовать RemoteControlClient (на предварительном леллипопе) или MediaSession, который представлен недавно. Например, посмотрите на метод CastCompanionLibrary, VideoCastManager#setUpRemoteControl(), где RCC зарегистрирован в MediaRouter. Если вы используете MediaSession, вам необходимо зарегистрировать MediaSession с MediaRouter.

+0

спасибо, что указали мне правильное направление, мне нужно было вызвать 'mediaRouter.addRemoteControlClient()' действительно – Yoz

Смежные вопросы