網站首頁 編程語言 正文
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
相關推薦
- 2022-08-16 PostgreSQL怎么創建分區表詳解_PostgreSQL
- 2023-11-22 Linux在Ubuntu Linux下如何壓縮一個文件夾/文件
- 2023-03-25 Python實現在Excel中繪制可視化大屏的方法詳解_python
- 2023-10-15 [element-ui] el-input 不能正常輸入,輸入了也不能刪除的問題
- 2023-01-12 Golang單元測試與斷言編寫流程詳解_Golang
- 2022-12-09 C++筆記-設置cout輸出數據的寬度和填充方式_C 語言
- 2022-12-13 Android之rk3588?開發環境準備及問題解決方法_Android
- 2022-11-16 從Context到go設計理念輕松上手教程_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支