Глобальное прослушивание нажатий аппаратных кнопок, когда телефон заблокирован - PullRequest
0 голосов
/ 30 октября 2018

Существует много связанной информации, но я изо всех сил пытаюсь найти четкий ответ на эту конкретную проблему.

Я хотел бы разработать приложение, которое всегда слушает аппаратные кнопки громкости. Ему не нужно менять громкость, ему нужно только знать, когда нажимаются кнопки регулировки громкости, и это нужно делать независимо от того, в каком состоянии находится телефон (заблокировано, разблокировано, приложение в фокусе, приложение не в фокусе).

До сих пор я только смог найти, как сделать это с приложением в фокусе. Код здесь:

import android.content.Context;
import android.media.AudioManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    String message = "This is a text box.";
    int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = findViewById(R.id.textView);
        textView.setText(message);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){
            message += "Volume pressed " + count + "\n";
            TextView textView = findViewById(R.id.textView);
            textView.setText(message);
            count += 1;
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

}

Возможное решение A

Я видел людей, предлагающих сделать это с помощью приложения, не сфокусированного, прислушиваясь к изменению громкости, однако этого недостаточно. Если пользователь нажимает вверх-вниз, то изменение громкости было равно 0. Кроме того, нажатие вниз-вверх-вниз также приведет к 0, что означает, что я не могу отличить эти два паттерна. Мне нужно записать точный шаблон.

Возможное решение B

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

Возможное решение C

Я вижу, что один из способов «всегда» прослушивать нажатия громкости - это заставить приложение воспроизводить мультимедиа (файл молчания, поскольку это не приложение для воспроизведения звука), но это будет прерывать воспроизведение музыки пользователем, а также добавить накладные расходы, которые мне не нужны. Так что это возможно, но было бы неплохо избежать такого подхода. С этой же точки зрения я не хочу использовать «медиа-сессию», потому что это будет мешать пользователю использовать другой звук.

Оптимальный результат

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

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

...