分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow
欢迎来到传感器的世界。
传感器字面上的意思就是传递感觉的仪器,哪些感觉呢?
视觉、听觉、味觉、触觉、嗅觉等等。
所以有人说,传感器的存在和发展,让物体有了触觉、味觉和嗅觉等感官,让物体慢慢变得活了起来。
当前Android设备中已经集成进数十个传感器,我们比较常见的有加速度传感器、陀螺仪、地磁传感器等。
虽然种类繁多,但在Framework中仅仅提供了几个类和接口就把传感器相关的功能搞定了。下面我们以加速度传感器为例,引领大家走入Android传感器的世界。
传感器世界的坐标系
x轴:从左到右
y轴:从下到上
z轴:从内到外
这个坐标系与Android 2D API中的不同,传感器中的返回值都以此坐标系为准。
API概况
sensor相关API被放到了android.hardware包下,我们主要使用的类有三个:Sensor、SensorEvent、SensorManager以及一个SensorEventListener接口。
SensorManager顺其自然的担任起管理的工作,负责注册监听某Sensor的状态;Sensor的数据通过SensorEvent返回。
获得设备中所有可用sensor
SensorManager提供getSensorList方法,传入TYPE_ALL,即可得到当前设备所有传感器。
SensorManager sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); mTvInfo.setText("sensors: " + sensors.size()); Log.d(TAG, "sensors: " + sensors.size()); for (int i = 0;i < sensors.size();++i) { Log.d(TAG,"sensor name: "+sensors.get(i).getName()); Log.d(TAG,"sensor vendor: "+sensors.get(i).getVendor()); Log.d(TAG,"sensor power: "+sensors.get(i).getPower()); Log.d(TAG, "sensor resolution: " + sensors.get(i).getResolution()); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Sensor编码套路
public class SensorActivity extends Activity, implements SensorEventListener { private final SensorManager mSensorManager; private final Sensor mAccelerometer; public SensorActivity() { mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent event) { } }
- 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
不同的传感器被提取共性后,由上面的编码套路规定起来,一切就变得如此简单啦。
加速度传感器的背景
这里的加速度特指重力加速度,所以在静止时重力传感器的返回值与加速度传感器值相同。
地表上静止物体的重力加速度约为9.8 m/s^2.
借用SensorManager中的常量:
public static final float STANDARD_GRAVITY = 9.80665F;
我们可以借助三轴上的值来确定设备的状态(请参考上面的坐标图),比如:
1、当x轴的值接近重力加速度时,说明设备的左边朝下。
2、当x轴的值接近负的g值时,说明设备的右边朝下。
3、当y轴的值接近g值时,说明设备的下边超下(与上图一样)。
4、当y轴的值接近负的g值时,说明设备的上边朝下(倒置)。
5、当z轴的值接近g值时,说明设备的屏幕朝上。
6、当z轴的值接近负的g值时,说明设备屏幕朝下。
具体代码如下:
@Override public void onSensorChanged(SensorEvent sensorEvent) { Log.d("linc", "value size: " + sensorEvent.values.length); float xValue = sensorEvent.values[0];// Acceleration minus Gx on the x-axis float yValue = sensorEvent.values[1];//Acceleration minus Gy on the y-axis float zValue = sensorEvent.values[2];//Acceleration minus Gz on the z-axis mTvInfo.setText("x轴: "+xValue+" y轴: "+yValue+" z轴: "+zValue); if(xValue > mGravity) { mTvInfo.append("\n重力指向设备左边"); } else if(xValue < -mGravity) { mTvInfo.append("\n重力指向设备右边"); } else if(yValue > mGravity) { mTvInfo.append("\n重力指向设备下边"); } else if(yValue < -mGravity) { mTvInfo.append("\n重力指向设备上边"); } else if(zValue > mGravity) { mTvInfo.append("\n屏幕朝上"); } else if(zValue < -mGravity) { mTvInfo.append("\n屏幕朝下"); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow