安卓加速度傳感器:Android中的傳感器之—加速度傳感器

2022/04/11 13:07 · 傳感器知識資訊 ·  · 安卓加速度傳感器:Android中的傳感器之—加速度傳感器已關閉評論
摘要:

安卓加速度傳感器:Android中的傳感器之—加速度傳感器加速度傳感器加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數值。該數值包含地心引力的影響,單位是m/s^2。將手機平放在桌面上,x軸默認為0,y軸默認0,z軸默認9.81(由于地球的固有重力)。將手機朝下放在桌面上,z軸為-9.81。將手機向左傾斜,x軸為正值。將手機向右傾斜,x軸為負值。將手機向

安卓加速度傳感器:Android中的傳感器之---加速度傳感器

加速度傳感器
加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數值。

該數值包含地心引力的影響,單位是m/s^2。

將手機平放在桌面上,x軸默認為0,y軸默認0,z軸默認9.81(由于地球的固有重力)。

將手機朝下放在桌面上,z軸為-9.81。

將手機向左傾斜,x軸為正值。

將手機向右傾斜,x軸為負值。

將手機向上傾斜,y軸為負值。

將手機向下傾斜,y軸為正值。

Android 加速度傳感器的類型是? Sensor.TYPE_ACCELEROMETER

通過 android.hardware.SensorEvent 返回加速度傳感器值。

加速度傳感器在手機中應用非常的廣泛,在開發的過程當中也非常的簡單,(獲取到值是真的非常的簡單,想要實現某種功能還是需要自己想想怎么加判斷吧)

舉個栗子:手機搖一搖的功能:

這個算是比較簡單的判斷了,獲取到x,y,z的值之后,對這三個值進行判斷,搖一搖手機的話這些值肯定會發生變化,我們定一個閾值,當它們的值超過某一個數字之后就進行了搖一搖,配合代碼實現更容易理解

手機搖一搖功能實現

上面代碼可以看到,通過x,y,z的值的變化來判斷手機是否進行了搖一搖,這個判斷是比較簡單的,思路就是這么個思路,這種判斷有缺點,上面判斷的是xyz的值不管是哪一個超過了20就認定手機進行了搖一搖,但是忽略了一點,就是用戶往一個方向甩動手機也能觸發,最好的就是只判斷zy,并且判斷的xy必須同時超過20才能認定是搖一搖,以下是改過的代碼

抬手亮屏
還有相對搖一搖來說復雜一點的功能--抬手亮屏,這個也是對xyz進行判斷,這里就不放代碼了,簡單說一下思路,當我們拿起手機的時候,加速度傳感器xyz的值肯定會發生變化,我們可以判斷它的結束值,就是手機對著我們的臉的時候傳感器的值是個什么樣的狀態(我低著頭對著手機的時候是x:0,y:8,z:5),我們可以對這個值進行判斷,在手機200ms內達到這個值就被認定抬手亮屏

代碼部分
下面是獲取加速度傳感器的值以及手機搖一搖的代碼

更多手機傳感器使用請看Android中的傳感器(總)
安卓加速度傳感器:Android中的傳感器之---加速度傳感器  第1張

安卓加速度傳感器:android加速度傳感器怎么使用

使用加速度傳感器與其他傳感器的方法大致相同,通過調用系統API就可以實現。分為以下幾步:
1.獲取SensorManager
2.使用SensorManager獲取加速度傳感器
3.創建自定義的傳感器監聽函數,并注冊
4.相對應的,在合適位置實現注銷監聽器的調用
簡單的代碼如下:
public class MainActivity extends Activity {
private static final String TAG="SensorTest";
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private TestSensorListener mSensorListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
// 初始化傳感器
mSensorListener=new TestSensorListener();
mSensorManager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
@Override
protected void onResume() {
super.onResume();
// 注冊傳感器監聽函數
mSensorManager.registerListener(mSensorListener, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onPause() {
super.onPause();
// 注銷監聽函數
mSensorManager.unregisterListener(mSensorListener);
}
private void initViews() {
mSensorInfoA=(TextView) findViewById(R.id.sensor_info_a);
}
class TestSensorListener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
// 讀取加速度傳感器數值,values數組0,1,2分別對應x,y,z軸的加速度
Log.i(TAG, "onSensorChanged: " + event.values[0] + ", " + event.values[1] + ", " + event.values[2]);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Log.i(TAG, "onAccuracyChanged");
}
}
}

下面是一個搖一搖的例子,你可以看一下: 
 public class MainActivity extends Activity {
  private SensorManager sensorManager;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  sensorManager=(SensorManager) getSystemService
  (Context.SENSOR_SERVICE);
//獲取加速度傳感器
  Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//設置監聽
  sensorManager.registerListener(listener, sensor, SensorManager.
  SENSOR_DELAY_NORMAL);
  }
  @Override
  protected void onDestroy() {
  super.onDestroy();
  if (sensorManager !=null) {
  sensorManager.unregisterListener(listener);
  }
  }
  private SensorEventListener listener=new SensorEventListener() {
  @Override
  public void onSensorChanged(SensorEvent event) {
  // 加速度可能會是負值,所以要取它們的絕對值
  float xValue=Math.abs(event.values[0]);
  float yValue=Math.abs(event.values[1]);
  float zValue=Math.abs(event.values[2]);
  if (xValue > 15 || yValue > 15 || zValue > 15) {
  // 認為用戶搖動了手機,觸發搖一搖邏輯
  Toast.makeText(MainActivity.this, "搖一搖",
  Toast.LENGTH_SHORT).show();
  }
  }
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
  }
  };
  }

安卓加速度傳感器:android學習筆記之加速度傳感器

加速度傳感器(Accelerometer sensor)
1.加速度傳感器,用于檢測手機運動狀態。
2.同方向傳感器一樣,加速度傳感器也有X,Y,Z三個軸
3,加速度傳感器也叫G-sensor,返回X,Y,Z,三軸的加速度數值。該數值包含地心引力的影響,單位是m/s2
4.將手機平放在桌面上,X軸默認是0,Y軸默認是0,Z軸默認是9.81;手機朝下,Z軸相反,其他不變。
5.手機向左傾斜,X軸為正,向右,為負
6,向上傾斜,為負,向下傾斜,為正值
簡單例子
XML文件

安卓加速度傳感器:關于手機加速度傳感器的使用(入門)

1.手機加速度傳感器的介紹。三軸的方向如下圖所示,傳感器記錄各個軸上的加速度,單位同重力加速度的單位。
2.安卓中讀取加速度傳感器的方法。
利用安卓中sensor、sensorevent,sensormanager三個類來實現。
代碼實現的方法如下,
(1)首先需要import安卓有關調用手機傳感器相應的包。
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
(2)注冊使用手機加速度傳感器及設置加速度計傳感器采樣率。
private SensorManager getSensorManager(){
return (SensorManager) getSystemService(SENSOR_SERVICE);//首先需要獲取傳感器的服務
}
void onRume(){
getSensorManager().registerListener(this, getSensorManager().getDefaultSensor(Sensor.TYPE_ACCELEROMETER), GESTURE_DURATION_US/N_SAMPLES);
//注冊使用加速度傳感器(若是要使用其它類型的傳感器,只需要修改為Sensor.TYPE_X,X為相應的傳感器英文),registerListener()的第三個參數為延遲時間,以此來自定義采樣率,單位為微秒(GESTURE_DURATION_US為采樣時間,單位為微秒,N_SAMPLES為采樣點數)
//手機傳感器代碼也可以寫在void onCreat()中,或者其他位置,放置位置取決于你需要什么時候開始啟用加速度計開始采集數據。
}
(3)注銷使用手機加速度傳感器
protected void onDestroy(){
getSensorManager().unregisterListener(this);
//為了在退出APP時,停止加速度傳感器繼續對數據的采集onDestroy()中寫入unregisterListener()
//也可以寫在其他位置,如想要APP進入后臺運行(按home鍵)就停止加速度傳感器的采樣,可以將unregisterListener()寫在onPause()或onStop()中。
}
PS:本例中3、4部分的代碼都是寫在class MainActivity{}中的。
(4)采集手機加速度傳感器數據
public class MainActivity extends AppCompatActivity implements SensorEventListener{
private static List x;
private static List y;
private static List z;
@Override
public void onSensorChanged(SensorEvent event){
//只要加速度傳感器采集的加速度數據發生改變,就會執行onSensorChanged()的操作,正常情況下只要已注冊使用傳感器就會一直采數據。
//以下就是將三軸加速度數據分別保存起來
x.add(event.values[0]);//將x軸加速度保存在x列表中
y.add(event.values[1]);//將y軸加速度保存在y列表中
z.add(event.values[2]);//將z軸加速度保存在z列表中
}
@Override
public void onAccuracyChanged(Sensor sensor, int i){
//只要加速度傳感器采集的加速度數據精度發生改變,就會執行onAccuracyChanged()操作,一般用不上。
}
}
3.讓加速度計在進入后臺并息屏狀態下也保持持續運行。
由于手機默認息屏狀態下,會關閉所有的傳感器設備,這就導致默認情況下,只要一息屏,加速度傳感器只能在亮屏的情況下也能使用。但對于一些需要長時間采集加速度數據的應用來說,這種操作過于費電。
所以利用wakeclock實現息屏加速度計也能繼續運行。
public class MainActivity extends AppCompatActivity{
//定義一個WakeLock對象
private PowerManager.WakeLock mWakeLock;
void onCreate(){
//PowerManager.PARTIAL_WAKE_LOCK選項為CPU和所有硬件會一直工作
PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
mWakeLock.acquire();
}
protected void onDestroy(){
//退出APP時需要釋放wakelock
mWakeLock.release();
}
}
最后,需要在AndroidMainfest.xml中加入WAKE_LOCK的使用權限說明,加入位置如下。
package="...">

您可能感興趣的文章

本文地址:http://www.marisaherron.com/70550.html
文章標簽: ,  
版權聲明:本文為原創文章,版權歸 ceomba 所有,歡迎分享本文,轉載請保留出處!

文件下載

老薛主機終身7折優惠碼boke112

上一篇:
下一篇:

評論已關閉!