传感器系统:SensorManager.java:实现传感器系统核心的管理类SensorManagerSensor.java:单一传感器的描述性文件SensorSensorEvent.java:表示传感器系统的事件类SensorEventSensorEventListener.java:传感器事件的监听者SensorEventListener接口SensorListener.java:传感器的监听者SensorListener接口(不推荐使用)在这里介绍一下加速度传感器也就是重力传感器:   

加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。

该数值包含地心引力的影响,单位是m/s^2。

将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。

将手机朝下放在桌面上,z轴为-9.81。

将手机向左倾斜,x轴为正值。

将手机向右倾斜,x轴为负值。

将手机向上倾斜,y轴为负值。

将手机向下倾斜,y轴为正值。

测试代码:
import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.view.Menu;import android.widget.TextView;public class MainActivity extends Activity {private TextView XT,ZT,YT,ACT;private SensorManager sm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取组件XT=(TextView)findViewById(R.id.XT);YT = (TextView)findViewById(R.id.YT);    ZT = (TextView)findViewById(R.id.ZT);       ACT = (TextView)findViewById(R.id.onAccuracyChanged);          //创建一个SensorManager来获取系统的传感器服务      sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);      //选取加速度感应器      int sensorType = Sensor.TYPE_ACCELEROMETER;                /*         * 注册事件         * 参数1 :SensorEventListener监听器         * 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor         * 参数3 :模式 可选数据变化的刷新频率         * */        sm.registerListener(mySensorListener,sm.getDefaultSensor(sensorType),SensorManager.SENSOR_DELAY_NORMAL);            }public void onPause(){sm.unregisterListener(mySensorListener);super.onPause();}    /*     * SensorEventListener接口的实现,需要实现两个方法     * 方法1 onSensorChanged 当数据变化的时候被触发调用     * 方法2 onAccuracyChanged 当获得数据的精度发生变化的时候被调用,比如突然无法获得数据时     * */    final SensorEventListener mySensorListener = new SensorEventListener(){        //重写onSensorChanged方法    public void onSensorChanged(SensorEvent sensorEvent){    if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){        //图解中已经解释三个值的含义    float X_lateral = sensorEvent.values[0];    float Y_longitudinal = sensorEvent.values[1];    float Z_vertical = sensorEvent.values[2];    XT.setText("x="+X_lateral);    YT.setText("y="+Y_longitudinal);    ZT.setText("z="+Z_vertical);    }    }        //重写onAccuracyChanged方法    public void onAccuracyChanged(Sensor sensor , int accuracy){    ACT.setText("onAccuracyChanged被触发");    }        };@Overridepublic 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;}}


测试结果:



可以看到x,y,z值的变化,设定一个阀值然后根据摇晃值判断是否进行功能,就可以达到重力感应实现功能的效果



在这里补充一个“重力感应类”,可以在程序中直接用的:

import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;public class NewSensor implements SensorEventListener {private SensorManager sm;//传感器管理private Sensor sensor;//传感器private Context context;//上下文//重力感应监听器private OnShakeListener shakeListener;//设置速度阀值private final int SPEED_SHRESHOLD = 4000;//两次检测的时间间隔private final int UPTATE_INTERVAL_TIME = 70;//上次检测时间private long lastUpdateTime;public NewSensor(Context c){this.context = c;start();}//开始检测public void start(){//获取系统传感器管理sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);//获得重力传感器sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//注册sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);}//停止检测   (用此方法停止对加速度传感器的使用)public void stop(){sm.unregisterListener(this);}//摇晃监听接口public interface OnShakeListener {public void onShake();}@Overridepublic void onSensorChanged(SensorEvent event) {//现在检测时间long currentUpdateTime = System.currentTimeMillis();//两次检测的时间间隔long timeInterval = currentUpdateTime - lastUpdateTime;  //判断是否达到了检测时间间隔if(timeInterval < UPTATE_INTERVAL_TIME) return;//现在的时间变成last时间lastUpdateTime = currentUpdateTime;//获取坐标float x = event.values[0];float y = event.values[1];float z = event.values[2];//转变float lastx = x;float lasty = y;float lastz = z;//获取变化值float changex = x-lastx;float changey = y-lasty;float changez = z-lastz;//计算摇晃值double speed = Math.sqrt(changex*changex + changey*changey + changez*changez)/timeInterval * 10000;//判断是否达到阀值if(speed>SPEED_SHRESHOLD){shakeListener.onShake();}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}}
直接在主类里面创建对象 然后在监听里可以实现(播放歌曲、切换图片等功能)

更多相关文章

  1. 20180505_android传感器种类及获取
  2. Android--About Android(欢迎修改、补充)
  3. 深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分
  4. [笔记]Sensor概述
  5. Graphics->Compass
  6. Android(安卓)sensor 大杂烩
  7. 修改Android屏幕默认旋转方向
  8. Android之如何获取手机中所有的传感器
  9. android 重力感应的使用

随机推荐

  1. 使用Android Studio调试smail源码
  2. Android:Error retrieving parent for it
  3. Android下拉列表
  4. android状态栏一体化(沉浸式状态栏)
  5. Android监听Home、电源键
  6. Caused by: java.lang.IllegalStateExcep
  7. android模拟器设置代理上网
  8. 【Android(安卓)framework】AndroidManag
  9. android:allowClearUserData
  10. 安卓自定义属性,Android(安卓)studio无法