Android 传感器开发(仿知乎摇一摇反馈问题功能)

最近用知乎的时候,偶然间发现摇一摇可以反馈问题,就想着做一个类似的功能,顺便梳理下关于sensor的知识。
先看看做出来的效果:

sample.gif

传感器中比较重要的几个类:
android.hardware.Sensor;
android.hardware.SensorEvent
android.hardware.SensorEventListener
okay,会这几个类就够用了,再记住一个回调方法,就能对付大多数的需求了

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

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
     
    }

下面让我回顾下传感器的知识:

Android 中传感器有很多,当你打出[Sensor.]的时候就会看到下面这样

image.png

下面还有好多,如果想详细研究下所有传感器可以看看这里 直达链接

Android的三大类传感器

动作(Motion)传感器、环境(Environmental)传感器、位置(Position)传感器

1.动作传感器

加速(accelerometer)传感器、重力(gravity)传感器、陀螺仪(gyroscope)传感器、旋转向量(rotational vector )传感器

我们摇一摇功能主要用的就是动作传感器中的加速传感器,动作传感器里有一个很吊的图,只要动作传感器肯定涉及到坐标,下图形象的说明了这个坐标系。


在加速传感器中:实现我上方说的那个回调

 @Override
    public void onSensorChanged(SensorEvent event) {
         float[] values = event.values;
    }

其中这三个值就代表着X,Y,Z方向的值
values[0]: Acceleration minus Gx on the x-axis
values[1]: Acceleration minus Gy on the y-axis
values[2]: Acceleration minus Gz on the z-axis

2.环境传感器

湿度(barometer)传感器、光线(photometer)传感器、温度(thermometer)传感器

3.位置传感器

方向(orientation)传感器、磁力(magnetometer)传感器

如何实现摇一摇反馈功能

1.显示出手机中所有的传感器

先获取SensorManager对象

SensorManager sensorManager = (SensorManager).getSystemService(SENSOR_SERVICE);

列出来所有的传感器

 List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

为了实现摇一摇功能,我写了一个叫shakeUtils工具类并且实现了SensorEventListener,这样我就需要实现下面两个方法

     /**
     * 传感器精度变化时回调
     */
 @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
     /**
     * 传感器数据变化时回调
     */
    @Override
    public void onSensorChanged(SensorEvent event) {
        int sensorType = event.sensor.getType();
        float[] values = event.values;
        if (sensorType == Sensor.TYPE_ACCELEROMETER) {
            //这里可以调节摇一摇的灵敏度
            if ((Math.abs(values[0]) > 12 || Math.abs(values[1]) > 12 || Math.abs(values[2]) > 12)) {
                System.out.println("sensor value == " + " " + values[0] + " " + values[1] + " " + values[2]);
                if (null != mOnShakeListener) {
                    mOnShakeListener.onShake();
                }
            }
        }

        if (sensorType == Sensor.TYPE_AMBIENT_TEMPERATURE) {
            //todo
        }
    }

在主函数里主要这样调用shakeUtils就行了:

 shakeUtils = new ShakeUtils(this);
        shakeUtils.setOnShakeListener(new ShakeUtils.OnShakeListener() {
            @Override
            public void onShake() {
                Toast.makeText(MainActivity.this, "摇了摇", Toast.LENGTH_SHORT).show();
                confirmDialog.setOnConfirmListener(new ConfirmDialog.OnConfirmClickListener() {
                    @Override
                    public void onFeedBack() {
                        gotoFeedBackActivity();
                    }

                    @Override
                    public void onScreenShot() {
                        saveScreenShoot(rootView);

                    }
                });
                confirmDialog.show();

            }
        });
    }

有一点需要注意一下,我们SensorManager让我们能拿到设备的sensors,但是当你不用sensors的时候,当你的activity处于pause的时候,sensor不会自动关闭的,这就会导致你的电池几个小时就会将电耗尽。例子里有一个

最后还是附上源码,有需要的朋友可以拿去用,直达链接。开源让我们不断进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android传感器定义 Android 传感器相关术语微机电传感器(MEMS)MEMS 通常制作在规格很小的硅芯...
    Jannonx阅读 4,428评论 0 1
  • 最近在搞一个自己的App,突发一个想法,给App加一个摇一摇随机查看图片的功能,这样可以使得用户在使用App的时候...
    _SOLID阅读 19,262评论 1 31
  • 文|静水流深思 秋天在看我 问,这么晚还不休息? 我把烧焦的木炭从篝火中取出 顺便砍下足以抵御严寒的木材 告诉几个...
    一日蜉蝣君阅读 171评论 0 2
  • 秋天,葡萄的功效堪比冬虫夏草,可惜很多人不知道~ 秋季是吃葡萄的好时机,你经常吃葡萄吗?吃葡萄有什么好处吗?葡萄该...
    湖南籍心旷神怡阅读 324评论 0 0
  • 无需太多别人的理解, 但需要对自己的呵护。
    暖风吹麦浪阅读 175评论 2 1