android 傳感器類 sensor


手機所有傳感器的列出:

首先說一下 android平台下的 11種感應器:
           1. ACCELEROMETER 加速,描述加速度的。
           2.GRAVITY 重力,這個在大家都知道。
           3.GYROSCOPE 陀螺儀,對於物體跌落檢測更強大些,開發游戲少了它會有點遺憾的, API Level 9新增的類型。
           4. LIGHT 光線感應器,很多 Android手機的屏幕亮度是根據這個感應器的數組自動調節的。
           5. LINEAR_ACCELERATION 線性加速器, API Level 9新增的。
           6. MAGNETIC_FIELD 磁極感應器。
           7. ORIENTATION 方向感應器。
           8. PRESSURE 壓力感應器。  
           9. PROXIMITY 距離感應器,對於通話后關閉屏幕背光很有用。
         10. ROTATION_VECTOR 旋轉向量, Android 2.3新增的,如果我們過去處理圖像會發現這個還是很有用的,不過這里還是對游戲開發起到輔助。
  11. TEMPERATURE 溫度感應器,可以獲取手機的內部溫度,不過和周邊的有些差距,畢竟手機內部一般溫度比較高。
復制代碼
package mars.com;
 
import java.util.List;
 
import android.app.Activity;
 
import android.content.Context;
 
import android.hardware.Sensor;
 
import android.hardware.SensorManager;
 
import android.os.Bundle;
 
import android.view.View;
 
import android.view.View.OnClickListener;
 
import android.widget.Button;
 
import android.widget.TextView;
 
public class DemoSensorActivity extends Activity {
 
private Button button;
 
private TextView show;
 
private SensorManager sm;
 
private StringBuffer str;
 
private List<Sensor> allSensors;
 
private Sensor s;
 
@Override
 
public void onCreate(Bundle savedInstanceState) {
 
  super.onCreate(savedInstanceState);
 
  setContentView(R.layout.main);
 
  button = (Button) findViewById(R.id.button);
 
  show = (TextView) findViewById(R.id.show);
 
  button.setOnClickListener(new ButtonListener());
 
  sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
 
  allSensors = sm.getSensorList(Sensor.TYPE_ALL);// 獲得傳感器列表
 
}
 
class ButtonListener implements OnClickListener {
 
  public void onClick(View v) {
 
   str = new StringBuffer();
 
   str.append("該手機有" + allSensors.size() + "個傳感器,分別是:\n");
 
   for (int i = 0; i < allSensors.size(); i++) {
 
    s = allSensors.get(i);
 
    str.append("設備名稱:" + s.getName() + "\n");
 
    str.append("設備版本:" + s.getVersion() + "\n");
 
    str.append("通用類型號:" + s.getType() + "\n");
 
    str.append("設備商名稱:" + s.getVendor() + "\n");
 
    str.append("傳感器功耗:" + s.getPower() + "\n");
 
    str.append("傳感器分辨率:" + s.getResolution() + "\n");
 
    str.append("傳感器最大量程:" + s.getMaximumRange() + "\n");
 
    switch (s.getType()) {
 
    case Sensor.TYPE_ACCELEROMETER:
 
     str.append(i + "加速度傳感器");
 
     break;
 
    case Sensor.TYPE_GYROSCOPE:
 
     str.append(i + "陀螺儀傳感器");
 
     break;
 
    case Sensor.TYPE_LIGHT:
 
     str.append(i + "環境光線傳感器");
 
     break;
 
    case Sensor.TYPE_MAGNETIC_FIELD:
 
     str.append(i + "電磁場傳感器");
 
     break;
 
    case Sensor.TYPE_ORIENTATION:
 
     str.append(i + "方向傳感器");
 
     break;
 
    case Sensor.TYPE_PRESSURE:
 
     str.append(i + "壓力傳感器");
 
     break;
 
    case Sensor.TYPE_PROXIMITY:
 
     str.append(i + "距離傳感器");
 
     break;
 
    case Sensor.TYPE_TEMPERATURE:
 
     str.append(i + "溫度傳感器");
 
     break;
 
    default:
 
     str.append(i + "未知傳感器");
 
     break;
 
    }
 
   }
 
   show.setText(str);
 
  }
 
}
 
}
 
復制代碼
 
要善於應用這些資源,今天要說的就是距離感應器。其這個鎖頻的原理也很簡單,就是當有物體靠近距離感應器的時候,會觸發事件,然后在事件里面申請設備電源鎖,讓屏幕處於黑屏出台,然后當物體離開距離感應器,釋放設備電源鎖,就 ok了。下面看看代碼
MainActivity.java  這個類很簡單,就是啟動一個Service。
?
public class MainActivity extends Activity {
 
/** Called when the activity is first created. */
 
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
setContentView(R.layout.main);
 
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
 
}
}

   然后就是MyService.java   主要內容

?
public class MyService extends Service {
 
private SensorManager mManager;
 
private Sensor mSensor = null;
 
private SensorEventListener mListener = null;
 
private PowerManager localPowerManager = null;
private PowerManager.WakeLock localWakeLock = null;
 
 
@Override
public void onCreate() {
 
//獲取系統服務POWER_SERVICE,返回一個PowerManager對象
localPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
//獲取PowerManager.WakeLock對象,后面的參數|表示同時傳入兩個值,最后的是LogCat里用的Tag
localWakeLock = this.localPowerManager.newWakeLock(32, "MyPower");
 
//獲取系統服務SENSOR_SERVICE,返回一個SensorManager對象
mManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//獲取距離感應器對象
mSensor = mManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
//注冊感應器事件
mListener = new SensorEventListener() {
 
@Override
public void onSensorChanged(SensorEvent event) {
 
float[] its = event.values;
 
if (its != null
 
&& event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
 
System.out.println("its[0]:" + its[0]);
 
//經過測試,當手貼近距離感應器的時候its[0]返回值為0.0,當手離開時返回1.0
if (its[0] == 0.0) {// 貼近手機
 
System.out.println("手放上去了...");
 
if (localWakeLock.isHeld()) {
return;
} else
localWakeLock.acquire();// 申請設備電源鎖
 
} else {// 遠離手機
 
System.out.println("手拿開了...");
 
if (localWakeLock.isHeld()) {
return;
} else
localWakeLock.setReferenceCounted(false);
localWakeLock.release(); // 釋放設備電源鎖
} }
}
 
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
 
}
};
}
 
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
 
//注冊監聽
mManager.registerListener(mListener, mSensor,
SensorManager.SENSOR_DELAY_GAME);
 
return super.onStartCommand(intent, flags, startId);
}
 
@Override
public void onDestroy() {
 
//取消監聽
mManager.unregisterListener(mListener);
 
super.onDestroy();
}
 
@Override
public IBinder onBind(Intent intent) {
return null;
}
 
}

  

AndroidManifest.xml 中需要添加權限
< uses-permission android:name = "android.permission.DEVICE_POWER" />
<uses-permission android:name= "android.permission.WAKE_LOCK"/>

 

由於時間原因,我這里只是實現了功能,還有很多要優化的地方,有需要的話自己可以加上。
    優化 1:當按下的時候,屏幕會鎖住,但是感應器事件依然會觸發,也就是說,當你擋住距離感應器,然后再放開,屏幕依然會亮。
     解決方法:當系統鎖屏或黑屏會廣播兩個消息分別是:ACTION_SCREEN_OFFACTION_SCREEN_ON,所以我們可以自己寫個BroadcastReceiver來接受這個廣播,並且做相應的處理。具體處理方法大家可以在黑屏的時候停止service,然后在屏幕亮后再啟動service。或者更簡單的定義個boolean變量,黑屏為false,亮的時候為true,然后判斷在true的情況下才 申請設備電源鎖,應該都可以。大概代碼如下
?
public class MyReceiver extends BroadcastReceiver {
 
@Override
public void onReceive(Context context, Intent intent) {
 
String action = intent.getAction();
 
if (action.equals("android.intent.action.SCREEN_OFF")) {
 
 
} else if (action.equals("android.intent.action.SCREEN_ON")) {
 
 
}
 
}
 
}

  

優化2:實現可以手動關閉和啟動service。在MainActivity中可以添加個checkBox,以便開啟和停止服務。這個應該很簡單就不詳細說明了。

 

優化3:開機自啟動。這個就不說了,網上大把大把的資料。
最后再講解下 PowerManager這個類。
PowerManager這個類主要是用來控制電源狀態的. 通過使用該類提供的api可以控制電池的待機時間,一般情況下不要使用。如果確實需要使用,那么盡可能的使用最低級別的WakeLocks鎖。並且確保使用完后釋放它。你可以通過context.getSystemService(Context.POWER_SERVICE)的方式獲得PowerManager的實例。在PowerManager中,最主要的newWakeLock方法,SDK源碼如下
?
/**
* Get a wake lock at the level of the flags parameter. Call
* {@link WakeLock#acquire() acquire()} on the object to acquire the
* wake lock, and {@link WakeLock#release release()} when you are done.
*
* {@samplecode
*PowerManager pm = (PowerManager)mContext.getSystemService(
* Context.POWER_SERVICE);
*PowerManager.WakeLock wl = pm.newWakeLock(
* PowerManager.SCREEN_DIM_WAKE_LOCK
* | PowerManager.ON_AFTER_RELEASE,
* TAG);
*wl.acquire();
* // ...
*wl.release();
* }
*
* @param flags Combination of flag values defining the requested behavior of the WakeLock.
* @param tag Your class name (or other tag) for debugging purposes.
*
* @see WakeLock#acquire()
* @see WakeLock#release()
*/
public WakeLock newWakeLock(int flags, String tag)
{
return new WakeLock(flags, tag);
}

  這個方法將創建WakeLock對象,通過調用此對象的方法你就可以方便的去控制電源的狀態。方法如下:

?
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();
屏幕將停留在設定的狀態,一般為亮、暗狀態
wl.release();
釋放掉正在運行的cpu或關閉屏幕。

  

flags參數說明:
                         *                                                   cpu       screen       keyboard                          * PARTIAL_WAKE_LOCK                   on         off             off                          * SCREEN_DIM_WAKE_LOCK            on         dim             off                          * SCREEN_BRIGHT_WAKE_LOCK      on         bright          off                          * FULL_WAKE_LOCK                        on         bright          bright

 

如果你持有PARTIAL_WAKE_LOCK鎖,不論任何定時器甚至是按下電源按鈕,cpu都將繼續運行,無法進入休眠狀態。除非你釋放掉它。 其他鎖的話,雖然cpu也在運行,但是當用戶按下電源按鈕時,設備將立刻進入休眠狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM