传感器(Sensor)系统可以让智能手机的功能更加丰富多彩,在Android系统中支持多种传感器。Android的Sensor系统涉及了Android的各个层次。

Android系统支持多种传感器,有的传感器已经在Android的框架中使用,大多数传感器由应用程序来使用。

Android传感器类型分为加速度、磁场、方向、光线、临近性、温度等,具体的如下表:

传感器

JAVA中的名称

本地接口名称

数值

加速度

TYPE_ACCELEROMETER

SENSOR_TYPE_ACCELEROMETER

1

磁力域

TYPE_MAGNETIC_FIELD

SENSOR_TYPE_MAGNETIC_FIELD

2

方向

TYPE_ORIENTATION

SENSOR_TYPE_ORIENTATION

3

陀螺

TYPE_GYROSCOPE

SENSOR_TYPE_GYROSCOPE

4

光线(亮度)

TYPE_LIGHT

SENSOR_TYPE_LIGHT

5

压力

TYPE_PRESSURE

SENSOR_TYPE_PRESSURE

6

温度

TYPE_TEMPERATURE

SENSOR_TYPE_TEMPERATURE

7

临近性

TYPE_PROXIMITY

SENSOR_TYPE_PROXIMITY

8

在程序中我们可以获取到移动设备上方向传感器、加速度传感器或其他传感器的信息,我们可以根据得到的数值与上一次得到的数值之间的关系来进行需要的操作。在指南针程序中我们主要需要获取方向的数据,因此我们在实验机上做了一个测试,获取了在不同情况下传感数值的变化规律。

下面是我们实验中测试到的数据(由于我们所用实验机HTCG6只支持方向传感器,我们只测试了方向传感器在不同状态下的数值变化关系):

手机状态

数值状态

数值范围

手机水平放置,顶部指向正

x、y、z方向值为0

0

水平逆时针旋转

x不断减少

360~0

水平顺时针旋转

x不断增大

0~360

当手机左侧抬起时

z不断减少

0~-180

当手机右侧抬起时

z不断增大

0~180

当手机顶部抬起时

y不断减少

0~-180

当手机底部抬起时

y不断增大

0~180

*注意:实验数据是基于实验机型号(HTCG6),其它型号的设备可能会有所不同。

经过实验,我们发现当手机顶部指向正北方时方向值为0,顶部指向正东方时方向值为90,顶部指向正南方时方向值为180,顶部指向正西方时方向值为270。根据这些数据我们就可以根据方向值的范围盘端当前我们的方位,可以确定指南针的读数。

程序界面非常简洁,一张指南针的图片与相关方位的度数。上方白色小箭头所指方向代表我们当前指向的方向。指南针图片会根据所向方位做出相应的旋转,上方度数也会做出适当的响应,显示当前方位和方向读数。

由于我只考虑在G6上能正常演示,G6的屏幕分辨率为320*480,相关的坐标值我也是根据这个分辨率确定的,移植到其他型号的手机上可能不能正常运行,但只需要修正一下代码就可以,这个希望读者自行修正。

具体步骤如下:

1.首先创建项目SDK版本选择2.1,工程命名为MyCompass

2.添加资源到res/drawable下,一张指南针的图片和白色小箭头图片,格式为透明PNG,注意图片文件名需要小写开头。

3.新建一个CompassView类,用于程序布局设置。

4.新建MyCompass类,这为主程序,在该类中获取传感器信息。

下面附上CompassView类和MyCompass类的代码,同时提供源程序的下载,如果有什么问题的话随时可以与我联系,我的qq:264965161,电子邮箱gsh0913@qq.com,本人非常乐意与大家一起交流,希望大家能共同进步。

源代码的下载地址:http://download.csdn.net/source/2885661

CompassView.java

[java] view plain copy
  1. packagecom.app;
  2. importandroid.content.Context;
  3. importandroid.graphics.Bitmap;
  4. importandroid.graphics.BitmapFactory;
  5. importandroid.graphics.Canvas;
  6. importandroid.graphics.Color;
  7. importandroid.graphics.Matrix;
  8. importandroid.graphics.Paint;
  9. importandroid.view.View;
  10. publicclassCompassViewextendsViewimplementsRunnable
  11. {
  12. privatePaint_mPaint=newPaint();
  13. privateString_message="正北0°";
  14. privatefloat_decDegree=0;
  15. privateBitmap_compass;
  16. privateBitmap_arrow;
  17. publicCompassView(Contextcontext)
  18. {
  19. super(context);
  20. //载入图片
  21. _compass=BitmapFactory.decodeResource(getResources(),R.drawable.compass);
  22. _arrow=BitmapFactory.decodeResource(getResources(),R.drawable.arrow);
  23. //开启线程否则无法更新画面
  24. newThread(this).start();
  25. }
  26. protectedvoidonDraw(Canvascanvas)
  27. {
  28. canvas.drawColor(Color.BLACK);
  29. _mPaint.setColor(Color.WHITE);
  30. _mPaint.setTextSize(30);
  31. _mPaint.setFlags(Paint.FAKE_BOLD_TEXT_FLAG);
  32. canvas.drawText(_message,75,50,_mPaint);
  33. //实现图像旋转
  34. Matrixmat=newMatrix();
  35. mat.reset();
  36. mat.setTranslate(15,100);
  37. mat.preRotate(-_decDegree,145,145);
  38. //绘制图像
  39. canvas.drawBitmap(_compass,mat,_mPaint);
  40. canvas.drawBitmap(_arrow,152,73,null);
  41. }
  42. @Override
  43. publicvoidrun()
  44. {
  45. while(!Thread.currentThread().isInterrupted())
  46. {
  47. try
  48. {
  49. Thread.sleep(100);
  50. }
  51. catch(InterruptedExceptione)
  52. {
  53. Thread.currentThread().interrupt();
  54. }
  55. postInvalidate();
  56. }
  57. }
  58. //更新指南针角度
  59. publicvoidsetDegree(floatdegree)
  60. {
  61. //设置灵敏度
  62. if(Math.abs(_decDegree-degree)>=2)
  63. {
  64. _decDegree=degree;
  65. intrange=22;
  66. StringdegreeStr=String.valueOf(_decDegree);
  67. //指向正北
  68. if(_decDegree>360-range&&_decDegree<360+range)
  69. {
  70. _message="正北"+degreeStr+"°";
  71. }
  72. //指向正东
  73. if(_decDegree>90-range&&_decDegree<90+range)
  74. {
  75. _message="正东"+degreeStr+"°";
  76. }
  77. //指向正南
  78. if(_decDegree>180-range&&_decDegree<180+range)
  79. {
  80. _message="正南"+degreeStr+"°";
  81. }
  82. //指向正西
  83. if(_decDegree>270-range&&_decDegree<270+range)
  84. {
  85. _message="正西"+degreeStr+"°";
  86. }
  87. //指向东北
  88. if(_decDegree>45-range&&_decDegree<45+range)
  89. {
  90. _message="东北"+degreeStr+"°";
  91. }
  92. //指向东南
  93. if(_decDegree>135-range&&_decDegree<135+range)
  94. {
  95. _message="东南"+degreeStr+"°";
  96. }
  97. //指向西南
  98. if(_decDegree>225-range&&_decDegree<225+range)
  99. {
  100. _message="西南"+degreeStr+"°";
  101. }
  102. //指向西北
  103. if(_decDegree>315-range&&_decDegree<315+range)
  104. {
  105. _message="西北"+degreeStr+"°";
  106. }
  107. }
  108. }
  109. //更新指示信息
  110. publicvoidsetMessage(Stringmessage)
  111. {
  112. _message=message;
  113. }
  114. }

MyCompass.java

[java] view plain copy
  1. packagecom.app;
  2. importjava.util.List;
  3. importandroid.app.Activity;
  4. importandroid.hardware.Sensor;
  5. importandroid.hardware.SensorEvent;
  6. importandroid.hardware.SensorEventListener;
  7. importandroid.hardware.SensorManager;
  8. importandroid.os.Bundle;
  9. publicclassMyCompassextendsActivityimplementsSensorEventListener
  10. {
  11. privateCompassView_compassView;
  12. privatebooleanmRegisteredSensor;
  13. //定义SensorManager
  14. privateSensorManagermSensorManager;
  15. /**Calledwhentheactivityisfirstcreated.*/
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState)
  18. {
  19. super.onCreate(savedInstanceState);
  20. _compassView=newCompassView(this);
  21. setContentView(_compassView);
  22. mRegisteredSensor=false;
  23. //取得SensorManager实例
  24. mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
  25. }
  26. @Override
  27. protectedvoidonResume()
  28. {
  29. super.onResume();
  30. //接受SensorManager的一个列表(Listener)
  31. //这里我们指定类型为TYPE_ORIENTATION(方向感应器)
  32. List<Sensor>sensors=mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
  33. if(sensors.size()>0)
  34. {
  35. Sensorsensor=sensors.get(0);
  36. //注册SensorManager
  37. //this->接收sensor的实例
  38. //接收传感器类型的列表
  39. //接受的频率
  40. mRegisteredSensor=mSensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_FASTEST);
  41. }
  42. }
  43. @Override
  44. protectedvoidonPause()
  45. {
  46. if(mRegisteredSensor)
  47. {
  48. //如果调用了registerListener
  49. //这里我们需要unregisterListener来卸载/取消注册
  50. mSensorManager.unregisterListener(this);
  51. mRegisteredSensor=false;
  52. }
  53. super.onPause();
  54. }
  55. //当进准度发生改变时
  56. //sensor->传感器
  57. //accuracy->精准度
  58. @Override
  59. publicvoidonAccuracyChanged(Sensorsensor,intaccuracy)
  60. {
  61. }
  62. //当传感器在被改变时触发
  63. @Override
  64. publicvoidonSensorChanged(SensorEventevent)
  65. {
  66. //接受方向感应器的类型
  67. if(event.sensor.getType()==Sensor.TYPE_ORIENTATION)
  68. {
  69. //这里我们可以得到数据,然后根据需要来处理
  70. floatx=event.values[SensorManager.DATA_X];
  71. _compassView.setDegree(x);
  72. }
  73. }
  74. }



来源:http://blog.csdn.net/tinya0913/article/details/6057637



更多相关文章

  1. Android(安卓)Audio Subsystem - AudioTrack - play
  2. android传感器
  3. android gps经纬度实时更新,获取卫星数量
  4. Android的SensorEventListener例子(摇晃手机)
  5. 【Android】Sensor框架HAL层解读
  6. Android(安卓)设置 横屏 竖屏
  7. Android传感器(一):传感器列表
  8. 多方向抽屉效果
  9. android 传感器的使用

随机推荐

  1. Oracle Namespace 说明
  2. 【DB笔试面试389】在Oracle中,什么是绑定
  3. PyCharm最新激活教程,不用激活码即可永久
  4. Oracle数据库安全管理
  5. 【静默】在RHEL 6.5上静默安装Oracle 18c
  6. shell脚本实战之编译mysql
  7. 【OGG】关于在一套复制环境中使用不同版
  8. 2021最新linux云计算课程大纲
  9. Mysql Cluster7.4.6安装与配置
  10. 【MySQL】MySQL的四种事务隔离级别