3

我正在使用 AccessibilityService OnKeyEvent 来捕获耳机。这样即使我的应用程序不在焦点上,我也可以在上键和下键时触发事件。

但是,一旦屏幕熄灭,它就不起作用。有没有办法解决?

4

1 回答 1

3

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命令捕获输入设备的所有日志流。然后触发想要的键的日志。

于 2015-11-19T15:40:00.430 回答