AccessibilityService OnKeyEvent с выключенным экраном

Я использую AccessibilityService OnKeyEvent для захвата Headsethook. Это делается для того, чтобы я мог инициировать событие при нажатии и отпускании клавиши, даже если мое приложение не находится в фокусе.

Однако это не работает, когда экран гаснет. Есть ли способ обойти это?


person FlappySocks    schedule 24.12.2014    source источник


Ответы (1)


AccessibilityService не будет работать при выключенном экране. поэтому для достижения усилия, которое ловит KeyEvent при отключении питания, вам следует использовать другие альтернативы.

если вы хотите поймать только HEADSETHOOK, вы можете использовать MediaButtonIntentReceiver вместо AccessibilityService: зарегистрируйте BroadcastReceiver для получения намерения ACTION_MEDIA_BUTTON, чтобы можно было ловить KEYCODE_MEDIA_* и KEYCODE_HEADSETHOOK в фоновом режиме, даже когда экран выключен.

AndroidManifest.xml

<receiver android:name="com.exmaple.MediaButtonReceiver"><intent-filter >
    <action android:name="android.intent.action.MEDIA_BUTTON"></action>  
</intent-filter></receiver>

MediaButtonReceiver.java

...
public void onReceive(Context context, Intent intent) {
    ...
    KeyEvent keyEvent = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
    if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
        int keyCode = keyEvent.getKeyCode();
        switch (keyCode) {
        case KeyEvent.KEYCODE_HEADSETHOOK:
            ...
        }
    }
    ...
}

если вы не хотите, чтобы другое приложение перехватывало HEADSETHOOK, вы должны использовать AudioManager для его регистрации:

...
AudioManager mAudioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
ComponentName  mbCN = new ComponentName(getPackageName(),MediaButtonIntentReceiver.class.getName());  
mAudioManager.registerMediaButtonEventReceiver(mbCN);
... 
//mAudioManager.unregisterMediaButtonEventReceiver(mbCN);
...  

примечание: большинство приложений музыкальных проигрывателей также используют MediaButton, когда они регистрируют приемник MediaButton, ваше приложение потеряет фокус AudioManager, поэтому вам, возможно, следует использовать AudioFocusChangeListener, чтобы прослушать изменение фокуса и перерегистрировать.

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

person CrazyBoyFeng    schedule 19.11.2015