日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android實現傳感器功能_Android

作者:RKGG愛吃魚 ? 更新時間: 2022-11-10 編程語言

Android傳感器概述:動作傳感器、環境傳感器、位置傳感器等,如方向傳感器(電子羅盤)、重力傳感器(橫縱切換)。Android SDK支持的傳感器并不是每一部Android手機均支持。

動作傳感器:在三個軸上測量加速度和旋轉角度,包括加速度、重力、陀螺儀;

環境傳感器:測量環境參數,包括濕度、光線、溫度;

位置傳感器:測量設備物理位置,包括方向、磁力。

ASF(Android傳感器框架)功能:確定當前Android設備內置傳感器;確定傳感器技術指標,如傳感器測量的最大范圍、制造商等;獲取傳感器回傳數據,以及定義回傳數據的精度;注冊和注銷傳感器事件監聽器,用于監聽數據回傳。

硬件傳感器:加速、溫度、陀螺儀、光線、磁場、重力(視情況而定)、線性加速(視情況而定)、濕度、壓力、臨近、旋轉向量

軟件傳感器:方向。

SensorManager類:創建sensor service實例。訪問、枚舉、注冊、注銷監聽器、精度、頻率等。

Sensor類:提供獲取傳感器參數。

SensorEvent類:創建傳感器事件對象,該對象提供與傳感器有關信息,事件對象包括的信息有原始傳感器回傳數據、類型、精度以及觸發事件。

SensorEventListener接口:包含兩個回調方法,當傳感器回傳值或精度發生變化時,系統調用這兩個方法。

動作傳感器(Motion):監聽設備動作的傳感器有5個,加速、陀螺儀純硬件傳感器,重力、線性加速、旋轉。監測Android手機的動作,如傾斜、震動等。設備的移動通常是對用戶輸入的直接反應,如游戲中控制小球;設備所處物理環境也會反應在設備的動作上,如手機放在車上。所有動作傳感器均會返回3個浮點數值(長度為3的數組)。

重力Demo:設備從左到右推動,X軸加速度為正值;反向Y軸加速度為正值,若向上以Am/s方加速度推動,則Z軸加速度為A+9.81,若計算實際加速度,需要減9.81。

位置傳感器:磁場、方向傳感器,鄰近傳感器(測量設備正面到某一個鄰近物體的距離)。對于確定設備在真實世界中的物理位置非常有用。前兩者返回三個值,鄰近返回一個值。

方向傳感器:

SensorEvent.values[0]:繞著Z軸旋轉的角度。若Y軸正對北方(正常拿手機方向),該值為0,反之,為南,該值180,Y軸指向東方,該值90,反之270。

SensorEvent.values[1]:繞著X軸旋轉的角度,當從Z軸正方向朝Y軸正方向,該值為正值,反之,為負值,該值在-180到180中間變動。

SensorEvent.values[2]:繞著Y軸旋轉的角度。當從Z軸正方向朝X軸正方向,該值為正值,反之,為負值,該值在-180到180中間變動。

鄰近傳感器:SensorEvent.values[0]:手機正面距離鄰近物體的距離(CM)。

環境傳感器:Android提供了4個傳感器檢測外部環境,如濕度、溫度、壓強、光線,并不是所有傳感器均有,需要提前判斷。環境傳感器只返回一個值。

TYPE_AMBIENT_TEMPERATURE:event.values[0] ?℃ ?溫度

TYPE_LIGHT:event.values[0] ?lx ?光線

TYPE_PRESSURE:event.values[0] ?hPa ?壓強

TYPE_RELATIVE_HUMIDITY:event.values[0] ?RH(%) ?濕度

一、獲得當前設備所有的傳感器列表

import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.List;
?
public class MainActivity extends AppCompatActivity {
? ? private TextView tvSensor;
? ? private SensorManager sensorManager;
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? tvSensor = (TextView) findViewById(R.id.tvSensor);
? ? ? ? sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
? ? ? ? List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
? ? ? ? for (Sensor sensor:sensors){
? ? ? ? ? ? tvSensor.append(sensor.getName()+"\n");
? ? ? ? }
? ? }
}

二、動作傳感器示例

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
?
public class MainActivity extends AppCompatActivity implements SensorEventListener {
? ? private TextView tvAccelerometer;
? ? private SensorManager sensorManager;
? ? private float[] gravity = new float[3];
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer);
? ? ? ? sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
? ? }
?
? ? @Override
? ? public void onSensorChanged(SensorEvent event) {
? ? ? ? switch (event.sensor.getType()){
? ? ? ? ? ? case Sensor.TYPE_ACCELEROMETER:
? ? ? ? ? ? ? ? final float alpha = (float)0.8;
? ? ? ? ? ? ? ? gravity[0] = alpha*gravity[0]+(1-alpha)*event.values[0];
? ? ? ? ? ? ? ? gravity[1] = alpha*gravity[1]+(1-alpha)*event.values[1];
? ? ? ? ? ? ? ? gravity[2] = alpha*gravity[2]+(1-alpha)*event.values[2];
? ? ? ? ? ? ? ? String accelerometer = "加速度\n"+"X:"+(event.values[0]-gravity[0])+"\n"+"Y:"+
? ? ? ? ? ? ? ? ? ? ? ? (event.values[1]-gravity[1])+"\n"+"Z:"+(event.values[2]-gravity[2]);
? ? ? ? ? ? ? ? Log.d("Z",String.valueOf((event.values[2]-gravity[2])));
? ? ? ? ? ? ? ? tvAccelerometer.setText(accelerometer);
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case Sensor.TYPE_GRAVITY:
? ? ? ? ? ? ? ? gravity[0] = event.values[0];
? ? ? ? ? ? ? ? gravity[1] = event.values[1];
? ? ? ? ? ? ? ? gravity[2] = event.values[2];
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case Sensor.TYPE_PROXIMITY:
? ? ? ? ? ? ? ? setTitle(String.valueOf(event.values[0]));
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? }
?
? ? @Override
? ? public void onAccuracyChanged(Sensor sensor, int accuracy) {
?
? ? }
? ? protected void onResume(){
? ? ? ? super.onResume();
? ? ? ? sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
? ? ? ? ? ? ? ? SensorManager.SENSOR_DELAY_UI);
? ? ? ? sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
? ? ? ? ? ? ? ? SensorManager.SENSOR_DELAY_FASTEST);
? ? ? ? sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
? ? ? ? ? ? ? ? SensorManager.SENSOR_DELAY_NORMAL);
? ? }
? ? protected void onPause(){
? ? ? ? super.onPause();
? ? ? ? sensorManager.unregisterListener(this);
? ? }
}

以下是小米2s測試效果:

原文鏈接:https://blog.csdn.net/xiaoxun2802/article/details/60866340

欄目分類
最近更新