Android传感器使用实例介绍

目录
  • 传感器
  • 磁场传感器
  • 加速度传感器
  • 方向传感器

传感器

1.mainActivity 实现SensorEventListerner 方法

2. 定义:SensorManage 对象

3. 在重写的onResum 方法中 为重力和光线传感器注册监听器 sensorManage.registerListener()

4. 在实现的onSensorChanged 方法中 获取传感器的类型

5. 借助硬件 从软件接口上使用光线传感器,根据外界屏幕亮度 修改屏幕亮度

package com.mingrisoft;
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.widget.EditText;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
    EditText textGRAVITY, textLIGHT;  //传感器输出信息的编辑框
    private SensorManager sensorManager;  //定义传感器管理
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textGRAVITY = (EditText) findViewById(R.id.textGRAVITY); //获取重力传感器输出信息的编辑框
        textLIGHT = (EditText) findViewById(R.id.textLIGHT);     //获取光线传感器输出信息的编辑框
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  //获取传感器管理
    }
    @Override
    protected void onResume() {
        super.onResume();
        //为重力传感器注册监听器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
                SensorManager.SENSOR_DELAY_GAME);
        //为光线传感器注册监听器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
                SensorManager.SENSOR_DELAY_GAME);
    }
    @Override
    protected void onPause() {  //取消注册监听器
        sensorManager.unregisterListener(this);
        super.onPause();
    }
    @Override
    protected void onStop() {  //取消注册监听器
        sensorManager.unregisterListener(this);
        super.onStop();
    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        float[] values = event.values;  //获取X、Y、Z三轴的输出信息
        int sensorType = event.sensor.getType();  //获取传感器类型
        StringBuilder stringBuilder = null;
        switch (sensorType) {
            case Sensor.TYPE_GRAVITY:
                stringBuilder = new StringBuilder();
                stringBuilder.append("X轴横向重力值:");
                stringBuilder.append(values[0]);
                stringBuilder.append("\nY轴纵向重力值:");
                stringBuilder.append(values[1]);
                stringBuilder.append("\nZ轴向上重力值:");
                stringBuilder.append(values[2]);
                textGRAVITY.setText(stringBuilder.toString());
                break;
            case Sensor.TYPE_LIGHT:
                stringBuilder = new StringBuilder();
                stringBuilder.append("光的强度值:");
                stringBuilder.append(values[0]);
                textLIGHT.setText(stringBuilder.toString());
                break;
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
}

磁场传感器

  • 自定义的View 实现SensorEventListener 接口
  • 获取注册磁场传感器,获取传感器值
  • 根据X,Y轴绘制指针
package com.example.myapplication;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.AttributeSet;
import android.view.View;
public class PointerView extends View implements SensorEventListener {
    //定义指针位图
    private Bitmap pointer = null;
    //定义传感器三轴的输出信息
    private float[] allValue;
    //定义传感器管理
    private SensorManager sensorManager;
    public PointerView(Context context, AttributeSet attrs) {
        super(context);
        // 获取需要绘制的指针图
        pointer = BitmapFactory.decodeResource(super.getResources(),
               R.drawable.pointer );
        // 获取传感器
        sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        //为磁场传感器注册监听器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                SensorManager.SENSOR_DELAY_GAME);
    }
    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        if(sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD ){
            float value[] = sensorEvent.values; //获取磁场传感器三轴的输出信息
            allValue = value; // 保存输出信息
            super.postInvalidate(); // 刷新界面
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint p = new Paint();
        if (allValue != null) {
            float x = allValue[0];
            float y = allValue[1];
            // 重置图像
            canvas.translate(super.getWidth() / 2, super.getHeight() / 2);
            try{
                canvas.restore();
            }catch (Exception e) {
            }
            if (y == 0 && x > 0) {
                canvas.rotate(90);    // 旋转角度为90度
            } else if (y == 0 && x < 0) {
                canvas.rotate(270);    // 旋转角度为270度
            } else {
                //通过三角函数tanh()方法计算旋转角度
                if (y >= 0) {
                    canvas.rotate((float) Math.tanh(x / y) * 90);
                } else {
                    canvas.rotate(180 + (float) Math.tanh(x / y) * 90);
                }
            }
        }
        // 绘制指针
        canvas.drawBitmap(this.pointer,  -this.pointer.getWidth() / 2,
                -this.pointer.getHeight() / 2, p);

    }
}

加速度传感器

package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.app.Service;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
    private SensorManager sensorManager;  //定义传感器管理器
    private Vibrator vibrator;            //定义振动器
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  // 获取传感器管理器
        vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);  //获取振动器服务
    }
    @Override
    protected void onResume() {
        super.onResume();
        //为加速度传感器注册监听器
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_GAME);
    }
    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            float[] values = sensorEvent.values;  //获取传感器X、Y、Z三个轴的输出信息
            if (values[0] > 15 || values[1] > 15 || values[2] > 20) {
                // 加速度传感器上速度大于某个阈值 启动摇一摇
                Toast.makeText(MainActivity.this, "摇一摇", Toast.LENGTH_SHORT).show();
                //创建AlertDialog.Builder对象
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
                alertDialog.setView(R.layout.packet);     //添加布局文件
                alertDialog.show();                        //显示alertDialog
                vibrator.vibrate(500);
                sensorManager.unregisterListener(this);  //取消注册监听器
            }
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
    }
}

方向传感器

  • 手机的摆放状态
  • 手机在水平方向翘起角度,手机在Y轴翘起角度
  • 加速度传感器 + 磁场传感器实现方向创亲戚
  • getRoationMatrix() 获取到其R数组
  • SensorManager.getOrientation 获取弧度
package com.example.myapplication;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
public class SpiritLevelView  extends View  implements SensorEventListener {
    private Bitmap bubble;         // 定义水平仪中的小蓝球位图
    private int MAX_ANGLE = 30;   // 定义水平仪最大倾斜角,超过该角度,小蓝球将直接位于边界
    private int bubbleX, bubbleY; // 定义水平仪中小蓝球的X、Y坐标
    public SpiritLevelView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        bubble = BitmapFactory   // 加载小蓝球图片
                .decodeResource(getResources(), R.drawable.bubble);

        SensorManager sensorManager = (SensorManager) context
                .getSystemService(Context.SENSOR_SERVICE);   // 获取传感器管理
        sensorManager.registerListener(this,  //为磁场传感器注册监听器
                sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                SensorManager.SENSOR_DELAY_GAME);
        sensorManager.registerListener(this,  //为加速度传感器注册监听器
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_GAME);
    }
    // 定义加速度传感器
    float[] accelerometerValues = new float[3];
    // 定义磁感器加速器
    float[] magneticValues = new float[3];
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {          //如果当前为加速度传感器
            accelerometerValues = event.values.clone();                    //将取出的值放到加速度传感器取值数组中
        } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {  //如果当前为磁场传感器
            magneticValues = event.values.clone();                         //将取出的值放到磁场传感器取值数组中
        }
        float[] R = new float[9];                                           //创建存放旋转数据的取值数组
        float[] values = new float[3];                                        //创建存放方向数据的取值数组
        SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
        SensorManager.getOrientation(R, values);                              //获取方向Z轴、X轴、Y轴信息值
        float xAngle = (float) Math.toDegrees(values[1]);  // 获取与X轴的夹角
        float yAngle = (float) Math.toDegrees(values[2]);   // 获取与Y轴的夹角
        getPosition(xAngle,yAngle); //获取小蓝球的位置坐标
        super.postInvalidate();  // 刷新界面
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
    }
    //根据x轴和y轴的旋转角度确定小蓝球的位置
    private  void getPosition(float xAngle,float yAngle){
        // 小蓝球位于中间时(水平仪完全水平),小蓝球的X、Y坐标
        int x = (super.getWidth() - bubble.getWidth()) / 2;
        int y = (super.getHeight() - bubble.getHeight()) / 2;
        /********控制小球的X轴位置******/
        if (Math.abs(yAngle) <= MAX_ANGLE) {   // 如果Y轴的倾斜角度还在最大角度之内
            // 根据Y轴的倾斜角度计算X坐标的变化值(倾斜角度越大,X坐标变化越大)
            int deltaX = (int) ((super.getWidth() - bubble.getWidth()) / 2 * yAngle / MAX_ANGLE);
            x -= deltaX;
        } else if (yAngle > MAX_ANGLE) {  // 如果Y轴的倾斜角度已经大于MAX_ANGLE,小蓝球在最左边
            x = 0;
        } else {  // 如果与Y轴的倾斜角已经小于负的MAX_ANGLE,小蓝球在最右边
            x = super.getWidth() - bubble.getWidth();
        }
        /********控制小球的Y轴位置******/
        if (Math.abs(xAngle) <= MAX_ANGLE) {  // 如果X轴的倾斜角度还在最大角度之内
            // 根据X轴的倾斜角度计算Y坐标的变化值(倾斜角度越大,Y坐标变化越大)
            int deltaY = (int) ((super.getHeight() - bubble.getHeight()) / 2 * xAngle / MAX_ANGLE);
            y += deltaY;
        } else if (xAngle > MAX_ANGLE) {  // 如果与X轴的倾斜角度已经大于MAX_ANGLE,小蓝球在最下边
            y = super.getHeight() - bubble.getHeight();
        } else {  // 如果X轴的倾斜角已经小于负的MAX_ANGLE,小蓝球在最上边
            y = 0;
        }
        //更新小蓝球的坐标
        bubbleX = x;
        bubbleY = y;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(bubble, bubbleX, bubbleY, null);   // 根据小蓝球坐标绘制小蓝球
    }
}

到此这篇关于Android传感器使用实例介绍的文章就介绍到这了,更多相关Android传感器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android实现传感器功能

    Android传感器概述:动作传感器.环境传感器.位置传感器等,如方向传感器(电子罗盘).重力传感器(横纵切换).Android SDK支持的传感器并不是每一部Android手机均支持. 动作传感器:在三个轴上测量加速度和旋转角度,包括加速度.重力.陀螺仪: 环境传感器:测量环境参数,包括湿度.光线.温度: 位置传感器:测量设备物理位置,包括方向.磁力. ASF(Android传感器框架)功能:确定当前Android设备内置传感器:确定传感器技术指标,如传感器测量的最大范围.制造商等:获取传感器

  • Android传感器数据获取的方法

    本文实例为大家分享了Android传感器数据获取的具体代码,供大家参考,具体内容如下 接着上篇wifi列表获取,我们这篇接着说传感器.还是看代码 我们先自己定义一个传感器的工具类(因为我这边只是获取了部分的传感器,需要获取额外的传感器自己配置一下就行了,工具类通过重载提供了不同的构造方法): public class SensorUtils implements SensorEventListener { private SensorManager manager; /** * @param c

  • Android 如何获取传感器的数据方法详解

    目录 1 传感器简介 2 传感器的使用 2.1 获取传感器服务 2.2 获取待监听的传感器 2.3 注册传感器的监听器 2.4 注销传感器的监听器 3 示例代码 1 传感器简介 传感器 Sensor 是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输.处理.存储.显示.记录和控制等要求. Android 提供了对设备传感器的支持,只要 Android 设备的硬件提供了这些传感器,Android 应用可以通过传感器来获取设备

  • Android传感器的简单使用方法

    本文实例为大家分享了Android传感器简单使用的具体代码,供大家参考,具体内容如下 1. SensorManager类 SensorManager类用来管理各个传感器:通过SensorManager创建实例,并用getSystemService(SENSOR_SERVICE)获取传感器服务.使用其getSensorList()方法,可以获取所有可用的传感器该方法返回一个List<Sensor>,即Sensor对象的列表.注意:当不使用或Activity暂停的时候,要关闭感应器:屏幕关闭时,系

  • Android采集传感器数据并显示的方法

    本文实例为大家分享了Android采集传感器数据并显示的具体代码,供大家参考,具体内容如下 需要的知识 Android 项目主配置文件 AndroidManifest.xml Android Activity 概念 Android Sensor 接口 Android UI 布局管理器.文本框组件.编辑框组件 代码及解释 1.布局文件,用于控制UI界面显示,这里使用了表格布局管理器和四个行,每一行之中有四列,其中外面的两列是为了让中间两列居中,而中间两列分别是一个显示数据来源的TextView文本

  • Android获取设备传感器的方法

    本文实例为大家分享了Android获取设备传感器的具体代码,供大家参考,具体内容如下 结果示例: xml代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.c

  • Android光线传感器使用方法详解

    本文实例为大家分享了Android光线传感器使用的具体代码,供大家参考,具体内容如下 一.首先是布局页面activity_light_sensor.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http:/

  • Android实现接近传感器

    本文实例为大家分享了Android实现接近传感器的具体代码,供大家参考,具体内容如下 1.接近传感器检测物体与听筒(手机)的距离,单位是厘米. 一些接近传感器只能返回远和近两个状态,如我的手机魅族E2只能识别到两个距离:0CM(近距离)和5CM(远距离) 因此,接近传感器将最大距离返回远状态,小于最大距离返回近状态. 接近传感器可用于接听电话时自动关闭LCD屏幕以节省电量. 一些芯片集成了接近传感器和光线传感器两者功能(魅族E2). 2.代码如下: MainActivity.class pack

  • 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.Se

  • Android传感器使用实例介绍

    目录 传感器 磁场传感器 加速度传感器 方向传感器 传感器 1.mainActivity 实现SensorEventListerner 方法 2. 定义:SensorManage 对象 3. 在重写的onResum 方法中 为重力和光线传感器注册监听器 sensorManage.registerListener() 4. 在实现的onSensorChanged 方法中 获取传感器的类型 5. 借助硬件 从软件接口上使用光线传感器,根据外界屏幕亮度 修改屏幕亮度 package com.mingr

  • 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图片处理实例介绍(图)

    1.图片处理 1.圆角图片 复制代码 代码如下: /**     * 转换成圆角     *      * @param bmp     * @param roundPx     * @return     */    public static Bitmap convertToRoundedCorner(Bitmap bmp, float roundPx) { Bitmap newBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight()

  • Android中Activity组件实例介绍

    目录 Activity 概述 启动 Activity 的两种情况 关闭 Activity 总结 Activity 概述 在 Android 应用中,提供了 4 大基本组件,分别是 Activity.Service.BroadcastReceiver 和 ContentProvider.而 Activity 是 Android 应用最常见的组件之一.Activity 的中文意思是活动.在 Android 中,Activity 代表手机或者平板电脑中的一屏,它提供了和用户交互的可视化界面.在一个 A

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

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

  • Android 自定义状态栏实例代码

    一.目标:Android5.0以上 二.步骤 1.在res-values-colors.xml下新建一个RGB颜色 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#3

  • Android getevent用法实例详解

     Android getevent用法实例详解 最近在测试设备按键的常用命令,感觉这些命令都有的,但就是不知道怎么查找. 翻阅了几篇博文,才发现有一个getevent,就是指这样的命令. 首先需要说明的是getevent命令后面可以带上具体的input设备,列如getevent /dev/iput/event0,这样可以过滤掉一些不用显示的input的设备. 我在之前的使用中,还是有些找不到点子,也是一步一步使用起来的. 首先看-p 选项, -p选项用于输出input设备相关的一些信息,列如,

  • Android 日期选择器实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //出生年月设置 private void birthSetting() { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_YEAR, 1); new DatePickerDialog(mContext, new DatePickerDialog.OnDateSetListener() { @Override public void onDat

  • Android 滑动拦截实例代码解析

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package demo.hq.com.fby; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; /** * Created by huqing on 2016/12/7.

  • Android 指纹功能实例代码

    最近在做项目的时候遇到了添加打开app图像解锁的功能,自己嘴欠说现在都用指纹功能,自己给自己挖了一个坑,真是没谁了 从网上看了一些资料,但是给我demo考虑的不是很多,设备支不支持都没考虑,如果支持的话是否添加过指纹也不知道,其实方法都很简单. 废话不多说,贴上工具类和使用方法 package com.tsm.test; import android.annotation.TargetApi; import android.app.Activity; import android.app.Key

随机推荐