我正在使用AccessibilityService OnKeyEvent来捕获Headsethook。这样我就可以在键盘上触发事件,并按下键,即使我的应用程序没有成为焦点。
然而,一旦屏幕熄灭,它就不起作用。有没有办法解决这个问题?
答案 0 :(得分:1)
AccessibilityService
将无效。为了实现在断电时捕获KeyEvent
的努力,您应该使用其他替代方案。
如果您只想抓住HEADSETHOOK
,可以使用MediaButtonIntentReceiver
代替AccessibilityService
:注册BroadcastReceiver
以获得ACTION_MEDIA_BUTTON
意图,这样可以抓住1}}和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
听取焦点变化并重新注册。
如果您还想在后台捕获其他密钥。据我所知,root是一个正确的解决方案。您可以使用AudioFocusChangeListener
命令捕获输入设备的所有日志流。然后触发所需密钥的日志。