Android實現(xiàn)傳感器功能
Android傳感器概述:動作傳感器、環(huán)境傳感器、位置傳感器等,如方向傳感器(電子羅盤)、重力傳感器(橫縱切換)。Android SDK支持的傳感器并不是每一部Android手機均支持。
動作傳感器:在三個軸上測量加速度和旋轉(zhuǎn)角度,包括加速度、重力、陀螺儀;
環(huán)境傳感器:測量環(huán)境參數(shù),包括濕度、光線、溫度;
位置傳感器:測量設備物理位置,包括方向、磁力。
ASF(Android傳感器框架)功能:確定當前Android設備內(nèi)置傳感器;確定傳感器技術指標,如傳感器測量的最大范圍、制造商等;獲取傳感器回傳數(shù)據(jù),以及定義回傳數(shù)據(jù)的精度;注冊和注銷傳感器事件監(jiān)聽器,用于監(jiān)聽數(shù)據(jù)回傳。
硬件傳感器:加速、溫度、陀螺儀、光線、磁場、重力(視情況而定)、線性加速(視情況而定)、濕度、壓力、臨近、旋轉(zhuǎn)向量
軟件傳感器:方向。
SensorManager類:創(chuàng)建sensor service實例。訪問、枚舉、注冊、注銷監(jiān)聽器、精度、頻率等。
Sensor類:提供獲取傳感器參數(shù)。
SensorEvent類:創(chuàng)建傳感器事件對象,該對象提供與傳感器有關信息,事件對象包括的信息有原始傳感器回傳數(shù)據(jù)、類型、精度以及觸發(fā)事件。
SensorEventListener接口:包含兩個回調(diào)方法,當傳感器回傳值或精度發(fā)生變化時,系統(tǒng)調(diào)用這兩個方法。
動作傳感器(Motion):監(jiān)聽設備動作的傳感器有5個,加速、陀螺儀純硬件傳感器,重力、線性加速、旋轉(zhuǎn)。監(jiān)測Android手機的動作,如傾斜、震動等。設備的移動通常是對用戶輸入的直接反應,如游戲中控制小球;設備所處物理環(huán)境也會反應在設備的動作上,如手機放在車上。所有動作傳感器均會返回3個浮點數(shù)值(長度為3的數(shù)組)。
重力Demo:設備從左到右推動,X軸加速度為正值;反向Y軸加速度為正值,若向上以Am/s方加速度推動,則Z軸加速度為A+9.81,若計算實際加速度,需要減9.81。
位置傳感器:磁場、方向傳感器,鄰近傳感器(測量設備正面到某一個鄰近物體的距離)。對于確定設備在真實世界中的物理位置非常有用。前兩者返回三個值,鄰近返回一個值。
方向傳感器:
SensorEvent.values[0]:繞著Z軸旋轉(zhuǎn)的角度。若Y軸正對北方(正常拿手機方向),該值為0,反之,為南,該值180,Y軸指向東方,該值90,反之270。
SensorEvent.values[1]:繞著X軸旋轉(zhuǎn)的角度,當從Z軸正方向朝Y軸正方向,該值為正值,反之,為負值,該值在-180到180中間變動。
SensorEvent.values[2]:繞著Y軸旋轉(zhuǎn)的角度。當從Z軸正方向朝X軸正方向,該值為正值,反之,為負值,該值在-180到180中間變動。
鄰近傳感器:SensorEvent.values[0]:手機正面距離鄰近物體的距離(CM)。
環(huán)境傳感器:Android提供了4個傳感器檢測外部環(huán)境,如濕度、溫度、壓強、光線,并不是所有傳感器均有,需要提前判斷。環(huán)境傳感器只返回一個值。
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測試效果:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android直播軟件搭建之實現(xiàn)背景顏色滑動漸變效果的詳細代碼
這篇文章主要介紹了Android直播軟件搭建之實現(xiàn)背景顏色滑動漸變效果的詳細代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09詳解Android App中創(chuàng)建ViewPager組件的方法
這篇文章主要介紹了詳解Android App中創(chuàng)建ViewPager組件的方法,ViewPager最基本的功能就是可以使視圖滑動,需要的朋友可以參考下2016-03-03Android編程基于Contacts讀取聯(lián)系人的方法(附demo源碼)
這篇文章主要介紹了Android編程基于Contacts讀取聯(lián)系人的方法,實例分析了Contacts讀取的實現(xiàn)方法及權限設置方法,并附帶了完整實例供讀者下載參考,需要的朋友可以參考下2015-12-12Flutter 使用fluro的轉(zhuǎn)場動畫進行頁面切換
在實際應用中,我們常常會對不同的頁面采取不同的轉(zhuǎn)場動畫,以提高頁面切換過程中的用戶體驗。例如,微信的掃碼后在手機上確認登錄頁面就是從底部彈出的,而大部分頁面的跳轉(zhuǎn)都是從右向左滑入。通過這種形式區(qū)分不同的轉(zhuǎn)場場景,從而給用戶更多的趣味性以提高用戶體驗。2021-06-06android view轉(zhuǎn)Bitmap生成截圖的方法
這篇文章主要介紹了android view轉(zhuǎn)Bitmap生成截圖的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09