资源描述
AndroidAndroid传感器传感器Android传感器1android硬件传感器硬件传感器Android传感器,分别包括加速度传感器(accelerometer),陀螺仪(gyroscope),环境光照传感器(light),磁力传感器(magneticfield),方向传感器(orientation),压力传感器(pressure),距离传感器(proximity)和温度传感器(temperature)。从Android1.5开始,系统内置了对多达八种传感器的支持,利用这些传感器我们可以制作出各种有趣的应用程序和游戏。在Android应用程序中使用传感器要依赖于android.hardware.SensorEventListener接口。通过该接口可以监听传感器的各种事件。android硬件传感器Android传感器,分别包括加速度2android硬件传感器硬件传感器传感器类型常量内部整数值中文名称Sensor.TYPE_ACCELEROMETER1加速度传感器Sensor.TYPE_MAGNETIC_FIELD2磁力传感器Sensor.TYPE_ORIENTATION3方向传感器Sensor.TYPE_GYROSCOPE4陀螺仪传感器Sensor.TYPE_LIGHT5环境光照传感器Sensor.TYPE_PRESSURE6压力传感器Sensor.TYPE_TEMPERATURE 7温度传感器Sensor.TYPE_PROXIMITY8距离传感器android硬件传感器传感器类型常量内部整数值中文名称3android硬件传感器硬件传感器从传感器管理器中获取其中某个或者某些传感器的方法有如下三种:第一种:获取某种传感器的默认传感器SensordefaultGyroscope=sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);第二种:获取某种传感器的列表ListpressureSensors=sensorManager.getSensorList(Sensor.TYPE_PRESSURE);第三种:获取所有传感器的列表,ListallSensors=sensorManager.getSensorList(Sensor.TYPE_ALL);android硬件传感器从传感器管理器中获取其中某个或者某些4android硬件传感器硬件传感器对于某一个传感器,它的一些具体信息的获取方法可以见下表:方法描述getMaximumRange()最大取值范围getName()设备名称getPower()功率getResolution()精度getType()传感器类型getVentor()设备供应商getVersion()设备版本号android硬件传感器对于某一个传感器,它的一些具体信息的5android硬件传感器硬件传感器SensorEventListener接口的代码如下:packageandroid.hardware;publicinterfaceSensorEventListenerpublicvoidonSensorChanged(SensorEventevent);publicvoidonAccuracyChanged(Sensorsensor,intaccuracy);在SensorEventListener接口中定义了两个方法:onSensorChanged和onAccuracyChanged。当传感器的值发生变化时,例如磁阻传感器的方向改变时会调用onSensorChanged方法。当传感器的精度变化时会调用onAccuracyChanged方法。android硬件传感器SensorEventListene6android硬件传感器硬件传感器onSensorChanged方法只有一个SensorEvent类型的参数event,其中SensorEvent类有一个values变量非常重要,该变量的类型是float。但该变量最多只有3个元素,而且根据传感器的不同,values变量中元素所代表的含义也不同。在解释values变量中元素的含义之前,先来介绍一下Android的坐标系统是如何定义X、Y、Z轴的。X轴的方向是沿着屏幕的水平方向从左向右。如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指向屏幕的顶端。将手机平放在桌子上,Z轴的方向是从手机里指向天空。android硬件传感器onSensorChanged方法只71.1方向传感器方向传感器在方向传感器中values变量的3个值都表示度数,它们的含义如下:values0:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values0的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘。values1:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values1的取值范围是-180values1180。假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values1的值应该是0。(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)1.1方向传感器在方向传感器中values变量的3个值都表81.1方向传感器方向传感器这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values1会在0到-180之间变化,也就是说,从手机顶部抬起时,values1的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values1会在0到180之间变化。也就是values1的值会逐渐增大,直到等于180。可以利用values1和下面要介绍的values2来测量桌子等物体的倾斜度。values2:表示手机沿着Y轴的滚动角度。取值范围是-90values290。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values2的值应为0。将手机左侧逐渐抬起时,values2的值逐渐变小,直到手机垂直于桌面放置,这时values2的值是-90。将手机右侧逐渐抬起时,values2的值逐渐增大,直到手机垂直于桌面放置,这时values2的值是90。在垂直位置时继续向右或向左滚动,values2的值会继续在-90至90之间变化。1.1方向传感器这时从手机顶部开始抬起,直到将手机沿X轴旋91.2加速传感器加速传感器该传感器的values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧向右侧移动,values0为负值;从右向左移动,values0为正值。要想使用相应的传感器,仅实现SensorEventListener接口是不够的,还需要使用下面的代码来注册相应的传感器。/获得传感器管理器SensorManagersm=(SensorManager)getSystemService(SENSOR_SERVICE);/注册方向传感器sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);1.2加速传感器该传感器的values变量的3个元素值分别101.2加速传感器加速传感器如果想注册其他的传感器,可以改变getDefaultSensor方法的第1个参数值,例如,注册加速传感器可以使用Sensor.TYPE_ACCELEROMETER。在Sensor类中还定义了很多传感器常量,但要根据手机中实际的硬件配置来注册传感器。如果手机中没有相应的传感器硬件,就算注册了相应的传感器也不起任何作用。getDefaultSensor方法的第2个参数表示获得传感器数据的速度。SensorManager.SENSOR_DELAY_FASTEST表示尽可能快地获得传感器数据。除了该值以外,还可以设置3个获得传感器数据的速度值,这些值如下:SENSOR_DELAY_FASTEST:以最快的速度获得传感器数据。SENSOR_DELAY_GAME:适合于在游戏中获得传感器数据。SENSOR_DELAY_UI:适合于在UI控件中获得传感器数据。SENSOR_DELAY_NORMAL:以一般的速度获得传感器的数据上面四种类型获得传感器数据的速度依次递减。从理论上说,获得传感器数据的速度越快,消耗的系统资源越大。因此建议读者根本实际情况选择适当的速度获得传感器的数据。1.2加速传感器如果想注册其他的传感器,可以改变getDe111.3重力感应器重力感应器重力传感器的类型常量是Sensor.TYPE_GRAVITY。重力传感器与加速度传感器使用同一套坐标系。values数组中三个元素分别表示了X、Y、Z轴的重力大小。AndroidSDK定义了一些常量,用于表示星系中行星、卫星和太阳表面的重力。下面就来温习一下天文知识,将来如果在地球以外用Android手机,也许会用得上。publicstaticfinalfloatGRAVITY_SUN=275.0f;publicstaticfinalfloatGRAVITY_MERCURY=3.70f;publicstaticfinalfloatGRAVITY_VENUS=8.87f;publicstaticfinalfloatGRAVITY_EARTH=9.80665f;publicstaticfinalfloatGRAVITY_MOON=1.6f;publicstaticfinalfloatGRAVITY_MARS=3.71f;publicstaticfinalfloatGRAVITY_JUPITER=23.12f;publicstaticfinalfloatGRAVITY_SATURN=8.96f;publicstaticfinalfloatGRAVITY_URANUS=8.69f;publicstaticfinalfloatGRAVITY_NEPTUNE=11.0f;1.3重力感应器重力传感器的类型常量是Sensor.TYP121.4 光线传感器光线传感器光线传感器的类型常量是Sensor.TYPE_LIGHT。values数组只有第一个元素(values0)有意义。表示光线的强度。最大的值是120000.0f。AndroidSDK将光线强度分为不同的等级,每一个等级的最大值由一个常量表示,这些常量都定义在SensorManager类中,代码如下:publicstaticfinalfloatLIGHT_SUNLIGHT_MAX=120000.0f;publicstaticfinalfloatLIGHT_SUNLIGHT=110000.0f;publicstaticfinalfloatLIGHT_SHADE=20000.0f;publicstaticfinalfloatLIGHT_OVERCAST=10000.0f;publicstaticfinalfloatLIGHT_SUNRISE=400.0f;publicstaticfinalfloatLIGHT_CLOUDY=100.0f;publicstaticfinalfloatLIGHT_FULLMOON=0.25f;publicstaticfinalfloatLIGHT_NO_MOON=0.001f;上面的八个常量只是临界值。读者在实际使用光线传感器时要根据实际情况确定一个范围。例如,当太阳逐渐升起时,values0的值很可能会超过LIGHT_SUNRISE,当values0的值逐渐增大时,就会逐渐越过LIGHT_OVERCAST,而达到LIGHT_SHADE,当然,如果天特别好的话,也可能会达到LIGHT_SUNLIGHT,甚至更高。1.4光线传感器光线传感器的类型常量是Sensor.TY131.5陀螺仪传感器陀螺仪传感器陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:values0:延X轴旋转的角速度。values1:延Y轴旋转的角速度。values2:延Z轴旋转的角速度。当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。陀螺仪传感器经常被用来计算手机已转动的角度,代码如下:privatestaticfinalfloatNS2S=1.0f/1000000000.0f;privatefloattimestamp;publicvoidonSensorChanged(SensorEventevent)if(timestamp!=0)1.5陀螺仪传感器陀螺仪传感器的类型常量是Sensor.T141.5陀螺仪传感器陀螺仪传感器/event.timesamp表示当前的时间,单位是纳秒(1百万分之一毫秒)finalfloatdT=(event.timestamp-timestamp)*NS2S;angle0+=event.values0*dT;angle1+=event.values1*dT;angle2+=event.values2*dT;timestamp=event.timestamp;上面代码中通过陀螺仪传感器相邻两次获得数据的时间差(dT)来分别计算在这段时间内手机延X、Y、Z轴旋转的角度,并将值分别累加到angle数组的不同元素上。1.5陀螺仪传感器151.6其他传感器其他传感器在前面几节介绍了加速度传感器、重力传感器、光线传感器、陀螺仪传感器以及方向传感器。除了这些传感器外,AndroidSDK还支持如下的几种传感器。关于这些传感器的使用方法以及与这些传感器相关的常量、方法,读者可以参阅官方文档。近程传感器(Sensor.TYPE_PROXIMITY)线性加速度传感器(Sensor.TYPE_LINEAR_ACCELERATION)旋转向量传感器(Sensor.TYPE_ROTATION_VECTOR)磁场传感器(Sensor.TYPE_MAGNETIC_FIELD)压力传感器(Sensor.TYPE_PRESSURE)温度传感器(Sensor.TYPE_TEMPERATURE)虽然AndroidSDK定义了十多种传感器,但并不是每一部手机都完全支持这些传感器。例如,GoogleNexusS支持其中的9种传感器(不支持压力和温度传感器),而HTCG7只支持其中的5种传感器。如果使用了手机不支持的传感器,一般不会抛出异常,但也无法获得传感器传回的数据。读者在使用传感器时最好先判断当前的手机是否支持所使用的传感器。1.6其他传感器在前面几节介绍了加速度传感器、重力传感器、16传感器的相关类库传感器的相关类库测试手机中有哪些传感器我们可以通过如下三步使用传感器。(1)编写一个截获传感器事件的类。该类必须实现android.hardware.SensorEventListener接口。(2)获得传感器管理对象(SensorManager对象)。(3)使用SensorManager.registerListener方法注册指定的传感器。通过上面三步已经搭建了传感器应用程序的框架。而具体的工作需要在SensorEventListener接口的onSensorChanged和onAccuracyChanged方法中完成。传感器的相关类库测试手机中有哪些传感器17传感器的相关类库传感器的相关类库SensorManager对象通过getSystemService方法获得,代码如下:SensorManagersensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);通常手机中包含了若干个传感器模块(如方向传感器、光线传感器等),因此,注册传感器需要指定传感器的类型,如下面的代码注册了光线传感器。sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),SensorManager.SENSOR_DELAY_FASTEST);registerListener方法有三个参数。第1个参数是实现SensorEventListener接口的对象。第2个参数用于指定传感器的类型。AndroidSDK预先定义了表示各种传感器的常量,这些常量都被放在Sensor类中。第3个参数表示传感器获得数据的速度。如果想停止获得传感器数据,可以使用unregisterSensor方法注销传感器事件对象。unregisterSensor方法的定义如下:publicvoidunregisterListener(SensorEventListenerlistener)传感器的相关类库SensorManager对象通过getSy18传感器的相关类库传感器的相关类库unregisterSensor方法有两个重载形式。第一个重载形式用于注销所有的传感器对象。第二个重载形式用于注销指定传感器的事件对象。其中Sensor对象通过SensorManager.getDefaultSensor方法获得。getDefaultSensor方法只有一个int类型的参数,表示传感器的类型。如Sensor.TYPE_LIGHT表示光线传感器。注意:一个传感器对像可以处理多个传感器。也就是说,一个实现SensorEventListener接口的类可以接收多个传感器传回的数据。为了区分不同的传感器,需要使用Sensor.getType方法来获得传感器的类型。传感器的相关类库unregisterSensor方法有两个重19传感器的相关类库传感器的相关类库通过SensorManager.getSensorList方法可以获得指定传感器的信息,也可以获得手机支持的所有传感器的信息,代码如下/获得光线传感器Listsensors=sensorManager.getSensorList(Sensor.TYPE_LIGHT);/获得手机支持的所有传感器Listsensors=sensorManager.getSensorList(Sensor.TYPE_ALL);传感器的相关类库通过SensorManager.getSen20传感器实例传感器实例下面给出一个完整的例子来演示如何获得传感器传回的数据。本例从如下4个传感器获得数据,同时输出了测试手机中支持的所有传感器名称。加速度传感器(Sensor.TYPE_ACCELEROMETER)磁场传感器(Sensor.TYPE_MAGNETIC_FIELD)光线传感器(Sensor.TYPE_LIGHT)方向传感器(TYPE_ORIENTATION)本例需要在真机上运行。由于不同的手机可能支持的传感器不同(有的手机并不支持AndroidSDK中定义的所有传感器),因此,如果运行程序后,无法显示某个传感器的数据,说明当前的手机并不支持这个传感器。传感器实例下面给出一个完整的例子来演示如何获得传感器传回的数21传感器实例传感器实例packagemobile.android.sensor;importjava.util.List;importandroid.app.Activity;importandroid.hardware.Sensor;importandroid.hardware.SensorEvent;importandroid.hardware.SensorEventListener;importandroid.hardware.SensorManager;importandroid.os.Bundle;importandroid.widget.TextView;publicclassMainextendsActivityimplementsSensorEventListenerprivateTextViewtvAccelerometer;privateTextViewtvMagentic;privateTextViewtvLight;privateTextViewtvOrientation;privateTextViewtvSensors;传感器实例packagemobile.android.s22传感器实例传感器实例OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);/获得SensorManager对象SensorManagersensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);/注册加速度传感器sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_FASTEST);/注册磁场传感器sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST);传感器实例Override23传感器实例传感器实例/注册光线传感器sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),SensorManager.SENSOR_DELAY_FASTEST);/注册方向传感器sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);tvAccelerometer=(TextView)findViewById(R.id.tvAccelerometer);tvMagentic=(TextView)findViewById(R.id.tvMagentic);tvLight=(TextView)findViewById(R.id.tvLight);tvOrientation=(TextView)findViewById(R.id.tvOrientation);tvSensors=(TextView)findViewById(R.id.tvSensors);传感器实例/注册光线传感器24传感器实例传感器实例/获得当前手机支持的所有传感器Listsensors=sensorManager.getSensorList(Sensor.TYPE_ALL);for(Sensorsensor:sensors)/输出当前传感器的名称tvSensors.append(sensor.getName()+n);OverridepublicvoidonSensorChanged(SensorEventevent)/通过getType方法获得当前传回数据的传感器类型switch(event.sensor.getType()传感器实例/获得当前手机支持的所有传感器25传感器实例传感器实例caseSensor.TYPE_ACCELEROMETER:/处理加速度传感器传回的数据Stringaccelerometer=加速度n+X:+event.values0+n+Y:+event.values1+n+Z:+event.values2+n;tvAccelerometer.setText(accelerometer);break;caseSensor.TYPE_LIGHT:/处理光线传感器传回的数据tvLight.setText(亮度:+event.values0);break;caseSensor.TYPE_MAGNETIC_FIELD:/处理磁场传感器传回的数据Stringmagentic=磁场n+X:+event.values0+n+Y:+event.values1+n+Z:+event.values2+n;tvMagentic.setText(magentic);break;传感器实例caseSensor.TYPE_ACCELER26传感器实例传感器实例电子罗盘实例。电子罗盘又叫电子指南针。其中N、S、W和E分别表示北、南、西和东4个方向。本例只使用了onSensorChanged事件方法及values0。由于指南针图像上方是北,当手机前方是正北时(values0=0),图像不需要旋转。但如果不是正北,就需要将图像按一定角度旋转。假设当前values0的值是60,说明方向在东北方向。也就是说,手机顶部由北向东旋转。这时如果图像不旋转,N的方向正好和正北的夹角是60度,需要将图像逆时针(从东向北旋转)旋转60度,N才会指向正北方。传感器实例电子罗盘实例。电子罗盘又叫电子指南针。其中N、S27传感器实例传感器实例publicvoidonSensorChanged(SensorEventevent)if(event.sensor.getType()=Sensor.TYPE_ORIENTATION)floatdegree=event.values0;/以指南针图像中心为轴逆时针旋转degree度RotateAnimationra=newRotateAnimation(currentDegree,-degree,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);/在200毫秒之内完成旋转动作ra.setDuration(200);传感器实例publicvoidonSensorChang28传感器实例传感器实例/开始旋转图像imageView.startAnimation(ra);/保存旋转后的度数,currentDegree是一个在类中定义的float类型变量currentDegree=-degree;上面的代码中使用了event.values数组中的数据来获得传感器传回的数据。这个values数组非常重要,它的长度为3。但不一定每一个数组元素都有意义。对于不同的传感器,每个数组元素的含义不同。注意:虽然使用Sensor.TYPE_ALL可以获得手机支持的所有传感器信息,但不能使用Sensor.TYPE_ALL注册所有的传感器,也就是getDefaultSensor方法的参数值必须是某个传感器的类型常量,而不能是Sensor.TYPE_ALL。传感器实例/开始旋转图像29传感器实例传感器实例计步器实例。还可以利用方向传感器做出更有趣的应用,例如利用values1或values2的变化实现一个计步器。由于人在走路时会上下振动,因此,可以通过判断values1或values2中值的振荡变化进行计步。基本原理是在onSensorChanged方法中计算两次获得values1值的差,并根据差值在一定范围之外开始计数。传感器实例计步器实例。30传感器实例传感器实例publicvoidonSensorChanged(SensorEventevent)if(flag)lastPoint=event.values1;flag=false;/当两个values1值之差的绝对值大于8时认为走了一步if(Math.abs(event.values1-lastPoint)8)/保存最后一步时的values1的峰值lastPoint=event.values1;/将当前计数显示在TextView组件中textView.setText(String.valueOf(+count);传感器实例publicvoidonSensorChang31传感器实例传感器实例本例设置3个按钮用于控制计步的状态,这3个按钮可以控制开始计步、重值(将计步数清0)和停止计步。这3个按钮的单击事件代码如下publicvoidonClick(Viewview)Stringmsg=;switch(view.getId()/开始计步caseR.id.btnStart:sm=(SensorManager)getSystemService(SENSOR_SERVICE);/注册方向传感器sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);msg=已经开始计步器.;break;传感器实例本例设置3个按钮用于控制计步的状态,这3个按钮可以32传感器实例传感器实例/重置计步器caseR.id.btnReset:count=0;msg=已经重置计步器.;break;/停止计步caseR.id.btnStop:/注销方向传感器sm.unregisterListener(this);count=0;msg=已经停止计步器.;break;textView.setText(String.valueOf(count);Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();运行本例后,单击【开始】按钮,将手机放在兜里,再走两步看看。传感器实例/重置计步器33传感器实例传感器实例录音器实例。通过上面的例子我们学会了如何获得某种类型的传感器,下面我通过一个实例来学会如何使用某一个类型的传感器。我们这里使用加速度传感器来实现这样一个功能:开启我们的录音程序放在你的口袋或者提包里,需要录音的时候把衣服整理一下,或者把提包挪动个位置,那么此时手机就会感受到变化从而开始录音。由此达到神不知鬼不觉的录音效果。说起来似乎有点神,其实做起来很简单,让我们开始吧。传感器实例录音器实例。34传感器实例传感器实例publicclassMainActivityextendsActivity/录音和停止按钮privateButtonrecordButton;privateButtonstopButton;/检测摇动相关变量privatelonginitTime=0;privatelonglastTime=0;privatelongcurTime=0;privatelongduration=0;privatefloatlast_x=0.0f;privatefloatlast_y=0.0f;privatefloatlast_z=0.0f;privatefloatshake=0.0f;privatefloattotalShake=0.0f;传感器实例publicclassMainActivity35传感器实例传感器实例/媒体录音器对象privateMediaRecordermr;/是否正在录音privatebooleanisRecoding=false;OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);/UI组件recordButton=(Button)this.findViewById(R.id.Button01);stopButton=(Button)this.findViewById(R.id.Button02);finalTextViewtx1=(TextView)this.findViewById(R.id.TextView01);/录音按钮点击事件recordButton.setOnClickListener(newView.OnClickListener()传感器实例/媒体录音器对象36传感器实例传感器实例OverridepublicvoidonClick(Viewv)/如果没有在录音,那么点击按钮可以开始录音if(!isRecoding)startRecord(););/停止按钮点击事件stopButton.setOnClickListener(newView.OnClickListener()OverridepublicvoidonClick(Viewv)initShake();/如果正在录音,那么可以停止录音if(mr!=null)mr.stop();mr.release();mr=null;recordButton.setText(录音);传感器实例Override37传感器实例传感器实例Toast.makeText(getApplicationContext(),录音完毕,Toast.LENGTH_LONG).show();isRecoding=false;);/获取传感器管理器SensorManagersm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);/获取加速度传感器SensoracceleromererSensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);/定义传感器事件监听器SensorEventListeneracceleromererListener=newSensorEventListener()OverridepublicvoidonAccuracyChanged(Sensorsensor,intaccuracy)/传感器数据变动事件OverridepublicvoidonSensorChanged(SensorEventevent)传感器实例Toast.makeText(getApplica38传感器实例传感器实例/如果没有开始录音的话可以监听是否有摇动事件,如果有摇动事件可以开始录音if(!isRecoding)/获取加速度传感器的三个参数floatx=event.valuesSensorManager.DATA_X;floaty=event.valuesSensorManager.DATA_Y;floatz=event.valuesSensorManager.DATA_Z;/获取当前时刻的毫秒数curTime=System.currentTimeMillis();/100毫秒检测一次if(curTime-lastTime)100)duration=(curTime-lastTime);/看是不是刚开始晃动if(last_x=0.0f&last_y=0.0f&last_z=0.0f)/last_x、last_y、last_z同时为0时,表示刚刚开始记录initTime=System.currentTimeMillis();传感器实例/如果没有开始录音的话可以监听是否有摇动事件,如39传感器实例传感器实例else/单次晃动幅度shake=(Math.abs(x-last_x)+Math.abs(y-last_y)+Math.abs(z-last_z)/duration*100;/把每次的晃动幅度相加,得到总体晃动幅度totalShake+=shake;/判断是否为摇动,这是我自己写的标准,不准确,只是用来做教学示例,别误会了_if(totalShake10&totalShake/(curTime-initTime)*100010)startRecord();initShake();tx1.setText(总体晃动幅度=+totalShake+n平均晃动幅度=+totalShake/(curTime-initTime)*1000);传感器实例else40传感器实例传感器实例last_x=x;last_y=y;last_z=z;lastTime=curTime;/在传感器管理器中注册监听器sm.registerListener(acceleromererListener,acceleromererSensor,SensorManager.SENSOR_DELAY_NORMAL);/开始录音publicvoidstartRecord()/把正在录音的标志设为真isRecoding=true;/存放文件Filefile=newFile(/sdcard/+YY+newDateFormat().format(yyyyMMdd_hhmmss,Calendar.getInstance(Locale.CHINA)+.amr);传感器实例last_x=x;41传感器实例传感器实例Toast.makeText(getApplicationContext(),正在录音,录音文件在+file.getAbsolutePath(),Toast.LENGTH_LONG).show();/创建录音对象mr=newMediaRecorder();/从麦克风源进行录音mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT);/设置输出格式mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);/设置编码格式mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);/设置输出文件mr.setOutputFile(file.getAbsolutePath();try/创建文件file.createNewFile();/准备录制mr.prepare();传感器实例Toast.makeText(getApplica42传感器实例传感器实例catch(IllegalStateExceptione)e.printStackTrace();catch(IOExceptione)e.printStackTrace();/开始录制mr.start();recordButton.setText(录音中);/摇动初始化publicvoidinitShake()lastTime=0;duration=0;curTime=0;initTime=0;last_x=0.0f;last_y=0.0f;last_z=0.0f;shake=0.0f;totalShake=0.0f;传感器实例catch(IllegalStateExce43传感器实例传感器实例微信的摇一摇功能微信的摇一摇功能在摇动手机的功能中,我们只用加速度传感器就行了。加速度传感器返回值的单位是加速度的单位m/s2(米每二次方秒),有三个方向的值分别是values0:x-axis方向加速度values1:y-axis方向加速度values2:z-axis方向加速度其中x,y,z方向的定义是以水平放置在的手机的右下脚为参照系坐标原点x方向就是手机的水平方向,右为正y方向就是手机的水平垂直方向,前为正y方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负所以说,你的手机放置的空间位置不同,它三个方向的加速度也不同。在这里,三个方向的加速度,与我们传统意义上的加速度(9.8m/s2)有所区别,需细细品味。传感器实例微信的摇一摇功能44传感器实例传感器实例/需要实现SensorEventListener接口publicclassLoversChoiseextendsActivityimplementsSensorEventListenerButtonclear;/定义sensor管理器privateSensorManagermSensorManager;/震动privateVibratorvibrator;publicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.loverschoise);/获取传感器管理服务mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);传感器实例/需要实现SensorEventListener45传感器实例传感器实例/震动vibrator=(Vibrator)getSystemService(Service.VIBRATOR_SERVICE);clear=(Button)findViewById(R.id.clear);clear.setOnClickListener(newButton.OnClickListener()OverridepublicvoidonClick(Viewarg0)/点击button后,给button按钮设置了textclear.setText(现在给button的text赋值喽););OverrideprotectedvoidonResume()super.onResume();/加速度传感器mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);传感器实例/震动vibr46传感器实例传感器实例OverrideprotectedvoidonStop()mSensorManager.unregisterListener(this);super.onStop();OverrideprotectedvoidonPause()mSensorManager.unregisterListener(this);super.onPause();OverridepublicvoidonAccuracyChanged(Sensorsensor,intaccuracy)/TODOAuto-generatedmethodstub/当传感器精度改变时回调该方法,Donothing.传感器实例Override47传感器实例传感器实例OverridepublicvoidonSensorChanged(SensorEventevent)/TODOAuto-generatedmethodstubintsensorType=event.sensor.getType();/values0:X轴,values1:Y轴,values2:Z轴floatvalues=event.values;if(sensorType=Sensor.TYPE_ACCELEROMETER)/*因为一般正常情况下,任意轴数值最大就在9.810之间,只有在你突然摇动手机*的时候,瞬时加速度才会突然增大或减少。*所以,经过实际测试,只需监听任一轴的加速度大于14的时候,改变你需要的设置*就OK了*/传感器实例Override48传感器实例传感器实例if(Math.abs(values0)14|Math.abs(values1)14|Math.abs(values2)14)/摇动手机后,设置button上显示的字为空clear.setText(null);/摇动手机后,再伴随震动提示vibrator.vibrate(500);传感器实例if(Math.abs(values0)149
展开阅读全文