2013-10-04 36 views
0

我想收聽電源按鍵事件。 我該怎麼做?android中的電源鍵事件?

目前我使用的代碼是這樣的:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(KeyEvent.KEYCODE_POWER == event.getKeyCode()){ 
     Log.e("POWER", "pow"); 
     return true;//If event is handled, falseif 
     } 
    return super.onKeyDown(keyCode, event); 
} 

而且用戶權限

<uses-permission android:name="android.permission.PREVENT_POWER_KEY" /> 

我沒有得到任何結果。

我想添加一個功能,當用戶按下電源按鈕或長按,他可以有一個緊急呼叫/快速撥號。

尋找解決方案。

回答

0
package app.test; 

import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.provider.Settings; 
import android.util.Log; 

public class Test extends Activity implements SensorEventListener { 
    private WakeLock mWakelock = null; 
    private SensorManager mMgr; 
    private Sensor mAccel; 
    private BufferedWriter mLog; 
    final private SimpleDateFormat mTimeFormat = new SimpleDateFormat("HH:mm:ss - "); 
    private int mSavedTimeout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mMgr = (SensorManager) this.getSystemService(SENSOR_SERVICE); 
     mAccel = mMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     try { 
      String filename = Environment.getExternalStorageDirectory().getAbsolutePath() +"/accel.log"; 
      mLog = new BufferedWriter(new FileWriter(filename, true)); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
      finish(); 
     } 

     PowerManager pwrMgr = (PowerManager) this.getSystemService(POWER_SERVICE); 
     mWakelock = pwrMgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Accel"); 
     mWakelock.acquire(); 

     try { 
      mSavedTimeout = Settings.System.getInt(getContentResolver(), 
       Settings.System.SCREEN_OFF_TIMEOUT); 
     } 
     catch(Exception e) { 
      mSavedTimeout = 120000; 
     } 
     Settings.System.putInt(getContentResolver(), 
      Settings.System.SCREEN_OFF_TIMEOUT, 5000); 
    } 

    public BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) { 
       writeLog("The screen has turned off"); 
       mMgr.unregisterListener(Test.this); 
       mMgr.registerListener(Test.this, mAccel, 
        SensorManager.SENSOR_DELAY_NORMAL); 
      } 
     } 
    }; 
    @Override 
    protected void onStart() { 
     mMgr.registerListener(this, mAccel, SensorManager.SENSOR_DELAY_NORMAL); 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(mReceiver, filter); 
     super.onStart(); 
    } 
    @Override 
    protected void onStop() { 
     mMgr.unregisterListener(this, mAccel); 
     unregisterReceiver(mReceiver); 
     try { 
     mLog.flush(); 
    } catch (IOException e) { 
    } 
     super.onStop(); 
    } 
    @Override 
    protected void onDestroy() { 
     try { 
      mLog.flush(); 
      mLog.close(); 
     } 
     catch(Exception e) { 
     } 
     Settings.System.putInt(getContentResolver(), 
       Settings.System.SCREEN_OFF_TIMEOUT, mSavedTimeout); 
     mWakelock.release(); 
     super.onDestroy(); 
    } 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    } 
    public void onSensorChanged(SensorEvent event) { 
    writeLog("Got a sensor event: " + event.values[0] + ", " + 
     event.values[1] + ", " + event.values[2]); 
    } 
    private void writeLog(String str) { 
    try { 
     Date now = new Date(); 
     mLog.write(mTimeFormat.format(now)); 
     mLog.write(str); 
     mLog.write("\n"); 
    } 
    catch(IOException ioe) { 
     ioe.printStackTrace(); 
    } 
    } 
} 

Enjoyyyy

0

你應該在你重載函數的onkeydown

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

onKeyLongPress如果同樣的檢查你用

你想要的另一種方法處理屏幕關閉,您可以註冊BroadcastReceiver採取行動Intent.ACTION_SCREEN_OFF