android中listview显示传感器数据

学习了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;  
     } 
   }
 }
}





  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值