Существующие ответы не полностью отвечают на вопрос и оставляют достаточно деталей, чтобы они не работали без дополнительного расследования. Я поделюсь тем, что я узнал, решая это.
Сначала вам нужно добавить следующее разрешение в ваш файл манифеста:
<uses-permission android:name="android.permission.PREVENT_POWER_KEY" />
Для обработки коротких и длинных нажатий добавьте следующие переопределения в ваш класс активности:
@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);
}
Примечание. Стоит отметить, что onKeyDown () будет срабатывать несколько раз, прежде чем onKeyLongPress, поэтому вы можете захотеть вызвать onKeyUp () вместо этого или другую логику, чтобы предотвратить действие при серии вызовов onKeyDown (), когда пользователь удерживая его.
Я думаю, что следующая часть предназначена только для Cyanogenmod. Если константа PREVENT_POWER_KEY не определена, то вам она не нужна.
Чтобы начать перехватывать клавишу питания, вам нужно установить следующий флаг из вашей активности:
getWindow().addFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY);
Чтобы прекратить перехват клавиши питания (включая стандартную функцию):
getWindow().clearFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY);
Вы можете переключаться между двумя режимами в вашей программе несколько раз, если хотите.