Android的传感器主要包括八大传感器,他们分别是:加速度传感器(accelerometer)、陀螺仪(gyroscope)、方向传感器(orientation)、磁力传感器(magnetic field)、环境光照传感器(light)、温度传感器(temperature)、距离传感器(proximity)和压力传感器(pressure)。本文先对传感器的使用做一个总体的介绍,然后再详细介绍每一种传感器的具体参数获取。

〇、总体介绍

Android传感器的使用,先通过SensorManager获取系统提供的传感器服务。然后通过得到的Sensor服务,实例化一个需要使用到的传感器。之后实例化一个SensorEventListener,来监听传感器的变化信息。最后注册此SensorEventListener即可。

// 获取系统提供的传感器服务
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
// 实例化需要使用的传感器(以加速度传感器为例)
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 实例化传感器事件监听器
SensorEventListener sel = SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
// 获取传感器变化信息
// sensorEvent.values 存储了传感器的数值
} @Override
public void onAccuracyChanged(Sensor sensor, int i) {
// 获取传感器精度变化信息
}
};
// 注册传感器事件监听器,第三个参数为采样时间
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);

传感器的名称和对应类型为:

名称 英文 类型
加速度传感器 accelerometer Sensor.TYPE_ACCELEROMETER
陀螺仪 gyroscope Sensor.TYPE_GYROSCOPE
方向传感器 orientation Sensor.TYPE_ORIENTATION
磁场传感器 magnetic field Sensor.TYPE_MAGNETIC_FIELD
环境光照传感器 light Sensor.TYPE_LIGHT
温度传感器 temperature Sensor.TYPE_AMBIENT_TEMPERATURE
距离传感器 proximity Sensor.TYPE_PROXIMITY
压力传感器 pressure Sensor.TYPE_PRESSURE

一、加速度传感器(TYPE_ACCELEROMETER)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为X轴方向上的加速度,value[1]为Y轴方向上的加速度,value[2]为Z轴方向上的加速度。单位为m/s2

         btnAcc = (Button) findViewById(R.id.btnAcc);
btnAcc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "加速度传感器加速度" + "\nX轴:" + value[0]
+ "\nY轴:" + value[1] + "\nZ轴:" + value[2];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
});

二、陀螺仪(TYPE_GYROSCOPE

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为X轴方向上的角速度,value[1]为Y轴方向上的角速度,value[2]为Z轴方向上的角速度。单位为rad/s。

        btnGys = (Button)findViewById(R.id.btnGys);
btnGys.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "陀螺仪传感器角速度" + "\nX轴:" + value[0]
+ "\nY轴:" + value[1] + "\nZ轴:" + value[2];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
});

三、方向传感器(TYPE_ORIENTATION

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为Yaw轴方向上的角度,value[1]为Pitch轴方向上的角度,value[2]为Roll轴方向上的角度。单位为degree。其中,在手机平面内顺时针旋转为Yaw增加方向,将手机屏幕向上从左往右看,手机逆时针旋转为Pitch增加方向。手机屏幕向上,从后往前看,手机逆时针旋转为Roll增加方向。

        btnOri = (Button)findViewById(R.id.btnOri);
btnOri.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "姿态传感器角度" + "\nYaw:" + value[0]
+ "\nPitch:" + value[1] + "\nRoll:" + value[2];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
});

四、磁场传感器(TYPE_MAGNETIC_FIELD)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为X轴方向上的磁场强度,value[1]为Y轴方向上的磁场强度,value[2]为Z轴方向上的磁场强度。单位为μT。

        btnMage = (Button)findViewById(R.id.btnMage);
btnMage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "磁场传感器微特斯拉" + "\nX轴:" + value[0]
+ "\nY轴:" + value[1] + "\nZ轴:" + value[2];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
});

五、环境光照传感器(TYPE_LIGHT)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为当前环境光照强度,单位为lux。

        btnLight = (Button)findViewById(R.id.btnLight);
btnLight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "光照传感器" + "\n光强(lux):" + value[0];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
});

六、温度传感器(TYPE_AMBIENT_TEMPERATURE)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为当前环境温度,单位为摄氏度。

        btnTemp = (Button)findViewById(R.id.btnTemp);
btnTemp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "温度传感器" + "\n温度(℃):" + value[0];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
});

七、距离传感器(TYPE_PROXIMITY)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为当前距离,单位为厘米。距离传感器可以空来探测用户是否在打电话的时候将手机贴到了耳边,从而熄灭屏幕避免误触。

        btnPxm = (Button)findViewById(R.id.btnPxm);
btnPxm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "距离传感器" + "\n距离(厘米):" + value[0];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
});

八、压力传感器(TYPE_PRESSURE)

按照上文所述,我们添加一个Button来启动传感器,然后添加一个TextView来接收传感器的数据。sensorEvent.values存储的数据中,value[0]为当前压力,压力的返回数值为0~1中间的值,没有具体单位。

        btnPre = (Button)findViewById(R.id.btnPre);
btnPre.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "压力传感器" + "\n压力:" + value[0];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
});

九、完整代码:

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends Activity { private Button btnAcc;
private Button btnGys;
private Button btnOri;
private Button btnMage;
private Button btnLight;
private Button btnTemp;
private Button btnPxm;
private Button btnPrs;
private TextView textView;
private SensorManager sensorManager;
private SensorEventListener sel;
private Sensor sensor; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); btnAcc = (Button) findViewById(R.id.btnAcc);
btnAcc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "加速度传感器加速度" + "\nX轴:" + value[0]
+ "\nY轴:" + value[1] + "\nZ轴:" + value[2];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}); btnGys = (Button)findViewById(R.id.btnGys);
btnGys.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "陀螺仪传感器角速度" + "\nX轴:" + value[0]
+ "\nY轴:" + value[1] + "\nZ轴:" + value[2];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}); btnOri = (Button)findViewById(R.id.btnOri);
btnOri.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "姿态传感器角度" + "\nYaw:" + value[0]
+ "\nPitch:" + value[1] + "\nRoll:" + value[2];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}); btnMage = (Button)findViewById(R.id.btnMage);
btnMage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "磁场传感器微特斯拉" + "\nX轴:" + value[0]
+ "\nY轴:" + value[1] + "\nZ轴:" + value[2];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}); btnLight = (Button)findViewById(R.id.btnLight);
btnLight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "光照传感器" + "\n光强(lux):" + value[0];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}); btnTemp = (Button)findViewById(R.id.btnTemp);
btnTemp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "温度传感器" + "\n温度(℃):" + value[0];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}); btnPxm = (Button)findViewById(R.id.btnPxm);
btnPxm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sensorManager.unregisterListener(sel);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
sel = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] value = sensorEvent.values;
String str = "距离传感器" + "\n距离(厘米):" + value[0];
textView.setText(str);
} @Override
public void onAccuracyChanged(Sensor sensor, int i) { }
};
sensorManager.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}); } }

Android开发手记(22) 传感器的使用的更多相关文章

  1. (转)Android开发--常用的传感器总结

    随着手机的发展,现在各大手机支持的传感器类型也越来越多,在开发中利用传感器进行某些操作令人们有一种耳目一新的感觉,例如微信中的摇一摇,以及手机音乐播放器中的摇一摇切歌.今天来简单介绍下Android中 ...

  2. Android开发10:传感器器及地图相关应用

    前言 啦啦啦~各位小伙伴们好~经过这一学期的Android知识的学习,我们学到了很多和Android开发相关的知识,这一学期的学习也要告一段落了. 一起进入我们今天的相关内容~这次我们将一起学习使用 ...

  3. Android 开发手记一NDK编程实例

    在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Development Kit的简称.它是一个工具集,集成 ...

  4. Android开发之重力传感器

    重力传感器与方向传感器的开发步骤类似,只要理清了期中的x,y,z的值之后就可以根据他们的变化来进行编程了,首先来看一副图 假设当地的重力加速度值为g 当手机正面朝上的时候,z的值为q,反面朝上的时候, ...

  5. Android开发手记(28) Handler和Looper

    Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道.平 ...

  6. Android开发手记(24) Log的使用及颜色的更改

    在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录.在Android系统中,提供了简单.便利的LOG机制,开发人员可以方便地使用.本文 ...

  7. Android开发手记(18) 数据存储三 SQLite存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...

  8. Android开发手记(17) 数据存储二 文件存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 本文主要介绍如何使用文件来存储 ...

  9. Android开发手记(32) 使用摄像头拍照

    在Android中,使用摄像头拍照一般有两种方法, 一种是调用系统自带的Camera,另一种是自己写一个摄像的界面. 我们要添加如下权限: <uses-permission android:na ...

随机推荐

  1. USACO3.43Electric Fence(pick定理)

    忘记pick定理是什么了 想枚举来着 ..没枚出来 有篇pick定理的证明 貌似挺好 也没太看懂 /* ID: shangca2 LANG: C++ TASK: fence9 */ #include ...

  2. bzoj2038

    网上大片的莫队算法题解,先orz一下莫队什么不会莫队?没事我来篇低端的分块大法好啊,我们知道对于区间[l,r]答案是S/P P是一下子可以算出来的,S=∑(pj-1)*pj/2 pj表示区间内颜色为j ...

  3. VM Depot 新功能:直接通过 Windows Azure 管理门户部署虚拟机

     发布于 2014-05-09 作者 陈 忠岳 想要尝试 VM Depot 上数以百计的各类开源虚拟机,却因为复杂的命令行操作而感到烦恼?微软开放技术想您所想,及时推出 VM Depot 最新功能 ...

  4. 老的acm & oj学习站点

    1.网易小鱼博客 http://gisyhy.blog.163.com/blog/#m=0&t=1&c=fks_087069086082087064085081082095085084 ...

  5. C#数据库连接字符串

    转自:http://blog.csdn.net/xiaokexinger/article/details/1541441 在MSDN中,.net的数据库连接字符串都有详细的说明,我这里以代码范例的方式 ...

  6. Power Strings

    Power Strings TimeLimit: 1 Second   MemoryLimit: 32 Megabyte Totalsubmit: 1791   Accepted: 528 Descr ...

  7. HDU-1716 排列2 (DFS)

    排列2 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissio ...

  8. Ext.form.FormPanel定义的参数说明

    1.formId : String (可选的)FORM标签的id(默认是自动生成的). 2.labelWidth : Number 标签的宽度.该属性级联于子容器. 3. itemCls : Stri ...

  9. HDOJ/HDU 2203 亲和串(简单的判断~Java的indexOf()方法秒)

    Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现 ...

  10. octopress Endless Error With Gem Dependencies

    因为重装系统的缘故,需要重新搭建octopress环境,在执行到: bundle install 会出现一些这样的错误:An error occurred while installing timer ...