Android:如何在后台听硬件键输入?

时间:2014-12-28 21:29:22

标签: java android android-service background-process

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

以下应用程序完全符合我的需要,当您激活它时,无论是否关闭,锁定等,您在一段时间后按住音量和电源按钮时都会拍摄一个屏幕截图。

https://play.google.com/store/apps/details?id=com.enlightment.screenshot&hl=en

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

代码:

这是我的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; }

0 个答案:

没有答案
相关问题