zoukankan      html  css  js  c++  java
  • (转)Android开发--常用的传感器总结

    随着手机的发展,现在各大手机支持的传感器类型也越来越多,在开发中利用传感器进行某些操作令人们有一种耳目一新的感觉,例如微信中的摇一摇,以及手机音乐播放器中的摇一摇切歌。今天来简单介绍下Android中传感器的使用以及一些常用的传感器。

    一、传感器的使用

    1.首先我们需要获得传感器管理对象:通过 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

    2.为SensorManager对象添加监听事件,通过SensorManage的registerListener方法可以为我们的传感器添加监听事件,该方法有多种重载形式,一般我们必须要提供一个listener对象并实现SensorEventListener接口,然后是传感器的类型(int类型值),或一个传感器Sensor对象(通过getDefaultSensor可以得到一个sensor对象)。

    在SensorEventListener接口中有两个重要的方法,

    1)public void onAccuracyChanged(Sensor sensor, int degree),当传感器的精准度发生改变时被调用,degree为新的传感器精度。

    2)public void onSensorChanged(SensorEvent event),传感器信息改变时执行该方法,其中event对象中的values成员中包含了我们所需要的传感器的重要信息,这是一个float数组值,一般根据传感器类型不同,该值也会不同,下面我会来介绍一下一些常用的传感器类型的values值得含义。一般我们在该方法中根据所获得的传感器信息来处理自己的事情。

    3.当我们不需要监听传感器时,通过一个unregisterListener方法来销毁注册。

    二、常用传感器类型介绍

    在前面我们已经知道SensorEvent中的values是一个获取传感器信息的重要变量,接下来就来介绍一些常用传感器的values含义。

    沿手机屏幕横向为x轴,向右为正;沿手机屏幕竖向为y轴,向上为正;垂直手机屏幕方向为z轴,向外为正。

    1.Sensor.TYPE_ACCELEROMETER:加速度感应传感器

    values[0]:x轴方向的重力加速度。

    values[1]:y轴方向的重力加速度。

    values[2]:z轴方向的重力加速度。

    2.Sensor.TYPE_GYROSCOPE: 陀螺仪传感器

    values[0]:沿x轴旋转的角速度。

    values[1]:沿y轴旋转的角速度。

    values[2]:沿z轴旋转的角速度。

    3.Sensor.TYPE_ORIENTATION:方向传感器

    旋转向量代表设备的结合的方向角和轴的设备通过一个角θ绕轴旋转< x,y,z >。

    values[0]:手机绕着z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果手机是水平放置,表示手机的正前方与正北方向的夹角就是该值。

    values[1]:手机绕着x轴旋转的角度。取值范围是-180到+180度之间。

    values[2]:手机绕着y轴旋转的角度。取值范围是-90到+90度之间。

    4.Sensor.TYPE_LIGHT:光线传感器

    values[0]:环境光水平勒克斯单位值。

    5.Sensor.TYPE_PRESSURE:压力传感器

    values[0]:大气压力值,单位帕。

    6.Sensor.TYPE_PROXIMITY: 近程感应器

    values[0]:以厘米为单位的距离值。

    7.Sensor.TYPE_RELATIVE_HUMIDITY:湿度传感器

    values[0]: 周围空气相对湿度百分比。

    8.Sensor.TYPE_TEMPERATURE: 温度传感器

    values[0]: 周围环境温度的摄氏度值。

    Android API中共定义了十几种传感器的类型,每一部手机不可能支持所有的传感器类型,当通过getDefaultSensor方法返回值为null时表示该手机不支持这种类型的传感器,当我们为不支持的传感器注册了监听事件,并不会引发异常,只是不能得到任何有效的数据。

    三、实践加速度传感器实现摇一摇功能

    接下来,我们通过代码来模拟一个摇一摇的功能,主要是通过加速度感应器来实现,当触发事件时,我们调用手机振动器,并一个Toast显示。调用手机震动提示时需要为我们的app添加权限。

    1
    <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
    接下来是我们的代码部分
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    package com.example.shaketest;
     
    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.os.Vibrator;
    import android.util.Log;
    import android.view.Menu;
    import android.widget.Toast;
     
    public class MainActivity extends Activity {
     
        private SensorManager mSensorManager;// 传感器管理类
        private Vibrator mVibrator;// 振动器
     
        private static final String TAG = "MainActivity";
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);// 获得手机振动器
        }
     
        @Override
        protected void onPause() {
            // TODO Auto-generated method stub
            super.onPause();
            if (mSensorManager != null) {
                mSensorManager.unregisterListener(mySensorListener);
            }
        }
     
        @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
     
            if (mSensorManager != null) {
                // 第一个参数是Listener,第二个参数是所得传感器类型,第三个参数值获取传感器信息的频率
                mSensorManager.registerListener(mySensorListener,
                        mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                        SensorManager.SENSOR_DELAY_NORMAL);
                // SensorManager.SENSOR_DELAY_NORMAL:默认的获得传感器数据的速度。
                // SensorManager.SENSOR_DELAY_GAME:如果利用传感器开发游戏,建议使用该值。
                // SensorManager.SENSOR_DELAY_UI:如果使用传感器更新UI中的数据,建议使用该值。
                 
            }
        }
     
        private SensorEventListener mySensorListener = new SensorEventListener() {
     
            @Override
            public void onAccuracyChanged(Sensor sensor, int degree) {
                // TODO Auto-generated method stub
                // 当传感器的精准度发生改变时被调用,int为新的传感器精度
            }
     
            @Override
            public void onSensorChanged(SensorEvent event) {
                // TODO Auto-generated method stub
                // 传感器信息改变时执行该方法
                float[] values = event.values;
                // 该变量最多只有3个元素,而且根据传感器的不同,values变量中元素所代表的含义也不同。
                float x = values[0]; // x轴方向的重力加速度
                float y = values[1]; // y轴方向的重力加速度
                float z = values[2]; // z轴方向的重力加速度
                // 设定重力加速度值,当摇晃到达该值时触发震动,并相应自己的事件
                int medumValue = 19;
                if (Math.abs(x) > medumValue) {
                    mVibrator.vibrate(500);
                    Log.w(TAG, "x_shake");
                    Log.w(TAG, "x轴::" + x + ";y轴::" + y + ";z轴::" + z);
                    Toast.makeText(MainActivity.this, "Shaking!!!!",
                            Toast.LENGTH_SHORT).show();
                }
                if (Math.abs(y) > medumValue) {
                    mVibrator.vibrate(500);
                    Log.w(TAG, "y_shake");
                    Log.w(TAG, "x轴::" + x + ";y轴::" + y + ";z轴::" + z);
                    Toast.makeText(MainActivity.this, "Shaking!!!!",
                            Toast.LENGTH_SHORT).show();
                }
                if (Math.abs(z) > medumValue) {
                    mVibrator.vibrate(500);
                    Log.w(TAG, "z_shake");
                    Log.w(TAG, "x轴::" + x + ";y轴::" + y + ";z轴::" + z);
                    Toast.makeText(MainActivity.this, "Shaking!!!!",
                            Toast.LENGTH_SHORT).show();
                }
            }
     
        };
     
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
     
    }


     摘自:http://www.2cto.com/kf/201502/375063.html

  • 相关阅读:
    SDP(12): MongoDB-Engine
    SDP(11):MongoDB-Engine功能实现
    SDP(10):文本式大数据运算环境-MongoDB-Engine功能设计
    React Native(五)——获取设备信息react-native-device-info
    React Native(四)——顶部以及底部导航栏实现方式
    去掉a标签
    React Native(三)——推送jpush-react-native
    react native (一)
    《JavaScript 秘密花园》
    正则表达式(overall)
  • 原文地址:https://www.cnblogs.com/antyi/p/4600300.html
Copyright © 2011-2022 走看看