android传感器的学习
来源:互联网 发布:sql注入登录 编辑:程序博客网 时间:2024/05/01 04:20
学习懈怠了几天,有些惭愧。。。
传感器是能标识温度,加速度等等物理现象的转换电子信号的机器。AndroidSDK,在移动设备中提供了各种各样的传感器的API。那么,例程在模拟器中就不能使用,这点请大家注意。需要在实际的手机上测试才能体现。 首先,对AndroidSDK提供的传感器关联的类和接口进行介绍。
Sensor类,是管理各种传感器的共同属性(名字,版本等等)的类。
在Sensor类,能使用的传感器的种类通过常量来定义的。但是根据硬件,传感器搭载是任意的。比如现在市场销售的(DevPhone,HTCDream)实际确认有TYPE_ACCELEROMETER,TYPE_ORIENTATION,TYPE_MAGNETIC_FIELD,TYPE_TEMPERATURE四种类别。
SensorManager类是对搭载的移动设备的传感器进行访问的类,用这个类的借口能取得事件*********的登录/删除、传感器的信息。
SensorManager类的主要方法如下所示:
注册被指定反应速度。反应速度的指定,使用前面的的SENSOR_DELAY系列常量。 注销全部传感器。 注销被sensor指定的传感器。 用list形式取得能使用的传感器的接口。
private SensorManager sensorManager; //声明传感器
SensorEvent类是在传感器事件(onAccuracyChanged ,onSensorChanged 稍后介绍)为了对能取得的信息进行整理管理的类。被管理的值全部用公用的field定义的。
SensorEvent类的主要的field :
SensorEventListener接口是为了取得传感器的事件的事件。
linear_acceleration[0] =e.values[0];//此处是数组变化 linear_acceleration[1] =e.values[1]; linear_acceleration[2] =e.values[2]; data.putFloatArray("acc",e.values); //putFloatArray:往消息中插入数组,acc是数组名,e.values是数组指针 data.putFloatArray("linear_acc", linear_acceleration); m.setData(data); m.what=0; //判断取值类型 case 0: //直接取值 bb=msg.getData(); //得到消息 acc =bb.getFloatArray("acc");//得到以acc为名的数组的值 linear_acc= bb.getFloatArray("linear_acc"); x.setText(acc[0]+""); y.setText(acc[1]+""); z.setText(acc[2]+""); Log.i("abc", "TYPE_ACCELEROMETER" + acc[0]+" "+ acc[1]+" "+acc[2]); break; case 1: bb=msg.getData(); light = bb.getFloat("light"); proximity = bb.getFloat("proximity"); //mResponseField.setText(acc[0]+" "+ acc[1]+" "+acc[2]); //Log.i("abc", acc[0]+" "+ acc[1]+" "+acc[2]); //input.setText(light+" "+proximity); break; super.handleMessage(msg); }
<stringname="app_name">test002</string> <stringname="hello_world">Helloworld!</string> <stringname="menu_settings">Settings</string> <stringname="x">xxx</string> <stringname="y">yyy</string> <stringname="z">zzz</string>
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" >
<TextView android:id="@+id/textView6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:text="Z轴加速度:" />
<TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/textView6" android:layout_alignParentLeft="true" android:layout_marginBottom="44dp" android:text="Y轴加速度:" />
<TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/textView5" android:layout_alignParentLeft="true" android:layout_marginBottom="41dp" android:text="X轴加速度:" />
<TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView5" android:layout_alignBottom="@+id/textView5" android:layout_centerHorizontal="true" android:text="@string/y" />
<TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView6" android:layout_alignBottom="@+id/textView6" android:layout_alignLeft="@+id/textView2" android:text="@string/z" />
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView2" android:layout_alignTop="@+id/textView4" android:text="@string/x" />
<TextView android:id="@+id/textView0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginBottom="38dp" android:text="当前安卓用户加速度" />
说说今天的学习吧,今天主要是将我的PAD的传感器-加速度传感器的API和其结果得到了,没办法,我的PAD只有这么一个传感器,测试得到。
话说以前有个U880,不过屏幕坏了两次,放弃了。、。、
从传感器开始说吧。。。
传感器(Sensor)是什么?
这里我就不进行详细进行说明如何连接手机进行运行程序了。
============================================================================================
传感器(Sensor)关联的类(Class)和接口(Interface)
android.hardware.Sensor类
主要的常量
传感器的种类
常量名 说明 实际的值
TYPE_ACCELEROMETER 加速度1
TYPE_GYROSCOPE 陀螺仪 4
TYPE_LIGHT 光照 5
TYPE_MAGNETIC_FIELD 磁力计2
TYPE_ORIENTATION 方位传感器 3
TYPE_PRESSURE 压力传感器6
TYPE_PROXIMITY 距离传感器8
TYPE_TEMPERATURE 温度传感器 7
TYPE_ALL 全部的传感器-1
主要的方法
Sensor类的主要的方法参照下面
方法 处理内容
public float getMaximumRange() 返回传感器的最大值
public String getName() 返回传感器的名字
public float getPower() 返回传感器的功率(mA毫安)
public float getResolution() 返回传感器的精度
public int getType() 返回传感器的类型
public String getVentor() 返回Vendor名 矢量
public int getVersion() 返回传感器的版本号
============================================================================================
android.hardware.SensorManager类
主要的常量
在SensorManager有很多个常量被定义,但是这些中最重要的是关于传感器的反应速度的。
Android,在进行登录的时候通过4个阶段对传感器进行设定的。
关于传感器的反映速度的常量:
常量名 说明 实际的值
SENSOR_DELAY_FASTEST 在游戏想特别快的反应速度的时候使用0
SENSOR_DELAY_GAME 游戏用 1
SENSOR_DELAY_UI 用户接口用 2
SENSOR_DELAY_NORMAL 取得倾斜度的时候使用(缺省) 3
主要的方法
1.public boolean registerListener(SensorEventListenerlistener,Sensor sensor,intrate)
2.public void unregisterListener(SensorEventListenerlistener)
3.public void unregisterListener(SensorEventListenerlistener,Sensor sensor)
4.public List getSensorLIst(int type)
============================================================================================
重点来了:
1.怎么获取传感器实例,因为它是一个类,但是并不是像普通类实例化那样,看下面代码:
sensorManager =(SensorManager)this.getSystemService(SENSOR_SERVICE);//将传感器实例化
这些是在onCreate中实现的。
、
2.在onResume 方法中取得传感器的名字:
List<Sensor> sensors =sensorManager.getSensorList(Sensor.TYPE_ALL);//获取传感器列表
for (Sensor s : sensors){ //遍历传感器
if(s.getType()==Sensor.TYPE_ACCELEROMETER)//得到加速度传感器
{
sensorManager.registerListener(this,s,SensorManager.SENSOR_DELAY_NORMAL); //注册传感器
}
}
除了可以使用s.getType()得到传感器的类型,也可以使用s.getName()得到传感器的名字。
============================================================================================
android.hardware.SensorEvent
主要的字段(field)
SensorEvent类的主要的field如下所示
字段(field) 内容
public int accuracy 传感器的精度
public Sensor sensor 传感器的instance
public long timestamp 时间(毫微秒)
public final flaot[] values 传感器的值
============================================================================================
android.hardware.SensorEventListener接口
前面所说的 SensorManager类具有登录删除功能。在这个封装的接口中可以取得传感器的值。
主要的事件
方法 处理内容
void onAccuracyChanged(Sensor sensor,int accuracy)传感器的精度变化的时候,此方法被调用
void onSensorChanged(SensorEvent event) 传感器的值改变的时候,此方法被调用
重点又来了:
① 为了取得传感器的值,需要加载SensorEventListener
② 在onResume方法进传感器的注册
③在onSensorChanged方法中取得传感器的值,并在画面表示。在这个方法中在onResume方法中注册传感器的所有种类,所以的传感器的值都可以取到。然后判别传感器的种类,将传感器的值用TextView在画面表示出来。
④ 在onStop方法中解除所有注册的传感器。
PS:要是想将传感器的值实时的传递到TextView显示,需要新建一个句柄线程Handler,在onSensorChanged中将变化的值以消息的方式传递到实例化的Handler 线程再调用 TextView的setText将内容显示出来,因为onSensorChanged是当传感器值改变的时候就调用,而Handler 是有消息就调用,所以可以实时的显示消息。
作者在学习过程中就遇到了这个困难,在onSensorChanged中直接使用TextView的方法显示,画面好卡的说。。。。而且作者在学习传感器之前还是个java新手。。。。之前只熟悉c#。。。。不过都差不多啦
关于句柄下面有代码解释,此处不说明。
这里作者因为只使用过加速度传感器,所以只介绍这个了,要是以后作者有钱了。。。(要是有钱就不做java了。。。)就买个所有传感器都有的PAD来做实验,哈哈哈哈哈(魔王般的笑~)
===========================================================================================
加速度传感器
加速度传感器是为了检测物体的加速度的传感器。物体运动加速度也跟着变化,如果能取到加速度,物体受到什么样的作用力或则物体进行什么样的运动,我们就可以知道。使用加速度,我们就能做模拟计步器、物体运动的应用程序。
通过加速度传感器能取到的值
我们可以通过Android的加速度传感器可以取得x,y,z三个轴的加速度。加速度值受地球重力的影响,值也不一样。这就涉及到物理知识了,我就不细阐述了。也不是一句两句能说清楚的。在SensorManager类中定义了很多星体的重力加速度值。
常量名 说明 实际的值
GRAVITY_DEATH_STAR_1 死亡星 3.5303614E-7
GRAVITY_EARTH 地球 9.80665
GRAVITY_JUPITER 木星 23.12
GRAVITY_MARS 火星 3.71
GRAVITY_MERCURY 水星 3.7
GRAVITY_MOON 月亮 1.6
GRAVITY_NEPTUNE 海王星 11.0
GRAVITY_PLUTO 冥王星 0.6
GRAVITY_SATURN 土星 8.96
GRAVITY_SUN 太阳 275.0
GRAVITY_THE_ISLAND 岛屿星 4.815162
GRAVITY_URANUS 天王星 8.69
GRAVITY_VENUS 金星 8.87
==================================================================================================
好了,下面上主菜,作者的小作品。。。。
新建个android工程
三个文件需要改动:
MainActivity.java
string.xml
activity_main.xml--layout下的布局文件
==================================================================================================
MainActivity.java
package com.example.test002;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import java.util.List;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class MainActivity extends Activity implementsSensorEventListener {
private SensorManager sensorManager; //声明传感器
TextView x; //声明textview
TextView y;
TextView z;
private float[] linear_acceleration = new float[3];
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
sensorManager =(SensorManager)this.getSystemService(SENSOR_SERVICE);//将传感器实例化
setContentView(R.layout.activity_main);
x = (TextView)findViewById(R.id.textView1);
y = (TextView)findViewById(R.id.textView2);
z = (TextView)findViewById(R.id.textView3);
}
@Override
protected void onResume(){ //重新开始函数
super.onResume();
List<Sensor> sensors =sensorManager.getSensorList(Sensor.TYPE_ALL);//获取传感器列表
for (Sensor s : sensors){ //遍历传感器
// if(s.getType()==Sensor.TYPE_ACCELEROMETER)//得到加速度传感器
//{
sensorManager.registerListener(this,s,SensorManager.SENSOR_DELAY_NORMAL); //注册传感器
// }
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { //精度改变调用函数
}
@Override
public void onSensorChanged(SensorEvent e) { //值改变调用函数
Message m = null;
Bundle data = null;
switch(e.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:{
//第0种取值方法是直接取值,第1种是通过中间数组取值,数组的值可以计算和变化
m = Message.obtain(mHandler);
data=new Bundle();
mHandler.sendMessage(m); //发送消息
// x.setText("x:" +String.valueOf(e.values[0]));
//x.setText("");
// y.setText("y:" + String.valueOf(e.values[1]));
//y.setText("");
// z.setText("z:" + String.valueOf(e.values[2]));
//z.setText("");
break;
}
}
}
//句柄消息实现:
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Bundle bb = null;
float acc[], linear_acc[];
float light, proximity;
switch (msg.what) {
}
};
@Override
protected void onStop(){ //停止函数 注销传感器
super.onStop();
sensorManager.unregisterListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if itis present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
==================================================================================================
string.xml
<?xml version="1.0"encoding="utf-8"?>
<resources>
</resources>
==================================================================================================
activity_main.xml--layout下的布局文件
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
</RelativeLayout>
布局如下:
==================================================================================================
O~拉,运行吧,不要忘了在相应的环境包下装到你的PAD或手机哦~~
==================================================================================================
==================================================================================================
===================================================================================================================
- android传感器的学习
- android中传感器的学习
- Android学习-传感器的使用
- android传感器学习之获取传感器的值
- Android学习之手机传感器的获取
- android 学习笔记 光照传感器的用法
- Android传感器学习一
- Android陀螺仪传感器学习
- Android传感器学习总结
- android传感器架构学习
- Android陀螺仪传感器学习
- android传感器学习之获取手机传感器
- android传感器学习之获取手机传感器
- android-学习-android内置传感器
- 记android学习之路----android传感器的使用
- Android的传感器
- android 传感器的使用
- android 所有的传感器
- 原汁原味:外国人常挂在嘴边的英语…
- 第一次安卓环境搭建
- android有关bluetooth常用api简介
- Adroid项目目录结构
- 2013年01月22日
- android传感器的学习
- final的作用
- 部分智能推荐算法总结
- 日历分析(三) java集合类
- android之创建button
- Intent 和 Intent Filter
- FileDescriptor对象和ParcelFileDe…
- millis( )
- 极客工坊-知识库