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