Android平台支持的丰富的传感器是其亮点之一,虽然相比iPhone来说稍有逊色,但相对于原来占据智能市场的Synbian等手机平台有一个明显的飞跃。我们现在看到的旅游出行必备的指南针,甩一甩就显示火苗的模拟打火机都是基于Android内置的传感器。本文主要向大家介绍一下传感器的类型和调用方法,并根据Android官方实例打造一个纯手工的指南针程序。

传感器类型介绍

Android库中显示的可支持的传感器类型共有11种,但是并不是每部手机都装置了所有的传感器,比如我手头的这款HTC G7就只有5种传感器。这全部11种包括,加速度(accelerometer),磁场(magnetic field),方位角(orientation),陀螺仪(gyroscope),光线(light),压力(pressure),温度(temperature), 周围物体感应(proximity),重力(gravity),线性加速度(linear acceleration),旋转矢量(rotation vector)。
在接下来的演示的代码中,我们从手机设备中读出所有的的传感器,下面是我的手机里面的传感器设备:加速度传感器(BMA150 3-axis Accelerometer),磁场传感器(AK8973 3-axis Magnetic field sensor),方位角传感器(AK8973 Orientation sensor),周围物体传感器(CM3602 Proximity sensor),光线传感器(CM3602 Light sensor)。

使用传感器

Android提供的API中对于不同传感器的调用都是用同一个接口,这样编程起来显得非常简单。先得到传感器的控制器,然后注册你感兴趣的感应事件,代码如下

?
1
2
3
4
5
6
7
SensorManager SensorManager
     = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
//注册方位角传感器,感应事件的周期是0.12s产生一次报告
mSensorManager.registerListener(mListener,
             SensorManager.SENSOR_ORIENTATION,
             SensorManager.SENSOR_DELAY_NORMAL
);

如果想要获得其他感应事件,只需要修改第二个参数为相应的传感器对应的枚举数值,第三个参数是感应事件的频率,设置感应事件频率,有四种频率模式可选,每个相差0.04s。然后设置一个监听器,利用监听接口onSensorChanged来读取具体感应的内容

?
1
2
3
4
5
6
7
8
9
public void onSensorChanged(int sensor, float[] values)
 {
       if (Config.DEBUG)
       {
            Log.d(TAG, "极方位角azimuth," + values[0]);
            Log.d(TAG, "倾斜角pitch," + values[1]);
            Log.d(TAG, "转角roll," + values[2]);
       }
}

感应矢量的参照坐标系

对于矢量感应,比如方位角,磁场,陀螺仪等等,它们都有自己的参照坐标系,并且都不相同。必须理解它的坐标系,否则从事件中接收到的整数值对我们也是也没有任何用处的。这里以方位角的坐标系为例,参看下所示

把手机水平放置在桌面上,头部指向北,这时候所有的方位角都是零度。这里提到的北极是地球磁场的北极,与我们日常所说的正北方向之间有一个夹角,就是磁偏角。那么接下来对应到上图的位置,就是磁场的北方对应的就是Y轴的正半轴,水平方向转过的角度就是正向的极方位角azimuth,范围是【0,360】;以手机头部为轴,底部向正上抬起,现在的转向是从Y的正半轴转向Z的正半轴,转过的角度就是正向的倾斜角pitch,范围是【-180,180】;以手机右边为轴,左边向上抬起,现在的转向是从Z的正半轴转向X的正半轴,转过的角度就是正的转角roll,范围是【-90,90】。

如果大家如果觉得辨认它的每个转角的正负比较复杂,有一个简单的方法,从每种转角转动时所绕的轴(或者说与转动方向始终垂直的轴)的负半轴向正半轴看去,转动的顺时针方向就是正方向。比如,当水平方向有转动时,azimuth的正角度就是从Z轴的副半轴向正半轴望过去的顺时针方向。

指南针应用

编写一个指南针应用其实非常简单,只需要注册方位角传感器,然后获取其中的极方位角azimuth;如果现在极方位角发生偏移,让我们的指示针反方向偏转同样的角度就可以了。下面的程序代码没有使用图片资源,只是通过画笔paint在界面上的移动来实现指南针的图形。画布的背景是白色,每当极方位角发生移动时(手机在水平方向有转动),整个画布向反方向移动同样的角度,大家看起来就像是指南针图形在移动。同时在程序中我们打印出设备配置的所有的传感器,记录在日志中。

应用代码

?
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.ijowett.example.SystemService;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.hardware.Sensor;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;
import android.view.View;
public class Compass extends Activity{
private static final String TAG = "Compass";
private SensorManager mSensorManager;
private SampleView mView;
private float[] mValues;
private final SensorListener mListener = new SensorListener() {
public void onSensorChanged(int sensor, float[] values) {
if (Config.DEBUG)
Log.d(TAG, "sensorChanged (" + values[0] + ", " + values[1] + ", " + values[2] + ")");
mValues = values;
if (mView != null) {
mView.invalidate();
}
}
public void onAccuracyChanged(int sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
List sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
Log.d(TAG, "There are " + sensors.size() + " sensors.");
for(Sensor sens : sensors)
{
Log.d(TAG, "Sensor name: " + sens.getType());
Log.d(TAG, "Sensor name: " + sens.getName());
}
mView = new SampleView(this);
setContentView(mView);
}
@Override
protected void onResume()
{
if (Config.LOGD) Log.d(TAG, "onResume");
super.onResume();
mSensorManager.registerListener(mListener,
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onStop()
{
if (Config.LOGD) Log.d(TAG, "onStop");
mSensorManager.unregisterListener(mListener);
super.onStop();
}
private class SampleView extends View {
private Paint   mPaint = new Paint();
private Path    mPath = new Path();
private boolean mAnimate;
private long    mNextTime;
public SampleView(Context context) {
super(context);
// Construct a wedge-shaped path
mPath.moveTo(0, -50);
mPath.lineTo(-20, 60);
mPath.lineTo(0, 50);
mPath.lineTo(20, 60);
mPath.close();
}
@Override protected void onDraw(Canvas canvas) {
Paint paint = mPaint;
canvas.drawColor(Color.WHITE);
paint.setAntiAlias(true);
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.FILL);
int w = canvas.getWidth();
int h = canvas.getHeight();
int cx = w / 2;
int cy = h / 2;
canvas.translate(cx, cy);
if (mValues != null) {
canvas.rotate(-mValues[0]);
}
canvas.drawPath(mPath, mPaint);
}
@Override
protected void onAttachedToWindow() {
mAnimate = true;
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
mAnimate = false;
super.onDetachedFromWindow();
}
}
}

除非注明,乔伊特博客文章均为原创,转载请以链接形式标明本文地址
本文地址:http://www.ijowett.com/android-sensor-compass.html

Android传感器介绍及指南针的实现相关推荐

  1. android 指南针传感器,android 传感器使用 Compass指南针的实现功能

    以下是指南针通过方向传感器而旋转实现. CompassDemo.java: package com.example.activity;import android.app.Activity;impor ...

  2. android传感器介绍

    因为墙的原因翻译备用,先贴上原文链接:https://developer.android.google.cn/guide/topics/sensors/sensors_motion.html 传感器简 ...

  3. Android 传感器介绍

    在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用. #define SENSOR_TYPE_ACCELEROMETER 1 //加速度 #define ...

  4. Android传感器的使用开发、简易指南针

    原文链接地址:http://blog.csdn.net/aiynmimi/article/details/48660505 简介 现在每部Android手机里边都会内置有许多传感器,如光照传感器.加速 ...

  5. Android传感器系列介绍-刘宇

    Android官方给我们提供一套Android sensor framework,俗称Android传感器框架,简称ASF.传感器分为动作传感器.位置传感器.环境传感器.由于传感器较多,使用过程差不多 ...

  6. [转帖]Android操作系统11种传感器介绍

    Android操作系统11种传感器介绍 在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用. #define SENSOR_TYPE_ACCELEROME ...

  7. MTK Android操作系统11种传感器介绍

    Android操作系统11种传感器介绍 1 加速度传感器 2 磁力传感器 3 方向传感器 4 陀螺仪传感器 5 光线感应传感器 6 压力传感器 7 温度传感器 8 接近传感器 9 重力传感器 10 线 ...

  8. Android传感器-开发指南

    大部分Android平台的设备都带有多个传感器,使你能监视其方位和运动状态的变化.很多设备还有其它类型的传感器,让你能感知周围的环境条件,比如温度.压力.湿度和光线.你可以利用Android的传感器框 ...

  9. Android 传感器开发详解

    Android 传感器开发详解 本文转载自:https://blog.csdn.net/airsaid/article/details/52902299 前言 使用 第一步 第二步 第三步 方向传感器 ...

最新文章

  1. 自动驾驶中的9种传感器融合算法
  2. Promise对象的创建与使用
  3. java是解释型编程语言_程序设计语言可以分为两类:编译型语言和解释型语言...
  4. 怎样安装两个tomcat,怎样配置
  5. 读懂这本书,才算读懂阿里大数据
  6. seasar一般性配置
  7. ES2020的新特性解读
  8. 【原创】.Net4.0中使用Razor制作多风格网站
  9. 一些有关系统APK的探索(一)
  10. 云服务器上传文件到哪个文件夹,云服务器上传到那个文件夹
  11. Linux下Oracle中sqlplus上下键乱码问题
  12. java架构师之路:JAVA程序员必看的15本书
  13. 《普林斯顿微积分读本》笔记
  14. 最齐全的宋体字体素材,速来收藏
  15. 计算机ppt用快捷键,【搞定PPT】高效重复快捷键F4
  16. ESDCAT静电猫项目
  17. ECSHOP 2.7.2 文件结构及各文件相应功能介绍
  18. stm8s003中串口中断问题
  19. excel 筛选重复项_列表项的Excel筛选器:2011年“鲨鱼周”
  20. 画思维导图一定要用计算机来完成吗,一起来画思维导图

热门文章

  1. java 车联网_车联网V2X开发
  2. VMware 安装出现“不能对软件降级“和“用户在命令行上发出了 EULAS_AGREED=1,表示不接受许可协议。“
  3. codewars打怪日记 Greed is Good JavaScript中数组用法和 哈希表的使用
  4. 一、ECharts(各种统计图)
  5. 电脑桌面宠物-bango cat
  6. html公差符号输入,cad正负公差符号如何输入出来
  7. slg游戏客户端框架简析
  8. 二维码的纠错码原理及如何纠错(2)
  9. 电商html轮播动效,制作一个电商网站的轮播图效果
  10. 对言语上的自律和真正的自律的一些想法