2012-03-27 73 views
1

我正在開發一個應用程序,在按下電源按鈕時我需要執行一個操作,但不幸的是,當按下按鈕時,我不能操作電源按鈕的操作。我嘗試使用onKeyDown()和dispatchKeyEvent()方法,但似乎沒有工作。任何人都可以爲我提出任何其他方法或解決方案。覆蓋Android中的電源按鈕

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); 
} 
+0

重複的問題 http://stackoverflow.com/questions/3703071/how-to-hook-into-the-power-button-in-android – 2012-03-27 09:15:56

+0

,如果你只擔心自己的設備和如果它是根植的,你可以修改鍵盤佈局文件 – stefan 2012-03-27 09:19:38

回答

5

我找到了答案,這可以通過使用AlarmManager與電源管理器

@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喚醒屏幕。我無法通過覆蓋「電源」按鈕控制來停止屏幕關閉狀態。一旦進入睡眠狀態,我只是在喚醒設備。

+0

輝煌。 wakeLock究竟做了什麼? – Bowi 2016-12-01 16:47:36

2

幸運的是,這是不可能的,除非是通過自定義固件。

0

我不知道你打算做什麼,但你可以使用BroadcastReceiver,並聽取當按下電源按鈕(和屏幕打開)時發送的android.intent.action.SCREEN_OFFIntent.ACTION_SCREEN_OFF

不幸的是,這個意圖也會在屏幕超時時發送。但我認爲你可以阻止手機(應用程序中的一段時間)被鎖定這樣

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
+0

我試着用ACTION_SCREEN_OFF使用BroadCastReceiver嘗試,即使按下電源按鈕時它沒有響應,但另一方面它在屏幕超時工作。 – Bob 2012-03-27 09:39:05

+0

使用ACTION_SCREEN_OFF我可以在鎖定屏幕之前執行操作,但無法停止鎖定屏幕。 – Bob 2012-03-27 10:54:29

+0

是的,意圖在事件發生後發送。我不認爲你可以覆蓋現有功能的電源按鈕。 – Paaske 2012-03-27 11:03:13