Захват нажатия клавиш, когда телефон Android работает в глубоком спящем режиме

описание проблемы

Я пытаюсь написать приложение, которое будет захватывать кнопки увеличения и уменьшения громкости, а также кнопки Bluetooth Headset, когда приложение находится в

  • Задний план
  • передний план
  • Фон и телефон находятся в спящем режиме (кнопка питания нажата)
  • Передний планшет и телефон находятся в спящем режиме (нажата кнопка питания)

Для первых двух точек я пишу какое-то тестовое приложение, и все работает в моем случае, я отправляю приложение на задний план и нажимаю громкость вверх / вниз, и мое приложение улавливает эти события. После того, как я нажму кнопку питания, и мой телефон перейдет в спящий режим. Затем я нажимаю кнопки громкости вверх / вниз, телефон не реагирует на эти события, и я не вижу никакого loge в logcat, как и все прекратить работу.

Приложения, которые обнаруживают нажатия клавиш в спящем режиме.

Я думаю, что эта проблема не может быть решена, но потом я помню, что Android Media Media Player улавливает эти события, когда вы нажимаете кнопки увеличения и уменьшения громкости во время воспроизведения музыки. Я думаю, что это приложение может сделать это, поскольку оно является системным приложением, но затем я загружаю проигрыватель Winpm, и он работает одинаково. Winapm увеличивает громкость при переходе в режим ожидания. И приложения для музыкальных плееров это делают.

Вопрос

Я хочу понять, как это можно сделать? Как я могу написать простое приложение, которое будет захватывать кнопки увеличения / уменьшения громкости. Нужно ли мне играть какую-то музыку в это время, или я могу это сделать? Я имею в виду, может быть, главная причина, по которой Winamp и другие приложения поймают это событие, – это то, что музыка играет в то время. Или, может быть, эта проблема не может быть решена, и если она не может быть решена, я хочу знать, почему? Мне нужны некоторые аргументы, почему это невозможно решить.

Исходный код

Я тестировал какое-то приложение, и вот результаты, я пишу простое приложение, которое улавливает громкость вверх и вниз при нажатии клавиш в фоновом режиме и переднем плане, а также когда приложение находится в спящем режиме. Все работает идеально, когда приложение было в фоновом режиме и на поле, мое тестовое приложение захватывает события, но когда я нажимаю кнопку питания, это перестает это делать, затем я нажимаю на медиаплеер и начинаю играть какую-то музыку после нажатия кнопки питания Снова, а затем нажмите кнопку увеличения громкости и doun, а моя статистика приложения будет увеличивать громкость вверх и вниз . Это означает, что тогда музыка играет мое приложение может поймать эти события, поэтому мой следующий вопрос, как я могу симулировать, как мой телефон играет somem музыку? Может быть, это решение?

manifest.xml

<receiver android:name="com.vito.backgroundworker.VolumeBroadcast" android:enabled="true"> <intent-filter> <action android:name="android.media.VOLUME_CHANGED_ACTION" /> </intent-filter> </receiver> <receiver android:name="RemoteControlReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> 

MainActivity.java

 public class MainActivity extends Activity { private PowerManager.WakeLock wl; //private BroadcastReceiver vol = new VolumeBroadcast(); private AudioManager mAudioManager; private ComponentName mRemoteControlResponder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen"); mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); mRemoteControlResponder = new ComponentName(getPackageName(), RemoteControlReceiver.class.getName()); } @Override protected void onPause() { super.onPause(); mAudioManager.registerMediaButtonEventReceiver( mRemoteControlResponder); wl.release(); }//End of onPause @Override protected void onResume() { super.onResume(); wl.acquire(); }//End of onResume @Override public void onDestroy() { super.onDestroy(); mAudioManager.unregisterMediaButtonEventReceiver( mRemoteControlResponder); } } 

Solutions Collecting From Web of "Захват нажатия клавиш, когда телефон Android работает в глубоком спящем режиме"

Посмотрите на registerMediaButtonEventReceiver () . Вы должны зарегистрировать свое приложение в качестве получателя этих событий, чтобы иметь возможность получить их.

Вот еще несколько ссылок, на которые вы должны обратить внимание:

По моему опыту, приложение не может получать трансляции медиа-кнопок, когда устройство спит, даже если это функция переднего плана (кнопка мультимедиа не разбудит ее). Удерживание частичного следящего замка предотвращает его сон, так что нажатие кнопки обнаружено. Я подозреваю, что ваше приложение для игры в музыку держит блокировку следа, и именно поэтому она работает. Я хотел бы быть доказанным неправильно и не нуждаюсь в блокировке следа, хотя …

Я нашел приложение с открытым исходным кодом, которое действительно пробуждает телефон от сна, нажав кнопку регулировки громкости. https://github.com/praslnx8/volume_Screen_Lock

Это приложение использует Службу для воспроизведения медиа.

Во время воспроизведения мультимедиа действие кнопки громкости будет всегда отправляться соответствующему приемнику, даже если экран телефона заблокирован …