传感器

安卓中常见传感器的种类:
1
2
安卓传感器框架中的主要类和接口
这里写图片描述
SensorManager 允许你访问设备的感应器。通过传入参数SENSOR_SERVICE参数调用Context.getSystemService方法可以获得一个sensor的实例。永远记得确保当你不需要的时候,特别是Activity暂定的时候,要关闭感应器。忽略这一点肯能导致几个小时就耗尽电池,注意当屏幕关闭时,系统不会自动关闭感应器。所以在注册传感器时一般并不在OnCreate函数中,而在onResume函数中.
所有的动作传感器都会返回三个浮点数值(通过长度为三的数组values),代表X,Y,Z三个轴上的数值。
下面是一个获取手机所有传感器的例子



public class MainActivity extends AppCompatActivity {
      private TextView tvSensors;
      private SensorManager sensorManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvSensors=(TextView)findViewById(R.id.tv);
        sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
        List<Sensor>sensors=
        sensorManager.getSensorList(Sensor.TYPE_ALL);
        for(Sensor sensor:sensors){
            tvSensors.append(sensor.getName()+"\n");
        }

    }
}

动作传感器

加速度传感器、重力传感器
1.定义SensorManager

 private SensorManager sensorManager;

2.初始化SensorManager

 sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);

3.为该类添加SensorEventListener接口

public class MotionSensorActivity extends AppCompatActivity  implements SensorEventListener

4.注册、卸载传感器

 @Override
    protected void onResume() {
        super.onResume();
        //注册传感器
        //三个参数  类的对象实例   传感器   采样率
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_UI);
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override
    protected void onPause() {
        super.onPause();
        //卸载传感器
        sensorManager.unregisterListener(this);
    }

5.当回传数据时,做出相应

@Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        switch (sensorEvent.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                final float alpha=(float) 0.8;
                gravity[0]=alpha*gravity[0]+(1-alpha)*sensorEvent.values[0];
                gravity[1]=alpha*gravity[1]+(1-alpha)*sensorEvent.values[1];
                gravity[2]=alpha*gravity[2]+(1-alpha)*sensorEvent.values[2];
                //消除噪声
                String accelerometer="加速度\n"+
                        "X:"+ (sensorEvent.values[0]-gravity[0])+"\n"+
                        "Y:"+ (sensorEvent.values[1]-gravity[1])+"\n"+
                        "Z:"+ (sensorEvent.values[2]-gravity[2])+"\n";
                Log.d("z", String.valueOf(sensorEvent.values[2]-gravity[2]));
                tv.setText(accelerometer);
                break;
            case Sensor.TYPE_GRAVITY:
                gravity[0]=sensorEvent.values[0];
                gravity[1]=sensorEvent.values[1];
                gravity[2]=sensorEvent.values[2];
                break;
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {

    }

方向传感器

用法和动作传感器完全一样,其中sensorEvent.values[0]代表绕着Z轴旋转的角度。如果Y轴(正常拿着手机)正对着北方,该值是0,如果Y轴,正对着南方,该值是180,如果Y轴,正对着东方,该值是90,如果Y轴,正对着西方,该值是270。
sensorEvent.values[1]代表绕着X轴旋转的角度。当从Z轴正方向朝着Y轴正方向,该值为正值,反之为负值,该值在(180,-180)之间。
sensorEvent.values[2]代表绕着Y轴旋转的角度。当从Z轴正方向朝着X轴正方向,该值为正值,反之为负值,该值在(180,-180)之间。

磁场传感器
sensorEvent.values[i] 分别表示沿着XYZ轴方向的磁力(uT,militesla)

邻近传感器
只返回一个值代表 手机证明吗邻近物理距离(cm)

环境传感器

环境传感器都只返回一个值sensorEvent.values[0],而且传感器返回的值很少受到杂音的影响。
返回值如下

最常见的环境传感器是钢线传感器,返回值的一般为:
这里写图片描述

传感器案例–指南针

指南针只需要一张图片,并总让图片反向转过方向传感器返回的第一个值即可。
代码如下
activity_compass.xml

<?xml version="1.0" encoding="utf-8"?>
<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: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="org.crazyit.sensor.Compass">
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/znz"
    android:src="@drawable/znz"/>
</RelativeLayout>

Compass.java

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;

public class Compass extends AppCompatActivity implements SensorEventListener {
   private ImageView imageView;
    private SensorManager sensorManager;
    float currentDegree;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_compass);
        currentDegree=0f;
        imageView=(ImageView) findViewById(R.id.znz);
        sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);


    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        switch (sensorEvent.sensor.getType()){
            case Sensor.TYPE_ORIENTATION:
               float degree=sensorEvent.values[0];
                //创建旋转动画
                RotateAnimation rotateAnimation=new RotateAnimation(currentDegree,-degree,
                        Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
                //设置动画持续时间
                rotateAnimation.setDuration(200);
                imageView.startAnimation(rotateAnimation);
                currentDegree=-degree;
                break;
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {

    }

    @Override
    protected void onResume() {
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                SensorManager.SENSOR_DELAY_GAME);
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        sensorManager.unregisterListener(this);
    }
}

最后附上程序中的图片
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值