赞
踩
学习了android传感器的有关使用,与大家分享一下:
1. 什么是传感器?
传感器就是一种物理器件,能够感知、检测、处理外界信号。Android手机一般支持多种类型的传感器,如加速度传感器、光照传感器、方向传感器等。Android系统负责将这些传感器所输出的信号传递给开发者,开发者可以利用这些数据开发应用。如微信的摇一摇就是用了加速度传感器。
2. 传感器的使用
(1) 从系统服务中获得传感器管理器,具体代码:
SensorManager sensormanger =(SensorManager)getSystemService(Context.SENSOR_SERVICE);
(2) 从服务器中获得单个传感器对象或者所有传感器对象,具体如本例代码:
List<Sensor> sensorlist =sensormanger.getSensorList(Sensor.TYPE_ALL);
或者Sensor sensor1 =sensormanger.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
(3)Sensor类常用的方法如下:
getName();获得传感器名称
getType();获得传感器类型
getVersion();获得传感器设备版本
getVendor();获得传感器制造商名称
3. 为传感器注册监听器事件
由于传感器数据是实时地变化,要想获得最新数据,就需要监听传感器变化,所以要为指定传感器注册监听事件。在此之前要实现SensorEventListener监听器接口,一般注册监听器事件写在OnCreat()、onResume()方法中。具体代码如下;
Sensormanger.registerListener(SensorEventListenerlistener,Sensor sensor,int rate);
SensorEventListenerlistener:监听器接口,有两种方法:
onSensorChanged(SensorEventevent):在传感器数据发送变化时调用,通过该方法中的event对象获得数据。
onAccuracyChanged(Sensorsensor, int accuracy):当精确度发送变化时调用,因为有些传感器在不同的环境中,受外界干扰导致精确度偏差。
Sensor sensor:表示传感器对象。
Int rate:表示传感器数据变化的采样率。有四种类型:
SENSOR_DELAY_FASTEST:延时10ms;
SENSOR_DELAY_GAME:延时20ms;
SENSOR_DELAY_UI:延时60ms;
SENSOR_DELAY_NORMAL:延时200ms.
注意采样率越高,即延时越短,手机耗电量越高。
4. 注销传感器
由于android系统中的传感器管理服务是系统底层服务,即使用户界面关闭了,但它仍然在后台运行,再加上传感器实时的采集数据,损耗了电量。所以在不使用传感器的时要注销传感器的监听。方法如下:
Sensormanager.unregisterListener(listener);
关于传感器的使用就怎么多,下面想大家展示一下用listview显示传感器数据的代码:
1.主界面的布局文件
<RelativeLayout xmlns: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"
android:background="@drawable/log"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.test.mysensor.MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true">
</ListView>
</LinearLayout>
</RelativeLayout>
2.界面交互代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity implements OnItemClickListener{
private SensorManager sensormanger;
private ListView listview;
private ArrayAdapter<String>arr_adapter;
private List<Sensor> sensorlist;
/*
* 1.新建一个适配器
* 2.添加数据源到适配器
* 3.视图加载适配器
*
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得传感器管理器
sensormanger =(SensorManager) getSystemService(Context.SENSOR_SERVICE);
//从传感器服务器中获得传感器
sensorlist =sensormanger.getSensorList(Sensor.TYPE_ALL);
List<String> sensornamelist =new ArrayList<String>();
for(Sensor sensor:sensorlist)
sensornamelist.add(sensor.getName());
listview =(ListView) findViewById(R.id.listView1);
//ArrayAdapter(上下文,当前listview加载的每一个列表项对应的布局文件,)
arr_adapter =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, sensornamelist);
listview.setAdapter(arr_adapter);
listview.setOnItemClickListener(this);
}
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(this, "position="+position, Toast.LENGTH_SHORT).show(); // 透视listview项目点击位置
Intent intent=new Intent(this, xianshi.class); //向传感器界面传递用户点击了那个界面
intent.putExtra("position",position );
startActivity(intent); //启动
}
}
3.传感器界面
public class xianshi extends Activity implements SensorEventListener{
private SensorManager sensormanger;
private Sensor sensor1,sensor4,sensor5;
private ListView listview;
private ArrayAdapter<String>arr_adapter,arr_adapter1;
private long lastUpdateTime;
private float lastx;
private float lasty;
private float lastz;
private int position;
//private String lightvalue[];
/*
* 1.新建一个适配器
* 2.添加数据源到适配器
* 3.视图加载适配器
*
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xianshi);
Intent intent =getIntent();
position=intent.getIntExtra("position",-1);
// switch(position)
// {
// case 1:
// sensor1 =sensormanger.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); break;
// default:sensor4 =sensormanger.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// }
//获得传感器管理器
sensormanger =(SensorManager) getSystemService(Context.SENSOR_SERVICE);
//从传感器服务器中获得传感器
// sensor1 =sensormanger.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
listview =(ListView) findViewById(R.id.listView1);
//ArrayAdapter(上下文,当前listview加载的每一个列表项对应的布局文件,)
//arr_adapter =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, sensornamelist);
//listview.setAdapter(arr_adapter);
}
protected void onResume() {
// TODO Auto-generated method stub
switch(position)
{
case 1:
sensor1 =sensormanger.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); break;
case 4:
sensor4 =sensormanger.getDefaultSensor(Sensor.TYPE_LIGHT);break;
case 5:
sensor5 =sensormanger.getDefaultSensor(Sensor.TYPE_ORIENTATION);break;
}
super.onResume();
switch(position)
{
case 1:
sensormanger.registerListener(this, sensor1,SensorManager.SENSOR_DELAY_NORMAL);break;
case 4:
sensormanger.registerListener(this, sensor4,SensorManager.SENSOR_DELAY_NORMAL);break;
case 5:
sensormanger.registerListener(this, sensor5,SensorManager.SENSOR_DELAY_NORMAL);break;
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
//当前检测时间
switch(position)
{
case 1:
{
long currentUpdateTime =System.currentTimeMillis();
//两次检测时间间隔
long timeInterval =currentUpdateTime-lastUpdateTime;
//判断是否达到检测时间
if(timeInterval<100)
return ;
lastUpdateTime=currentUpdateTime;
float x=event.values[0];
float y=event.values[1];
float z=event.values[2];
lastx=x;
lasty=y;
lastz=z;
String name="加速度传感器";
String x1="X轴:"+lastx+"";
String y1="Y轴:"+lasty+"";
String z1="Z轴:"+lastz+"";
String []arr_data1={name,x1,y1,z1};
arr_adapter =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arr_data1);
listview.setAdapter(arr_adapter);
break;
}
case 4:
{
String lightvalue[]={"光传感器:",event.values[0]+" Lunx"};
arr_adapter1 =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lightvalue);
listview.setAdapter(arr_adapter1);
break;
}
case 5:
{
String x1="X轴:"+event.values[0];
String y1="Y轴:"+event.values[1];
String z1="Z轴:"+event.values[2];
String orientvalue[]={"方向传感器:",x1,y1,z1};
arr_adapter1 =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, orientvalue);
listview.setAdapter(arr_adapter1);
break;
}
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。