版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android 传感器,教学目的 本章主要讲述Android中传感器的种类、功能、相关的类库及传感器的使用方法。 知识要点 1 传感器的种类、功能 2 传感器的相关类库 3 传感器的应用实例,1,android硬件传感器,Android传感器,分别包括加速度传感器(accelerometer),陀螺仪(gyroscope),环境光照传感器(light),磁力传感器(magnetic field),方向传感器(orientation),压力传感器(pressure),距离传感器(proximity)和温度传感器(temperature) 。 从Android1.5开始,系统内置了对多达八种传感器
2、的支持,利用这些传感器我们可以制作出各种有趣的应用程序和游戏。 在Android应用程序中使用传感器要依赖于android.hardware.SensorEventListener接口。通过该接口可以监听传感器的各种事件。,2,android硬件传感器,传感器类型常量内部整数值中文名称 Sensor.TYPE_ACCELEROMETER1加速度传感器 Sensor.TYPE_MAGNETIC_FIELD2磁力传感器 Sensor.TYPE_ORIENTATION3方向传感器 Sensor.TYPE_GYROSCOPE4陀螺仪传感器 Sensor.TYPE_LIGHT5环境光照传感器 Senso
3、r.TYPE_PRESSURE6压力传感器 Sensor.TYPE_TEMPERATURE7温度传感器 Sensor.TYPE_PROXIMITY8距离传感器,3,android硬件传感器,从传感器管理器中获取其中某个或者某些传感器的方法有如下三种: 第一种:获取某种传感器的默认传感器 Sensor defaultGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 第二种:获取某种传感器的列表 List pressureSensors = sensorManager.getSensorList(Sensor.TY
4、PE_PRESSURE); 第三种:获取所有传感器的列表, List allSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);,4,android硬件传感器,对于某一个传感器,它的一些具体信息的获取方法可以见下表: 方法描述 getMaximumRange()最大取值范围 getName()设备名称 getPower()功率 getResolution()精度 getType()传感器类型 getVentor()设备供应商 getVersion()设备版本号,5,android硬件传感器,SensorEventListener接口的代
5、码如下: package android.hardware; public interface SensorEventListener public void onSensorChanged(SensorEvent event); public void onAccuracyChanged(Sensor sensor, int accuracy); 在SensorEventListener接口中定义了两个方法:onSensorChanged和onAccuracyChanged。当传感器的值发生变化时,例如磁阻传感器的方向改变时会调用onSensorChanged方法。当传感器的精度变化时会调用
6、onAccuracyChanged方法。,6,android硬件传感器,onSensorChanged方法只有一个SensorEvent类型的参数event,其中SensorEvent类有一个values变量非常重要,该变量的类型是float。但该变量最多只有3个元素,而且根据传感器的不同,values变量中元素所代表的含义也不同。 在解释values变量中元素的含义之前,先来介绍一下Android的坐标系统是如何定义X、Y、Z轴的。 X轴的方向是沿着屏幕的水平方向从左向右。如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。 Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指
7、向屏幕的顶端。 将手机平放在桌子上,Z轴的方向是从手机里指向天空。,7,1.1方向传感器,在方向传感器中values变量的3个值都表示度数,它们的含义如下: values0:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values0的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘。 values1:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values1的取值范围是-180values1 180。假设将手机屏幕
8、朝上水平放在桌子上,这时如果桌子是完全水平的,values1的值应该是0。 (由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值),8,1.1方向传感器,这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values1会在0到-180之间变化,也就是说,从手机顶部抬起时,values1的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values1会在0到180之间变化。也就是values1的值会逐渐增大,直到等于180。可以利用values1和下面要介绍的values2来
9、测量桌子等物体的倾斜度。 values2:表示手机沿着Y轴的滚动角度。取值范围是-90values290。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values2的值应为0。将手机左侧逐渐抬起时,values2的值逐渐变小,直到手机垂直于桌面放置,这时values2的值是-90。将手机右侧逐渐抬起时,values2的值逐渐增大,直到手机垂直于桌面放置,这时values2的值是90。在垂直位置时继续向右或向左滚动,values2的值会继续在-90至90之间变化。,9,1.2加速传感器,该传感器的values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧
10、向右侧移动,values0为负值;从右向左移动,values0为正值。要想使用相应的传感器,仅实现SensorEventListener接口是不够的,还需要使用下面的代码来注册相应的传感器。 / 获得传感器管理器 SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE); / 注册方向传感器 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST);,10,1.
11、2加速传感器,如果想注册其他的传感器,可以改变getDefaultSensor方法的第1个参数值,例如,注册加速传感器可以使用Sensor.TYPE_ACCELEROMETER。在Sensor类中还定义了很多传感器常量,但要根据手机中实际的硬件配置来注册传感器。如果手机中没有相应的传感器硬件,就算注册了相应的传感器也不起任何作用。 getDefaultSensor方法的第2个参数表示获得传感器数据的速度。SensorManager.SENSOR_DELAY_ FASTEST表示尽可能快地获得传感器数据。除了该值以外,还可以设置3个获得传感器数据的速度值,这些值如下: SENSOR_DELAY_
12、FASTEST:以最快的速度获得传感器数据。 SENSOR_DELAY_GAME:适合于在游戏中获得传感器数据。 SENSOR_DELAY_UI:适合于在UI控件中获得传感器数据。 SENSOR_DELAY_NORMAL:以一般的速度获得传感器的数据 上面四种类型获得传感器数据的速度依次递减。从理论上说,获得传感器数据的速度越快,消耗的系统资源越大。因此建议读者根本实际情况选择适当的速度获得传感器的数据。,11,1.3重力感应器,重力传感器的类型常量是Sensor.TYPE_GRAVITY。重力传感器与加速度传感器使用同一套坐标系。values数组中三个元素分别表示了X、Y、Z轴的重力大小。A
13、ndroid SDK定义了一些常量,用于表示星系中行星、卫星和太阳表面的重力。下面就来温习一下天文知识,将来如果在地球以外用Android手机,也许会用得上。 public static final float GRAVITY_SUN= 275.0f; public static final float GRAVITY_MERCURY= 3.70f; public static final float GRAVITY_VENUS= 8.87f; public static final float GRAVITY_EARTH= 9.80665f; public static final floa
14、t GRAVITY_MOON= 1.6f; public static final float GRAVITY_MARS= 3.71f; public static final float GRAVITY_JUPITER= 23.12f; public static final float GRAVITY_SATURN= 8.96f; public static final float GRAVITY_URANUS= 8.69f; public static final float GRAVITY_NEPTUNE= 11.0f;,12,1.4 光线传感器,光线传感器的类型常量是Sensor.T
15、YPE_LIGHT。values数组只有第一个元素(values0)有意义。表示光线的强度。最大的值是120000.0f。Android SDK将光线强度分为不同的等级,每一个等级的最大值由一个常量表示,这些常量都定义在SensorManager类中,代码如下: public static final float LIGHT_SUNLIGHT_MAX =120000.0f; public static final float LIGHT_SUNLIGHT=110000.0f; public static final float LIGHT_SHADE=20000.0f; public stat
16、ic final float LIGHT_OVERCAST= 10000.0f; public static final float LIGHT_SUNRISE= 400.0f; public static final float LIGHT_CLOUDY= 100.0f; public static final float LIGHT_FULLMOON= 0.25f; public static final float LIGHT_NO_MOON= 0.001f; 上面的八个常量只是临界值。读者在实际使用光线传感器时要根据实际情况确定一个范围。例如,当太阳逐渐升起时,values0的值很可能
17、会超过LIGHT_SUNRISE,当values0的值逐渐增大时,就会逐渐越过LIGHT_OVERCAST,而达到LIGHT_SHADE,当然,如果天特别好的话,也可能会达到LIGHT_SUNLIGHT,甚至更高。,13,1.5陀螺仪传感器,陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:values0:延X轴旋转的角速度。 values1:延Y轴旋转的角速度。 values2:延Z轴旋转的角速度。 当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。陀螺仪传感器经常被用来计算手机已转动的角度,代码如下: private
18、static final float NS2S = 1.0f / 1000000000.0f; private float timestamp; public void onSensorChanged(SensorEvent event) if (timestamp != 0) ,14,1.5陀螺仪传感器, / event.timesamp表示当前的时间,单位是纳秒(1百万分之一毫秒) final float dT = (event.timestamp - timestamp) * NS2S; angle0 += event.values0 * dT; angle1 += event.valu
19、es1 * dT; angle2 += event.values2 * dT; timestamp = event.timestamp; 上面代码中通过陀螺仪传感器相邻两次获得数据的时间差(dT)来分别计算在这段时间内手机延X、 Y、Z轴旋转的角度,并将值分别累加到angle数组的不同元素上。,15,1.6其他传感器,在前面几节介绍了加速度传感器、重力传感器、光线传感器、陀螺仪传感器以及方向传感器。除了这些传感器外,Android SDK还支持如下的几种传感器。关于这些传感器的使用方法以及与这些传感器相关的常量、方法,读者可以参阅官方文档。 近程传感器(Sensor.TYPE_PROXIMIT
20、Y) 线性加速度传感器(Sensor.TYPE_LINEAR_ACCELERATION) 旋转向量传感器(Sensor.TYPE_ROTATION_VECTOR) 磁场传感器(Sensor.TYPE_MAGNETIC_FIELD) 压力传感器(Sensor.TYPE_PRESSURE) 温度传感器(Sensor.TYPE_TEMPERATURE) 虽然AndroidSDK定义了十多种传感器,但并不是每一部手机都完全支持这些传感器。例如,Google Nexus S支持其中的9种传感器(不支持压力和温度传感器),而HTC G7只支持其中的5种传感器。如果使用了手机不支持的传感器,一般不会抛出异常
21、,但也无法获得传感器传回的数据。读者在使用传感器时最好先判断当前的手机是否支持所使用的传感器。,16,传感器的相关类库,测试手机中有哪些传感器 我们可以通过如下三步使用传感器。 (1)编写一个截获传感器事件的类。该类必须实现android.hardware.SensorEventListener接口。 (2)获得传感器管理对象(SensorManager对象)。 (3)使用SensorManager.registerListener方法注册指定的传感器。 通过上面三步已经搭建了传感器应用程序的框架。而具体的工作需要在SensorEventListener接口的onSensorChanged和o
22、nAccuracyChanged方法中完成。,17,传感器的相关类库,SensorManager对象通过getSystemService方法获得,代码如下:SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 通常手机中包含了若干个传感器模块(如方向传感器、光线传感器等),因此,注册传感器需要指定传感器的类型,如下面的代码注册了光线传感器。 sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.T
23、YPE_LIGHT), SensorManager.SENSOR_DELAY_FASTEST); registerListener方法有三个参数。第1个参数是实现SensorEventListener接口的对象。第2个参数用于指定传感器的类型。AndroidSDK预先定义了表示各种传感器的常量,这些常量都被放在Sensor类中。第3个参数表示传感器获得数据的速度。 如果想停止获得传感器数据,可以使用unregisterSensor方法注销传感器事件对象。 unregisterSensor方法的定义如下: public voidunregisterListener(SensorEventList
24、ener listener),18,传感器的相关类库,unregisterSensor方法有两个重载形式。第一个重载形式用于注销所有的传感器对象。第二个重载形式用于注销指定传感器的事件对象。其中Sensor对象通过SensorManager.getDefaultSensor方法获得。 getDefaultSensor方法只有一个int类型的参数,表示传感器的类型。如Sensor.TYPE_LIGHT表示光线传感器。 注意:一个传感器对像可以处理多个传感器。也就是说,一个实现SensorEventListener接口的类可以接收多个传感器传回的数据。为了区分不同的传感器,需要使用Sensor.g
25、etType方法来获得传感器的类型。,19,传感器的相关类库,通过SensorManager.getSensorList方法可以获得指定传感器的信息,也可以获得手机支持的所有传感器的信息,代码如下 /获得光线传感器 Listsensors = sensorManager.getSensorList(Sensor.TYPE_LIGHT); /获得手机支持的所有传感器 Listsensors = sensorManager.getSensorList(Sensor.TYPE_ALL);,20,传感器实例,下面给出一个完整的例子来演示如何获得传感器传回的数据。本例从如下4个传感器获得数据,同时输出了
26、测试手机中支持的所有传感器名称。 加速度传感器(Sensor.TYPE_ACCELEROMETER) 磁场传感器(Sensor.TYPE_MAGNETIC_FIELD) 光线传感器(Sensor.TYPE_LIGHT) 方向传感器(TYPE_ORIENTATION) 本例需要在真机上运行。由于不同的手机可能支持的传感器不同(有的手机并不支持Android SDK中定义的所有传感器),因此,如果运行程序后,无法显示某个传感器的数据,说明当前的手机并不支持这个传感器。,21,传感器实例,package mobile.android. sensor; import java.util.List; i
27、mport android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.widget.TextView; public class Main extends Activity implements SensorEventList
28、ener private TextView tvAccelerometer; private TextView tvMagentic; private TextView tvLight; private TextView tvOrientation; private TextView tvSensors;,22,传感器实例,Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); / 获得SensorMan
29、ager对象 SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); / 注册加速度传感器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST); / 注册磁场传感器 sensorManager.registerListener(this, sensorManager.getDefau
30、ltSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_FASTEST);,23,传感器实例,/ 注册光线传感器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_FASTEST); / 注册方向传感器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sen
31、sor.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
32、= (TextView)findViewById(R.id.tvSensors);,24,传感器实例,/ 获得当前手机支持的所有传感器 List sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); for(Sensor sensor:sensors) / 输出当前传感器的名称 tvSensors.append(sensor.getName() + n); Override public void onSensorChanged(SensorEvent event) / 通过getType方法获得当前传回数据的传感器类型 switch
33、(event.sensor.getType() ,25,传感器实例,case Sensor.TYPE_ACCELEROMETER: / 处理加速度传感器传回的数据 String accelerometer = 加速度n + X: + event.values0 + n + Y: + event.values1 + n + Z: + event.values2 + n; tvAccelerometer.setText(accelerometer); break; case Sensor.TYPE_LIGHT: / 处理光线传感器传回的数据 tvLight.setText(亮度: + event.
34、values0); break; case Sensor.TYPE_MAGNETIC_FIELD: / 处理磁场传感器传回的数据 String magentic = 磁场n + X: + event.values0 + n + Y: + event.values1 + n + Z: + event.values2 + n; tvMagentic.setText(magentic); break;,26,传感器实例,电子罗盘 实例。电子罗盘又叫电子指南针。其中N、S、W和E分别表示北、南、西和东4个方向。 本例只使用了onSensorChanged事件方法及values0。由于指南针图像上方是北
35、,当手机前方是正北时(values0=0),图像不需要旋转。但如果不是正北,就需要将图像按一定角度旋转。假设当前values0的值是60,说明方向在东北方向。也就是说,手机顶部由北向东旋转。这时如果图像不旋转,N的方向正好和正北的夹角是60度,需要将图像逆时针(从东向北旋转)旋转60度,N才会指向正北方。,27,传感器实例,public void onSensorChanged(SensorEvent event) if (event.sensor.getType() = Sensor.TYPE_ORIENTATION) float degree = event.values0; / 以指南针
36、图像中心为轴逆时针旋转degree度 RotateAnimation ra = new RotateAnimation(currentDegree, -degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); / 在200毫秒之内完成旋转动作 ra.setDuration(200);,28,传感器实例,/ 开始旋转图像 imageView.startAnimation(ra); / 保存旋转后的度数,currentDegree是一个在类中定义的float类型变量 currentDegree = -d
37、egree; 上面的代码中使用了event.values数组中的数据来获得传感器传回的数据。这个values数组非常重要,它的长度为3。但不一定每一个数组元素都有意义。对于不同的传感器,每个数组元素的含义不同。 注意:虽然使用Sensor.TYPE_ALL可以获得手机支持的所有传感器信息,但不能使用Sensor.TYPE_ALL注册所有的传感器,也就是getDefaultSensor方法的参数值必须是某个传感器的类型常量,而不能是Sensor.TYPE_ALL。,29,传感器实例,计步器 实例。 还可以利用方向传感器做出更有趣的应用,例如利用values1或values2的变化实现一个计步器。
38、由于人在走路时会上下振动,因此,可以通过判断values1或values2中值的振荡变化进行计步。基本原理是在onSensorChanged方法中计算两次获得values1值的差,并根据差值在一定范围之外开始计数 。,30,传感器实例,public void onSensorChanged(SensorEvent event) if (flag) lastPoint = event.values1; flag = false; / 当两个values1值之差的绝对值大于8时认为走了一步 if (Math.abs(event.values1 - lastPoint) 8) / 保存最后一步时的v
39、alues1的峰值 lastPoint = event.values1; / 将当前计数显示在TextView组件中 textView.setText(String.valueOf(+count); ,31,传感器实例,本例设置3个按钮用于控制计步的状态,这3个按钮可以控制开始计步、重值(将计步数清0)和停止计步。这3个按钮的单击事件代码如下 public void onClick(View view) String msg = ; switch (view.getId() / 开始计步 case R.id.btnStart: sm = (SensorManager) getSystemSer
40、vice(SENSOR_SERVICE); / 注册方向传感器 sm.registerListener(this, sm .getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST); msg = 已经开始计步器.; break;,32,传感器实例,/ 重置计步器 case R.id.btnReset: count = 0; msg = 已经重置计步器.; break; / 停止计步 case R.id.btnStop: / 注销方向传感器 sm.unregisterListener(this);
41、 count = 0; msg = 已经停止计步器.; break; textView.setText(String.valueOf(count); Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); 运行本例后,单击【开始】按钮,将手机放在兜里,再走两步看看 。,33,传感器实例,录音器实例。 通过上面的例子我们学会了如何获得某种类型的传感器,下面我通过一个实例来学会如何使用某一个类型的传感器。我们这里使用加速度传感器来实现这样一个功能:开启我们的录音程序放在你的口袋或者提包里,需要录音的时候把衣服整理一下,或者把提包挪动个位置,那么此
42、时手机就会感受到变化从而开始录音。由此达到神不知鬼不觉的录音效果。说起来似乎有点神,其实做起来很简单,让我们开始吧。,34,传感器实例,public class MainActivity extends Activity /录音和停止按钮 private Button recordButton; private Button stopButton; /检测摇动相关变量 private long initTime = 0; private long lastTime = 0; private long curTime = 0; private long duration = 0; private
43、 float last_x = 0.0f; private float last_y = 0.0f; private float last_z = 0.0f; private float shake = 0.0f; private float totalShake = 0.0f;,35,传感器实例,/媒体录音器对象 private MediaRecorder mr; /是否正在录音 private boolean isRecoding = false; Override public void onCreate(Bundle savedInstanceState) super.onCreate
44、(savedInstanceState); setContentView(R.layout.main); / UI组件 recordButton = (Button) this.findViewById(R.id.Button01); stopButton = (Button) this.findViewById(R.id.Button02); final TextView tx1 = (TextView) this.findViewById(R.id.TextView01); / 录音按钮点击事件 recordButton.setOnClickListener(new View.OnClic
45、kListener() ,36,传感器实例,Override public void onClick(View v) /如果没有在录音,那么点击按钮可以开始录音 if(!isRecoding) startRecord(); ); / 停止按钮点击事件 stopButton.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) initShake(); /如果正在录音,那么可以停止录音 if (mr != null) mr.stop(); mr.release(); mr = null
46、; recordButton.setText(录音);,37,传感器实例,Toast.makeText(getApplicationContext(), 录音完毕, Toast.LENGTH_LONG).show(); isRecoding = false; ); / 获取传感器管理器 SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); / 获取加速度传感器 Sensor acceleromererSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELER
47、OMETER); / 定义传感器事件监听器 SensorEventListener acceleromererListener = new SensorEventListener() Override public void onAccuracyChanged(Sensor sensor, int accuracy) /传感器数据变动事件 Override public void onSensorChanged(SensorEvent event) ,38,传感器实例,/如果没有开始录音的话可以监听是否有摇动事件,如果有摇动事件可以开始录音 if(!isRecoding) /获取加速度传感器的
48、三个参数 float x = event.valuesSensorManager.DATA_X; float y = event.valuesSensorManager.DATA_Y; float z = event.valuesSensorManager.DATA_Z; /获取当前时刻的毫秒数 curTime = System.currentTimeMillis(); /100毫秒检测一次 if (curTime - lastTime) 100) duration = (curTime - lastTime); / 看是不是刚开始晃动 if (last_x = 0.0f ,39,传感器实例,
49、 else / 单次晃动幅度 shake = (Math.abs(x - last_x) + Math.abs(y - last_y) + Math.abs(z - last_z) / duration * 100; /把每次的晃动幅度相加,得到总体晃动幅度 totalShake += shake; / 判断是否为摇动,这是我自己写的标准,不准确,只是用来做教学示例,别误会了_ if (totalShake 10 ,40,传感器实例,last_x = x; last_y = y; last_z = z; lastTime = curTime; ; /在传感器管理器中注册监听器 sm.regis
50、terListener(acceleromererListener, acceleromererSensor, SensorManager.SENSOR_DELAY_NORMAL); / 开始录音 public void startRecord() /把正在录音的标志设为真 isRecoding = true; /存放文件 File file = new File(/sdcard/ + YY + new DateFormat().format(yyyyMMdd_hhmmss, Calendar.getInstance(Locale.CHINA) + .amr);,41,传感器实例,Toast.
51、makeText(getApplicationContext(), 正在录音,录音文件在 + file.getAbsolutePath(), Toast.LENGTH_LONG).show(); / 创建录音对象 mr = new MediaRecorder(); / 从麦克风源进行录音 mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT); / 设置输出格式 mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); / 设置编码格式 mr.setAudioEncoder(MediaRec
52、order.AudioEncoder.DEFAULT); / 设置输出文件 mr.setOutputFile(file.getAbsolutePath(); try / 创建文件 file.createNewFile(); / 准备录制 mr.prepare();,42,传感器实例, catch (IllegalStateException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); / 开始录制 mr.start(); recordButton.setText(录音中); /摇动初始化 public v
53、oid initShake() 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; ,43,传感器实例,微信的摇一摇功能 在摇动手机的功能中,我们只用加速度传感器就行了。加速度传感器返回值的单位是加速度的单位 m/s2(米每二次方秒),有三个方向的值分别是values0: x-axis 方向加速度values1: y-axis 方向加速度values2: z-axis 方向加速度其中x,y,z方向的定义是以水平放置在的手机的右下脚为参照系坐标原点x 方向就是手机的水平方向,右为正y 方向就是手机的水平垂直方向,前为正y 方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负所以说,你的手机放置的空间位置不同,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 野生动物疫病防治工岗前健康知识考核试卷含答案
- 石脑油吸附分离装置操作工技术应用测试考核试卷含答案
- 石英晶体元器件制造工安全防护知识考核试卷含答案
- 计算机软件测试员操作评估知识考核试卷含答案
- 苯乙烯-丙烯腈树脂(SAN)装置操作工规章能力考核试卷含答案
- 生活垃圾转运分拣工创新方法模拟考核试卷含答案
- 健康宣教病友
- 化妆品话术-标准模板
- 2026年其他运输设备制造业检测标准体系建设
- 2026年电力系统稳定控制装置配置
- 放弃经济补偿协议书
- 《PLC应用项目工单实践教程》课件 模块4 S7-1500 PLC其它基础指令应用
- 物业管理消防安全责任人职责清单
- 桥墩施工方案审核要点
- (高清版)DB12∕T 1350-2024运动处方技术服务规范
- 血管导管相关感染预防与控制指南
- 影视基地建筑合同
- DB3301-T 65.15-2024 反恐怖防范系统管理规范 第15部分:电网企业
- 保洁作业指导书
- GB/T 2910.11-2024纺织品定量化学分析第11部分:某些纤维素纤维与某些其他纤维的混合物(硫酸法)
- 解分式方程50题八年级数学上册
评论
0/150
提交评论