如何挂钩Android中的电源按钮?

Lar*_*s D 30 android

在Android设备上,只有按钮是音量按钮和电源按钮,我想让应用程序对按下电源按钮(长和短)做出反应.这是怎么做到的?

JT.*_*JT. 41

现有的答案并没有完全回答这个问题,并且遗漏了足够的细节,如果没有更多的调查它们将无法运作.我会分享我学到的解决这个问题的方法.

首先,您需要向清单文件添加以下权限:

<uses-permission android:name="android.permission.PREVENT_POWER_KEY" />
Run Code Online (Sandbox Code Playgroud)

要处理短期和长期印刷机,请在活动类中添加以下覆盖:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_POWER) {
        // Do something here...
        event.startTracking(); // Needed to track long presses
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_POWER) {
        // Do something here...
        return true;
    }
    return super.onKeyLongPress(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)

注意:值得注意的是onKeyDown()会在onKeyLongPress执行之前多次触发,因此您可能希望触发onKeyUp()或其他逻辑,以防止在用户真正按住它时对一系列onKeyDown()调用进行操作.

我认为下一部分仅适用于Cyanogenmod. 如果 PREVENT_POWER_KEY 常量未定义,那么您不应该需要它.

要开始拦截电源键,您需要在活动中设置以下标志:

getWindow().addFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY);
Run Code Online (Sandbox Code Playgroud)

要停止拦截电源键(允许标准功能):

getWindow().clearFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY);
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以在程序中反复在两种模式之间来回切换.

  • 这适用于所有API版本吗?我尝试API 8和15,并且LayoutParams中没有PREVENT_POWER_KEY参数.你可以在这里看看这个参数的价值吗? (4认同)
  • 只有cyanogenmod需要PREVENT_POWER_KEY.显然,在过去的几年中,Android已经取消了捕获电源键的能力.当按下电源键时,这种方法可能适合任何需要做某事的人的需求:http://stackoverflow.com/questions/7682016/android-listen-for-power-key-press?rq=1 (4认同)
  • onKeyDown仅在长按事件发生时起作用,实际上onKeyLongPress永远不会被电源按钮触发,至少在摩托罗拉Droid X2上是这样. (3认同)
  • @JPM,@ JT.:完全相同的问题(Galaxy Note,ICS):onKeyDown仅在长按事件发生时起作用,实际onKeyLongPress永远不会被触发.此外,清单中的"uses-permission"不会阻止电源按钮. (2认同)
  • 我看不到你上面提到的许可,这里没有列出http://developer.android.com/reference/android/Manifest.permission.html (2认同)

Lar*_*s D 8

解:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {
        Intent i = new Intent(this, ActivitySetupMenu.class);
        startActivity(i);
        return true;
    }

    return super.dispatchKeyEvent(event);
}
Run Code Online (Sandbox Code Playgroud)


Cri*_*ian 5

在您的活动中添加:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {
        // do what you want with the power button
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)

虽然……这种钥匙有些特殊……不确定它是否会给您带来问题。