權限
<uses-permission android:name="android.permission.DEVICE_POWER"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
第一個權限加到xml文件中時會報錯,但是我會很利索的去clean掉,實現步驟:找到eclipse中的菜單選項project>clean,選擇當前項目就ok。
代碼
復制代碼
public class MainActivity extends Activity implements SensorEventListener {
public static final String TAG = "SensorTest";
//調用距離傳感器,控制屏幕
private SensorManager mManager;//傳感器管理對象
//屏幕開關
private PowerManager localPowerManager = null;//電源管理對象
private PowerManager.WakeLock localWakeLock = null;//電源鎖
//TextView
private TextView tv;//基本上沒啥用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
mManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
//獲取系統服務POWER_SERVICE,返回一個PowerManager對象
localPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
//獲取PowerManager.WakeLock對象,後面的參數|表示同時傳入兩個值,最後的是LogCat裡用的Tag
localWakeLock = this.localPowerManager.newWakeLock(32, "MyPower");//第一個參數為電源鎖級別,第二個是日志tag
}
public void onResume(){
super.onResume();
mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),// 距離感應器
SensorManager.SENSOR_DELAY_NORMAL);//注冊傳感器,第一個參數為距離監聽器,第二個是傳感器類型,第三個是延遲類型
}
public void onStop(){
super.onStop();
Log.d(TAG,"on stop");
}
public void onDestroy(){
super.onDestroy();
Log.d(TAG,"on destroy");
if(mManager != null){
localWakeLock.release();//釋放電源鎖,如果不釋放finish這個acitivity後仍然會有自動鎖屏的效果,不信可以試一試
mManager.unregisterListener(this);//注銷傳感器監聽
}
}
@Override
public void onSensorChanged(SensorEvent event) {
float[] its = event.values;
//Log.d(TAG,"its array:"+its+"sensor type :"+event.sensor.getType()+" proximity type:"+Sensor.TYPE_PROXIMITY);
if (its != null && event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
System.out.println("its[0]:" + its[0]);
tv.setText(its[0]+"");
//經過測試,當手貼近距離感應器的時候its[0]返回值為0.0,當手離開時返回1.0
if (its[0] == 0.0) {// 貼近手機
System.out.println("hands up");
Log.d(TAG,"hands up in calling activity");
if (localWakeLock.isHeld()) {
return;
} else{
localWakeLock.acquire();// 申請設備電源鎖
}
} else {// 遠離手機
System.out.println("hands moved");
Log.d(TAG,"hands moved in calling activity");
if (localWakeLock.isHeld()) {
return;
} else{
localWakeLock.setReferenceCounted(false);
localWakeLock.release(); // 釋放設備電源鎖
}
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO 自動生成的方法存根
}
}
復制代碼
需要特別注意的是,在onDestroy()函數裡需要把對象鎖釋放掉(localWakeLock.release()),否則這個功能會一直存在知道你清楚應用數據或者刪除應用,我就為這個問題困擾了好久。為此我特意在源代碼例子裡做了一個跳轉頁面,加了log。
這裡我們實例化了兩個管理對象,一個是傳感器管理對象:SensorManager;另一個是 電源管理對象:localPowerManager。
傳感器管理對象負責收集收集與物體之間的距離數據,電源管理對象通過判斷傳感器收集到數據對屏幕的滅屏和白屏做處理。