android实现手机传感器调用

android传感器使用的demo,包括光线传感器,加速度传感器,距离传感器和方向传感器。

demo:下载地址

源码:

package com.bobo.study.study_5_1;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;
//1,获得SensorManager对象
//2,获得想要的Sensor对象
//3,绑定监听器
public class MainActivity extends Activity implements View.OnClickListener{
 Button findBut,accelerationBut,lightBut,orientationBut,proximityBut;
 SensorManager sensorManager;
 TextView text,accText,luxText;
 float gravity[]=new float[3];
 float linear_acceleration[]=new float[3];
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  findBut=(Button)findViewById(R.id.findBut);
  findBut.setOnClickListener(this);
  lightBut=(Button)findViewById(R.id.lightBut);
  lightBut.setOnClickListener(this);
  accelerationBut=(Button)findViewById(R.id.accelerationBut);
  accelerationBut.setOnClickListener(this);
  orientationBut=(Button)findViewById(R.id.orientationBut);
  orientationBut.setOnClickListener(this);
  proximityBut=(Button)findViewById(R.id.proximityBut);
  proximityBut.setOnClickListener(this);

  text=(TextView)findViewById(R.id.text);
  accText=(TextView)findViewById(R.id.accText);
  luxText=(TextView)findViewById(R.id.luxText);

  //获得传感器管理器对象
  sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
 }

 @Override
 public void onClick(View v) {
  if(v==findBut){
   //获取手机上所有传感器的列表
   List<Sensor> sensors=sensorManager.getSensorList(Sensor.TYPE_ALL);
   for(Sensor sensor:sensors){
    System.out.println(sensor.getName());
   }
  }else if(v==lightBut){
   //得到默认的加速度传感器
   Sensor lightSensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
   //绑定监听器(上下文接口,要监听的传感器,传感器采样率<时间间隔>),返回结果
   Boolean res=sensorManager.registerListener(new LightSensorListener(),lightSensor,SensorManager.SENSOR_DELAY_NORMAL);
   Toast.makeText(this,"绑定光线传感器:"+res,Toast.LENGTH_LONG).show();
  }
  else if(v==accelerationBut){
   Sensor accelerometerSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
   Boolean res=sensorManager.registerListener(new AccerationSensorListener(),accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL);
   Toast.makeText(this,"绑定加速度传感器:"+res,Toast.LENGTH_LONG).show();
  }else if(v==orientationBut){
   Sensor orientationSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
   Boolean res=sensorManager.registerListener(new OrientaationListener(),orientationSensor,SensorManager.SENSOR_DELAY_NORMAL);
   Toast.makeText(this,"绑定方向传感器:"+res,Toast.LENGTH_LONG).show();
  }
  else if(v==proximityBut){
   Sensor proximitySensor=sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
   Boolean res=sensorManager.registerListener(new ProximityListener(),proximitySensor,SensorManager.SENSOR_DELAY_NORMAL);
   Toast.makeText(this,"绑定距离传感器:"+res,Toast.LENGTH_LONG).show();
  }
 }

 public class LightSensorListener implements SensorEventListener{
  @Override
  //传感器的数据被打包成event,主要的检测数据放在enent.values[]数组中
  public void onSensorChanged(SensorEvent event) {
   System.out.println(event.timestamp);//时间戳
   System.out.println(event.sensor.getResolution());//分辨率(能识别出最小数值)
   System.out.println(event.accuracy);//精度(等级)
   System.out.println(event.values[0]);//光线强度
  }
  @Override
  //传感器精度变化时调用这个函数
  public void onAccuracyChanged(Sensor sensor, int accuracy) {}
 }

 public class AccerationSensorListener implements SensorEventListener{
  @Override
  public void onSensorChanged(SensorEvent event) {
   final float alpha=0.8f;

   //event.values[0]X轴加速度,负方向为正
   //event.values[1]Y轴加速度,负方向为正
   //event.values[2]Z轴加速度,负方向为正
   gravity[0]=alpha*gravity[0]+(1-alpha)*event.values[0];
   gravity[1]=alpha*gravity[1]+(1-alpha)*event.values[1];
   gravity[2]=alpha*gravity[2]+(1-alpha)*event.values[2];

   linear_acceleration[0]=event.values[0]-gravity[0];
   linear_acceleration[1]=event.values[1]-gravity[1];
   linear_acceleration[2]=event.values[2]-gravity[2];

   //通过以上公式可以抛去三个方向上的重力加速度,只剩下纯加速度
   text.setText(linear_acceleration[0] + "");
   accText.setText(linear_acceleration[1] + "");
   luxText.setText(linear_acceleration[2] + "");
  }
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {}
 }

 public class OrientaationListener implements SensorEventListener{
  @Override
  public void onSensorChanged(SensorEvent event) {
   //(需要手机屏幕向上,向下的话南北会反掉)设备绕Z轴旋转,Y轴正方向与地磁北极方向的夹角,顺时针方向为正,范围【0,180】
   float azimuth=event.values[0];
   //设备绕X轴旋转的角度,当Z轴向Y轴正方向旋转时为正,反之为负,范围【-180,180】
   float pitch=event.values[1];
   //设备绕Y轴旋转的角度,当Z轴向X轴正方向旋转时为负,反之为正,范围【-90,90】
   float roll=event.values[2];

   text.setText(azimuth+"");
   accText.setText(pitch +"");
   luxText.setText(roll+"");
  }
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {}
 }

 public class ProximityListener implements SensorEventListener{
  @Override
  public void onSensorChanged(SensorEvent event) {
   //距离传感器测试手机屏幕距离别的物体的记录,只有两个值:0和5
   //距离很近时为0,否则为5
   System.out.println(event.values[0]+"");
  }
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {}
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.menu_main, menu);
  return true;
 }
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // Handle action bar item clicks here. The action bar will
  // automatically handle clicks on the Home/Up button, so long
  // as you specify a parent activity in AndroidManifest.xml.
  int id = item.getItemId();
  //noinspection SimplifiableIfStatement
  if (id == R.id.action_settings) {
   return true;
  }
  return super.onOptionsItemSelected(item);
 }
}

界面截图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现计步传感器功能

    本文对原文:android实现计步功能初探,计步项目进行了精简,移除了进程服务和计时.守护进程.数据库保存等等,方便扩展功能. 本文源码:https://github.com/lifegh/StepOrient Android4.4以上版本,有些手机有计步传感器可以直接使用, 而有些手机没有,但有加速度传感器,也可以实现计步功能(需要计算加速度波峰波谷来判断人走一步)! 一.调用 public class MainActivity extends AppCompatActivity implem

  • Android利用方向传感器获得手机的相对角度实例说明

    1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端. 将手机放在桌子上,z轴的方向是从手机指向天空. 2.方向传感器 在方向传感器中values变量的3个值都表示度数,它们的含义如下: values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度.0表示北(North):90表示东(East):180表示南(Sou

  • Android开发中方向传感器定义与用法详解【附指南针实现方法】

    本文实例讲述了Android开发中方向传感器定义与用法.分享给大家供大家参考,具体如下: Android中的方向传感器在生活中是一个很好的应用,典型的例子是指南针的使用,我们先来简单介绍一下传感器中三个参数x,y,z的含义,以一幅图来说明. 补充说明:图中的坐标轴x,y,z和传感器中的X,Y,Z没有任何联系! 如上图所示,绿色部分表示一个手机,带有小圈那一头是手机头部 传感器中的X:如上图所示,规定X正半轴为北,手机头部指向OF方向,此时X的值为0,如果手机头部指向OG方向,此时X值为90,指向

  • 详解Android 传感器开发 完全解析

    大家好,由于最近会有对智能硬件相关的开发需求,所以最近这些天分享的博文也就大致挂钩智能硬件了,像上一篇的蓝牙分享,相信很多读者已经看过了,那么今天我为大家带来Android传感器方面知识的介绍与使用方法,对于传感器的使用,不同版本的Android手机也许存在较大的硬件差异,但是万变不离其宗,本篇将通过几个最常见的传感器,渗透式的教会大家如何使用这些传感器,带领大家完成这部分的进阶提高.让每一位Android开发者都对传感器的使用变得游刃有余. 1.Android的三大类传感器 Android传感

  • Android利用Sensor(传感器)实现指南针小功能

    首先来说一说该指南针的实现思路: 程序先准备一张指南针图片,该图片上方向指针指向北方.接下来开发一个检测方向的传感器,程序检测到手机顶部绕Z轴转过多少度,让指南针图片反向转多少度即可.由此可见指南针应用只要在界面中添加一张图片,并让图片总是反向转过反向传感器返回的第一个角度值即可. 下面介绍一下方向传感器:方向传感器用于感应手机设备的摆放状态.方向传感器可以返回三个角度,这三个角度即可确定手机的摆放状态.关于方向传感器返回的三个角度的说明如下. 第一个角度:表示手机顶部朝向正北方的夹角.当手机绕

  • Android编程基于距离传感器控制手机屏幕熄灭的方法详解

    本文实例讲述了Android编程基于距离传感器控制手机屏幕熄灭的方法.分享给大家供大家参考,具体如下: 在现实生活中,打电话的时候手机挨着自己的头,屏幕会熄灭,这是为了不让自己的头按到什么手机键~ 这个功能可以使用距离传感器来实现 P-Sensor距离感应器,可以感应手机和人体距离.具体使用用途是在通话过程中打开P-Sensor,那么当手机屏幕贴近用户脸部时,就会自动感应出手机和人体距离是多少.当小于某一个值时,就会熄灭屏幕,不再接收用户触摸屏幕事件,从而有效的防止通话过程中误触摸事件的出现.

  • Android编程实现获取所有传感器数据的方法

    本文实例讲述了Android编程实现获取所有传感器数据的方法.分享给大家供大家参考,具体如下: main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" androi

  • Android开发中的重力传感器用法实例详解

    本文实例讲述了Android开发中的重力传感器用法.分享给大家供大家参考,具体如下: 重力传感器与方向传感器的开发步骤类似,只要理清了期中的x,y,z的值之后就可以根据他们的变化来进行编程了,首先来看一副图 假设当地的重力加速度值为g 当手机正面朝上的时候,z的值为q,反面朝上的时候,z的值为-g 当手机右侧面朝上的时候,x的值为g,右侧面朝上的时候,x的值为-g 当手机上侧面朝上的时候,y的值为g,右侧面朝上的时候,y的值为-g 了解了重力传感器中X,Y,Z的含义之后下面我们就开始学习如何使用

  • android 传感器(OnSensorChanged)使用介绍

    下面是API中定义的几个代表sensor的常量. Int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type. 加速度传感器 int TYPE_ALL A constant describing all sensor types. 所有类型 A constant describing all sensor types. int TYPE_GRAVITY A constant describing a grav

  • Android 利用方向传感器实现指南针具体步骤

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中  step2:设计应用的UI界面,main.xml 复制代码 代码如下: <SPAN style="FONT-SIZE: 18px"><STRONG><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="htt

随机推荐