提问者:小点点

关闭屏幕的AccessibilityService OnKeyEvent


我正在使用AccessibilityService OnKeyEvent捕获HeadSetHook。这是这样的,我可以触发一个事件上键,下键,即使我的应用程序它不在焦点。

但是,一旦屏幕熄灭,它就不起作用了。这有什么办法吗?


共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命令捕获输入设备的所有日志流。然后触发所需密钥日志。