onKeyDown在服务中? (全球热键)
我基本上试图实现的是自定义全局热键,换言之,当我按下某些按钮时,无论当前哪个程序在最前面,都会发生这种情况。
我假设需要一项服务。onKeyDown在服务中? (全球热键)
我有一个快速和肮脏的测试,只是告诉我什么被按下,如果它是活动窗口将工作。
public boolean onKeyDown(int keyCode, KeyEvent event) {
char pop;
pop = (char)event.getUnicodeChar();
Toast.makeText(this, Character.toString(pop) , Toast.LENGTH_SHORT).show();
return super.onKeyDown(keyCode, event);
}
但很明显,如果我改变窗口或进入文本框它不起作用。如果我将它直接粘贴到一个服务(或一个imputmethodservice)中并启动所述服务,则不会发生任何事情。 (需要一些权限?) 任何建议,我哪里出错了?或者更好地捕获哪个按钮被按下?
谢谢!
你不能做到这一点:)
即使在一个可访问性应用程序?没有办法对服务中的按钮或软键进行响应? – amfcosta 2013-02-21 11:44:30
@罗曼盖伊 - 先生,如果在家中按下我想设置屏幕呢?三星note II将如何做? – 2014-03-12 08:27:01
@Romain - 精心制作 - 谢谢 – 2014-07-31 14:54:59
这需要棒棒堂(V5.0/API 21)或更高
我的目标是调整从服务系统卷,所以这只会侦听摇杆。任何行动都可以在新闻界采取。
它将覆盖音量键操作,因此可能不希望全局使用它。
public class VolumeKeyController {
private MediaSessionCompat mMediaSession;
private final Context mContext;
public VolumeKeyController(Context context) {
mContext = context;
}
private void createMediaSession() {
mMediaSession = new MediaSessionCompat(mContext, KeyUtil.log);
mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mMediaSession.setPlaybackState(new Builder()
.setState(PlaybackStateCompat.STATE_PLAYING, 0, 0)
.build());
mMediaSession.setPlaybackToRemote(getVolumeProvider());
mMediaSession.setActive(true);
}
private VolumeProviderCompat getVolumeProvider() {
final AudioManager audio = mContext.getSystemService(Context.AUDIO_SERVICE);
int STREAM_TYPE = AudioManager.STREAM_MUSIC;
int currentVolume = audio.getStreamVolume(STREAM_TYPE);
int maxVolume = audio.getStreamMaxVolume(STREAM_TYPE);
final int VOLUME_UP = 1;
final int VOLUME_DOWN = -1;
return new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE, maxVolume, currentVolume) {
@Override
public void onAdjustVolume(int direction) {
// Up = 1, Down = -1, Release = 0
// Replace with your action, if you don't want to adjust system volume
if (direction == VOLUME_UP) {
audio.adjustStreamVolume(STREAM_TYPE,
AudioManager.ADJUST_RAISE, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
}
else if (direction == VOLUME_DOWN) {
audio.adjustStreamVolume(STREAM_TYPE,
AudioManager.ADJUST_LOWER, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
}
setCurrentVolume(audio.getStreamVolume(STREAM_TYPE));
}
};
}
// Call when control needed, add a call to constructor if needed immediately
public void setActive(boolean active) {
if (mMediaSession != null) {
mMediaSession.setActive(active);
return;
}
createMediaSession();
}
// Call from Service's onDestroy method
public void destroy() {
if (mMediaSession != null) {
mMediaSession.release();
}
}
}
hiii 如果你有这个解决方法,然后plz让我knw。 – 2012-02-13 08:08:56
@Vincent Romain Guy在Android团队工作,他说这是[不可能](http://*.com/a/3455094/942821)。和Fizz,你能接受Romain的回答吗? – 2012-07-09 14:51:56
可能的重复[是否有可能创建一个监听硬件按键的Android服务?](http://*.com/questions/2986337/is-it-possible-to-create-an-android-service-即听 - 硬件密钥压力) – isalgueiro 2015-02-20 12:20:37