android传感器的学习

来源:互联网 发布:sql注入登录 编辑:程序博客网 时间:2024/05/01 04:20
学习懈怠了几天,有些惭愧。。。


说说今天的学习吧,今天主要是将我的PAD的传感器-加速度传感器的API和其结果得到了,没办法,我的PAD只有这么一个传感器,测试得到。

话说以前有个U880,不过屏幕坏了两次,放弃了。、。、

从传感器开始说吧。。。

传感器(Sensor)是什么?   

   传感器是能标识温度,加速度等等物理现象的转换电子信号的机器。AndroidSDK,在移动设备中提供了各种各样的传感器的API。那么,例程在模拟器中就不能使用,这点请大家注意。需要在实际的手机上测试才能体现。
这里我就不进行详细进行说明如何连接手机进行运行程序了。
============================================================================================
传感器(Sensor)关联的类(Class)和接口(Interface)  
  
   首先,对AndroidSDK提供的传感器关联的类和接口进行介绍。

android.hardware.Sensor类

   Sensor类,是管理各种传感器的共同属性(名字,版本等等)的类。

主要的常量    
   在Sensor类,能使用的传感器的种类通过常量来定义的。但是根据硬件,传感器搭载是任意的。比如现在市场销售的(DevPhone,HTCDream)实际确认有TYPE_ACCELEROMETER,TYPE_ORIENTATION,TYPE_MAGNETIC_FIELD,TYPE_TEMPERATURE四种类别。

传感器的种类

常量名                 说明 实际的值 
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类是对搭载的移动设备的传感器进行访问的类,用这个类的借口能取得事件*********的登录/删除、传感器的信息。

主要的常量    

在SensorManager有很多个常量被定义,但是这些中最重要的是关于传感器的反应速度的。
Android,在进行登录的时候通过4个阶段对传感器进行设定的。

关于传感器的反映速度的常量:
常量名                     说明                   实际的值 
SENSOR_DELAY_FASTEST 在游戏想特别快的反应速度的时候使用0 
SENSOR_DELAY_GAME 游戏用                           
SENSOR_DELAY_UI 用户接口用                         
SENSOR_DELAY_NORMAL 取得倾斜度的时候使用(缺省)        


主要的方法    

 SensorManager类的主要方法如下所示:

1.public boolean registerListener(SensorEventListenerlistener,Sensor sensor,intrate)
 注册被指定反应速度。反应速度的指定,使用前面的的SENSOR_DELAY系列常量。
2.public void unregisterListener(SensorEventListenerlistener)
  注销全部传感器。
3.public void unregisterListener(SensorEventListenerlistener,Sensor sensor)
  注销被sensor指定的传感器。
4.public List getSensorLIst(int type) 
  用list形式取得能使用的传感器的接口。
============================================================================================
重点来了:

1.怎么获取传感器实例,因为它是一个类,但是并不是像普通类实例化那样,看下面代码:

 private SensorManager sensorManager; //声明传感器
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   

   SensorEvent类是在传感器事件(onAccuracyChanged  ,onSensorChanged 稍后介绍)为了对能取得的信息进行整理管理的类。被管理的值全部用公用的field定义的。

主要的字段(field)

SensorEvent类的主要的field如下所示    
                    
 SensorEvent类的主要的field :

字段(field)               内容 
public int accuracy     传感器的精度
public Sensor sensor     传感器的instance 
public long timestamp     时间(毫微秒)
public final flaot[] values  传感器的值

============================================================================================

android.hardware.SensorEventListener接口 

 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种是通过中间数组取值,数组的值可以计算和变化
   linear_acceleration[0] =e.values[0];//此处是数组变化
   linear_acceleration[1] =e.values[1];
   linear_acceleration[2] =e.values[2];
m = Message.obtain(mHandler);
data=new Bundle();
   data.putFloatArray("acc",e.values);   //putFloatArray:往消息中插入数组,acc是数组名,e.values是数组指针
   data.putFloatArray("linear_acc", linear_acceleration);
       m.setData(data);  
       m.what=0; //判断取值类型
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) {
          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);
      }
};
 
@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>

    <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>

</resources>

==================================================================================================
activity_main.xml--layout下的布局文件

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
   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="当前安卓用户加速度" />

</RelativeLayout>
布局如下:
android传感器的学习


==================================================================================================
O~拉,运行吧,不要忘了在相应的环境包下装到你的PAD或手机哦~~
==================================================================================================

==================================================================================================

===================================================================================================================






原创粉丝点击