Java 安卓:如何在后台收听硬件按键输入?
我正在开发一款应用程序,当音量键按下并保持一段时间后,它会触发警报。我进行了研究,似乎有些人声称不可能从服务中获得输入反馈,而另一些人则声称可以使用扩展的ContentObserver类或使用音乐媒体api,但我仍然无法让它工作 下面的应用程序正是我所需要的,当你激活它时,当你在一段时间后按住音量和电源按钮时,无论是否关闭、锁定等,它都会截屏 我的问题是如何使用服务类完成上述操作 代码: 这是我的ContentObserver类:Java 安卓:如何在后台收听硬件按键输入?,java,android,android-service,background-process,Java,Android,Android Service,Background Process,我正在开发一款应用程序,当音量键按下并保持一段时间后,它会触发警报。我进行了研究,似乎有些人声称不可能从服务中获得输入反馈,而另一些人则声称可以使用扩展的ContentObserver类或使用音乐媒体api,但我仍然无法让它工作 下面的应用程序正是我所需要的,当你激活它时,当你在一段时间后按住音量和电源按钮时,无论是否关闭、锁定等,它都会截屏 我的问题是如何使用服务类完成上述操作 代码: 这是我的ContentObserver类: int previousVolume; Context con
int previousVolume;
Context context;
public ContentListener(Context c, Handler handler) {
super(handler);
context=c;
AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
previousVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
}
@Override
public boolean deliverSelfNotifications() {
return super.deliverSelfNotifications();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
int delta=previousVolume-currentVolume;
if(delta>0)
{
Logger.log(Logger.LOG, "Volume Down");
previousVolume=currentVolume;
}
else if(delta<0)
{
Logger.log(Logger.LOG, "Volume Up");
previousVolume=currentVolume;
}
}
这就是你想要的我想你指的是不可能的答案?或者我可以创建一个由关键事件触发的活动(不确定这是否是我需要的事件,但我会尝试)。在任何情况下,我已经在使用第二个答案中的代码,所以我认为这不是我想要的。使用以下答案:
private ContentListener listener;
@Override
public void onCreate() {
Logger.log(Logger.LOG, "OnCreate");
listener = new ContentListener(this, new Handler());
getApplicationContext().getContentResolver().registerContentObserver(
android.provider.Settings.System.CONTENT_URI, true, listener);
}
@Override
public void onDestroy() {
Logger.log(Logger.LOG, "OnDestroy");
getApplicationContext().getContentResolver().unregisterContentObserver(listener);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) { return Service.START_STICKY; }
@Override
public IBinder onBind(Intent intent) { return null; }