我正在使用AccessibilityService OnKeyEvent捕获HeadSetHook。这是这样的,我可以触发一个事件上键,下键,即使我的应用程序它不在焦点。
但是,一旦屏幕熄灭,它就不起作用了。这有什么办法吗?
当屏幕关闭时,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
命令捕获输入设备的所有日志流。然后触发所需密钥日志。