广告
返回顶部
首页 > 资讯 > 移动开发 >Android传感器使用实例介绍
  • 113
分享到

Android传感器使用实例介绍

Android传感器开发Android传感器 2022-12-16 12:12:46 113人浏览 八月长安
摘要

目录传感器磁场传感器加速度传感器方向传感器传感器 1.mainActivity 实现SensorEventListerner 方法 2. 定义:SensORManage 对象 3.

传感器

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;
        
        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();
        }
        
        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传感器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android传感器使用实例介绍

本文链接: https://www.lsjlt.com/news/175026.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android传感器使用实例介绍
    目录传感器磁场传感器加速度传感器方向传感器传感器 1.mainActivity 实现SensorEventListerner 方法 2. 定义:SensorManage 对象 3. ...
    99+
    2022-12-16
    Android传感器开发 Android传感器
  • android 传感器(OnSensorChanged)使用介绍
    下面是API中定义的几个代表sensor的常量。 Int TYPE_ACCELEROMETER A constant d...
    99+
    2022-06-06
    传感器 Android
  • Android操作系统介绍之11种传感器
    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。接下来通过本文给大家介绍A...
    99+
    2022-06-06
    android操作系统 系统 传感器 Android
  • Android传感器编程带实例
      一、前言   我很喜欢电脑,可是笔记本还是太大,笔记本电脑再小还是要弄个小包背起来的,智能手机则不同,它完全是一个手机,可以随意装在一个口袋里随身携带。因此我在20...
    99+
    2022-06-06
    Android
  • Android 传感器--光照传感器详解及使用
    Android 设备中有许多传感器,其中有一个传感器控制着你屏幕亮度的变化。当你在很暗的地方使用手机,你设备的屏幕会自动调暗,从而保护你眼睛。 起着这样作用,Android是通...
    99+
    2022-06-06
    光照传感器 传感器 Android
  • android传感器怎么使用
    要使用Android传感器,首先需要在AndroidManifest.xml文件中声明所需的传感器权限。例如,要使用加速度传感器,可...
    99+
    2023-08-18
    android
  • Android中ListView使用示例介绍
    目录一、具体思路1、创建Listview控件3、写入4、读取5、创建对象,构造器,GETSET方法二、具体实施1、适配器2、数据库3、对象4、等等等等三、案例分享activity_m...
    99+
    2022-11-12
  • Android提高之蓝牙传感应用实例
    前面文章介绍了Android利用麦克风采集并显示模拟信号的实现方法,这种采集手段适用于无IO控制、单纯读取信号的情况。如果传感器本身需要包含控制电路(例如采集血氧信号需要红外和...
    99+
    2022-06-06
    Android 蓝牙
  • Android MaterialCardView的使用介绍与示例
    Android—MaterialCardView的使用 我们的征程是星辰大海,而非人间烟尘 文章目录 Android---MaterialCardView的使用演示xml布局其他的...
    99+
    2022-11-12
  • android实现手机传感器调用
    android传感器使用的demo,包括光线传感器,加速度传感器,距离传感器和方向传感器。 demo:下载地址 源码: package com.bobo.study.stud...
    99+
    2022-06-06
    调用 手机传感器 传感器 手机 Android
  • Android利用Sensor实现传感器功能
    本文实例为大家分享了Android利用Sensor实现传感器的具体代码,供大家参考,具体内容如下 一、传感器的使用 1、传感器的类型: 方向传感器::Sensor.TYPE_ORIE...
    99+
    2022-11-12
  • Android 获取传感器列表整理及简单实例
    Android 获取传感器列表整理及简单实例Android 4.4 (API等级19)支持以下传感器:   TYPE_ACCELEROMETER 加速度传感器,单位是m/s2,测量应用于设备X、Y、Z轴上的加速度 ...
    99+
    2023-05-31
    android 传感器 roi
  • Android传感器的简单使用方法
    本文实例为大家分享了Android传感器简单使用的具体代码,供大家参考,具体内容如下 1. SensorManager类 SensorManager类用来管理各个传感器:通过Sens...
    99+
    2022-11-13
  • Android中如何使用光线传感器
    Android中如何使用光线传感器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。获得感应器服务Android开发中要使用光线传感器,需要先获得系统传感器服务Context....
    99+
    2023-05-30
    android
  • 【Android】Binder(一)Binder的介绍和AIDL使用Binder的实例
    Binder介绍 Android 中的 Binder 是一个进程间通信机制,它允许不同进程之间相互调用方法和传递数据。Binder 主要用于实现系统服务和应用程序之间的通信,以及实现 IPC(Inte...
    99+
    2023-09-03
    android binder 网络
  • Android利用Senser实现不同的传感器
    传感器有不同的类型,以下是我列出的光线,加速度,风向传感器,在测试不同传感器的时候都需将传感器管理的onResume中sensorManager.registerListene...
    99+
    2022-06-06
    传感器 Android
  • Javainterrupt()方法使用实例介绍
    目录前言栗子一栗子二大栗子前言 进入正题之前还是先回顾一个会被问无数遍的问题: stop和interrupt的区别是什么? 简单的说就是,stop的话,那线程就真的结束了。 inte...
    99+
    2023-02-03
    Java interrupt() Java interrupt()方法使用
  • Android光线传感器使用方法详解
    本文实例为大家分享了Android光线传感器使用的具体代码,供大家参考,具体内容如下 一、首先是布局页面activity_light_sensor.xml <xml versi...
    99+
    2022-11-13
  • 怎么在Android中使用方向传感器
    怎么在Android中使用方向传感器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体如下:public class SensorHandActivity&...
    99+
    2023-05-30
    android
  • Android如何利用Sensor实现传感器功能
    小编给大家分享一下Android如何利用Sensor实现传感器功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下一、传感器的使用1、传感器的类型:方向传感器::Sensor.TYPE_ORIENTATION加速...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作