Android调用传感器和震动

介绍Sensor类

SDK只有一句介绍“Class representing a sensor. Use getSensorList(int) to get the list of available Sensors.”,表示一个感应器的类,可以使用getSensorList方法(此方法属于接下来要讲的SensorManager)获得所有可用的感应器,该方法返回的是一个List
下面的列表显示了,Sensor所提供的所有服务
Constants
int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type.
//三轴加速度感应器 返回三个坐标轴的加速度 单位m/s2
int TYPE_ALL A constant describing all sensor types.
//用于列出所有感应器
int TYPE_GRAVITY A constant describing a gravity sensor type.
//重力感应器
int TYPE_GYROSCOPE A constant describing a gyroscope sensor type
//陀螺仪 可判断方向 返回三个坐标轴上的角度
int TYPE_LIGHT A constant describing an light sensor type.
//光线感应器 单位 lux 勒克斯
int TYPE_LINEAR_ACCELERATION A constant describing a linear acceleration sensor type.
//线性加速度
int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type.
//磁场感应 返回三个坐标轴的数值 微特斯拉
int TYPE_ORIENTATION This constant is deprecated. use SensorManager.getOrientation() instead.
//方向感应器 已过时 可以使用方法获得
int TYPE_PRESSURE A constant describing a pressure sensor type
//压力感应器 单位 千帕斯卡
int TYPE_PROXIMITY A constant describing an proximity sensor type.
//距离传感器
int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type.
//翻转传感器
int TYPE_TEMPERATURE A constant describing a temperature sensor type
//温度传感器 单位 摄氏度
此类中包含的方法都是get型的 用来获取所选sensor的一些属性,sensor类一般不需要new而是通过SensorManager的方法获得

加速度感应器

可以通过这个感应器获得三个浮点型
x-axis
y-axis
z-axis
这里写图片描述

X Y Z分别对应values[0]到[2]
X表示左右移动的加速度
Y表示前后移动的加速度
Z表示垂直方向的加速度 (测试时发现,将手机置于水平桌面稳定后 XY均为0 Z的值为9.4 约等于重力加速度,依次可以做一个简单的算法实现重力测力计。)

//申请震动权限
<uses-permission android:name="android.permission.VIBRATE"/>
package com.zingon.ztc.gpstry;

import android.content.Context;
import android.hardware.SensorManager;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView inf;
    //感应器管理器,所有感应器都可以通过它获得
    SensorManager sm;
    //震动
    Vibrator vb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        inf=(TextView)findViewById(R.id.inf);
        //获得系统服务
        sm= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        vb= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        new SensorTry(sm,inf,vb).run();
    }
}
package com.zingon.ztc.gpstry;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Vibrator;
import android.util.Log;
import android.widget.TextView;

/**
 * Created by ztc on 16-3-9.
 */
public class SensorTry extends Thread{
    SensorManager sm;
    String TAG = "sensor";
    TextView inf;
    Vibrator vb;
    float x,y,z;
    public SensorTry(SensorManager sm,TextView inf,Vibrator vb){
        this.sm=sm;
        this.inf=inf;
        this.vb=vb;
    }

    @Override
    public void run() {
    //获得加速度传感器
        Sensor sensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        //注册监听器
        sm.registerListener(myListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    //监听器
    SensorEventListener myListener=new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){

                //图解中已经解释三个值的含义
                //当值变化超过 1 时,震动
                if(Math.abs(x-event.values[0])>=1||Math.abs(y-event.values[1])>=1||Math.abs(z-event.values[2])>=1) {
                    x = event.values[0];
                    y = event.values[1];
                    z = event.values[2];
                    Log.i(TAG,"onSensorChanged");
                    Log.i(TAG, "\n heading " + x);
                    Log.i(TAG, "\n pitch " + y);
                    Log.i(TAG, "\n roll " + z);
                    inf.setText("设备重力传感器\n\nX:");
                    inf.append(String.valueOf((int) x));
                    inf.append("\nY:");
                    inf.append(String.valueOf((int) y));
                    inf.append("\nZ:");
                    inf.append(String.valueOf((int) z));
                    // 停止 开启 停止 开启
                    long[] pattern = {100, 400, 100, 400};
                    vb.vibrate(pattern, -1);
                }
            }

        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            Log.i(TAG, "onAccuracyChanged");
        }
    };
}

效果

手机移动,就会震动
posted @ 2016-03-09 18:22  A_yes  阅读(217)  评论(0编辑  收藏  举报