Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓:如何在后台收听硬件按键输入?_Java_Android_Android Service_Background Process - Fatal编程技术网

Java 安卓:如何在后台收听硬件按键输入?

Java 安卓:如何在后台收听硬件按键输入?,java,android,android-service,background-process,Java,Android,Android Service,Background Process,我正在开发一款应用程序,当音量键按下并保持一段时间后,它会触发警报。我进行了研究,似乎有些人声称不可能从服务中获得输入反馈,而另一些人则声称可以使用扩展的ContentObserver类或使用音乐媒体api,但我仍然无法让它工作 下面的应用程序正是我所需要的,当你激活它时,当你在一段时间后按住音量和电源按钮时,无论是否关闭、锁定等,它都会截屏 我的问题是如何使用服务类完成上述操作 代码: 这是我的ContentObserver类: int previousVolume; Context con

我正在开发一款应用程序,当音量键按下并保持一段时间后,它会触发警报。我进行了研究,似乎有些人声称不可能从服务中获得输入反馈,而另一些人则声称可以使用扩展的ContentObserver类或使用音乐媒体api,但我仍然无法让它工作

下面的应用程序正是我所需要的,当你激活它时,当你在一段时间后按住音量和电源按钮时,无论是否关闭、锁定等,它都会截屏

我的问题是如何使用服务类完成上述操作

代码:

这是我的ContentObserver类:

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; }