Переопределение кнопки питания в Android

Я разрабатываю приложение, в котором мне нужно выполнить действие при нажатии кнопки питания, но, к сожалению, я не могу изменить действие кнопки питания, когда она нажата. Я пытался использовать методы onKeyDown() и dispatchKeyEvent(), но, похоже, ничего не работает. Может кто-нибудь предложить мне любой другой метод или решение этой проблемы.

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {
    // The action I want to perform when power button is pressed.
    return true;
}
return super.onKeyDown(keyCode, event);
}

а также

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

3 ответа

Решение

Я нашел ответ, и это можно сделать с помощью AlarmManager с PowerManager

@Override
public void onReceive(Context context, Intent intent) {
if ((intent.getAction().equals(Intent.ACTION_SCREEN_OFF))) {

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "TEST");
wakeLock.acquire();

AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent inten = new Intent(context,NewActivity.class);
PendingIntent pi = PendingIntent.getActivity(context, 0, inten, 0);
alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,  100, pi);
}
}   

// Finish your WakeLock HERE. call this method after U put the activity in front or when u exit from the new activity.
public void finishWakeLocker(){
if (wakeLock != null) 
wakeLock.release();  
}

Здесь сначала экран гаснет, а затем я просыпаюсь с помощью AlarmManager. Я не мог остановить отключение экрана, отключив управление кнопкой питания. Я просто просыпаю устройство, как только оно переходит в состояние сна.

К счастью, это невозможно, разве что через кастомную прошивку.

Я не знаю, что вы собираетесь делать, но вы могли бы использовать BroadcastReceiver и слушать за android.intent.action.SCREEN_OFF или же Intent.ACTION_SCREEN_OFF который отправляется при нажатии кнопки питания (и экран включен).

К сожалению, это намерение будет отправлено, когда время ожидания экрана тоже. Но я думаю, что вы можете предотвратить блокировку телефона (в приложении), как это

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
Другие вопросы по тегам