- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章android 传感器(OnSensorChanged)使用介绍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
下面是API中定义的几个代表sensor的常量.
。
Int 。 |
TYPE_ACCELEROMETER 。 |
A constant describing an accelerometer sensor type. 加速度传感器 。 |
int 。 |
TYPE_ALL 。 |
A constant describing all sensor types. 所有类型 A constant describing all sensor types. 。 |
int 。 |
TYPE_GRAVITY 。 |
A constant describing a gravity sensor type. 。 |
int 。 |
TYPE_GYROSCOPE 。 |
A constant describing a gyroscope sensor type 回转仪传感器 。 |
int 。 |
TYPE_LIGHT 。 |
A constant describing an light sensor type.光线传感器 。 |
int 。 |
TYPE_LINEAR_ACCELERATION 。 |
A constant describing a linear acceleration sensor type. 。 |
int 。 |
TYPE_MAGNETIC_FIELD 。 |
A constant describing a magnetic field sensor type.磁场传感器 。 |
int 。 |
TYPE_ORIENTATION 。 |
This constant is deprecated. use SensorManager.getOrientation()instead. 磁场传感器 。 |
int 。 |
TYPE_PRESSURE 。 |
A constant describing a pressure sensor type 压力计传感器 。 |
int 。 |
TYPE_PROXIMITY 。 |
A constant describing an proximity sensor type.距离传感器 。 |
int 。 |
TYPE_ROTATION_VECTOR 。 |
A constant describing a rotation vector sensor type. 。 |
int 。 |
TYPE_TEMPERATURE 。 |
A constant describing a temperature sensor type 温度传感器 。 |
。
我们在编写传感器相关的代码时可以按照以下步骤:
第一步: 获得传感器管理器 。
SensorManger sm = (SensorManager).getSystemService(SENSOR_SERVICE),
第二步:为具体的传感器注册监听器 ,这里我们使用磁阻传感器Sensor.TYPE_ORIENTATION. 。
sm,registerListener (this,sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST),
这里如果想注册其他的传感器,可以改变第一个参数值的传感器类型属性。我们应该根据手机中的实际存在的传感器来进行注册。如果手机中 。
不存在我们注册的传感器,就算我们注册了也不起什么作用.
第三个参数值表示获得传感器数据的速度,SENSOR_DELAY_FASTEST表示尽可能快的获取传感器数据,除了该值以外,还可以设置3个获取 。
传感器数据的速度值,这些值如下:
。
。
第三步,既然我们在第二部已经为传感器设置了监听。我们就要实现具体的监听方法,在android 中,应用程序使用传感器主要依赖于 android.hardware.SensorEventListener 接口。该接口可以监听传感器各种事件。SensorEventListener 接口代码如下:
。
。
当传感器的值发生变化时,例如磁阻传感器方向改变时会调用OnSensorChanged(). 当传感器的精度发生变化时会调用OnAccuracyChanged()方法。 首先我们可以先看一下android 开发文档中的注释及事例代码:
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
|
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) {
}
}
|
Always make sure to disable sensors you don't need, especially when your activity is paused. Failing to do so can drain the battery in just a few hours. Note that the system will not disable sensors automatically when the screen turns off. 。
大家可以看到,文档里要求我们不需要的传感器尽量要解除注册,特别是我们的activity处于失去焦点的状态时。如果我们不按照以上去做的话,手机电池很快会被用完.
还要注意的是当屏幕关闭的时候,传感器也不会自动的解除注册.
所以我们可以利用activity 中的 onPause() 方法和onresume()方法。在onresume方法i中对传感器注册监听器,在onPause() 。
方法中解除注册.
以下为利用方向传感器写的一个简单的DEMO 。
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
|
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) {
}
}
package
net.blogjava.mobile.sensor;
import
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
OrientationSensorTest
extends
Activity
implements
SensorEventListener {
private
SensorManager sensorManager =
null
;
private
Sensor orientaionSensor =
null
;
private
TextView textView;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
setTitle(
"方向传感器DEMO"
);
textView = (TextView) findViewById(R.id.textview);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
orientaionSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}
@Override
protected
void
onPause() {
super
.onPause();
sensorManager.unregisterListener(
this
);
// 解除监听器注册
}
@Override
protected
void
onResume() {
super
.onResume();
sensorManager.registerListener(
this
, orientaionSensor,
SensorManager.SENSOR_DELAY_NORMAL);
//为传感器注册监听器
}
@Override
public
void
onAccuracyChanged(Sensor sensor,
int
accuracy) {
}
@Override
public
void
onSensorChanged(SensorEvent event) {
float
x = event.values[SensorManager.DATA_X];
float
y = event.values[SensorManager.DATA_Y];
float
z = event.values[SensorManager.DATA_Z];
textView.setText(
"x="
+ (
int
) x +
","
+
"y="
+ (
int
) y +
","
+
"z="
+ (
int
) z);
}
}
|
下面介绍android 的坐标系是如何定义x, y z 轴的.
x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。 Y轴的方向是从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端.
将手机放在桌子上,z轴的方向是从手机指向天空.
自从苹果公司在2007年发布第一代iPhone以来,以前看似和手机挨不着边的传感器也逐渐成为手机硬件的重要组成部分。如果读者使用过iPhone、HTC Dream、HTC Magic、HTC Hero以及其他的Android手机,会发现通过将手机横向或纵向放置,屏幕会随着手机位置的不同而改变方向。这种功能就需要通过重力传感器来实现,除了重力传感器,还有很多其他类型的传感器被应用到手机中,例如磁阻传感器就是最重要的一种传感器。虽然手机可以通过GPS来判断方向,但在GPS信号不好或根本没有GPS信号的情况下,GPS就形同虚设。这时通过磁阻传感器就可以很容易判断方向(东、南、西、北)。有了磁阻传感器,也使罗盘(俗称指向针)的电子化成为可能。 在Android应用程序中使用传感器要依赖于android.hardware.SensorEventListener接口。通过该接口可以监听传感器的各种事件。SensorEventListener接口的代码如下:
。
。
在SensorEventListener接口中定义了两个方法:onSensorChanged和onAccuracyChanged。当传感器的值发生变化时,例如磁阻传感器的方向改变时会调用onSensorChanged方法。当传感器的精度变化时会调用onAccuracyChanged方法。 onSensorChanged方法只有一个SensorEvent类型的参数event,其中SensorEvent类有一个values变量非常重要,该变量的类型是float[]。但该变量最多只有3个元素,而且根据传感器的不同,values变量中元素所代表的含义也不同.
在解释values变量中元素的含义之前,先来介绍一下Android的坐标系统是如何定义X、Y、Z轴的.
X轴的方向是沿着屏幕的水平方向从左向右。如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。 Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指向屏幕的顶端。 将手机平放在桌子上,Z轴的方向是从手机里指向天空.
下面是values变量的元素在主要的传感器中所代表的含义.
1.1方向传感器 。
在方向传感器中values变量的3个值都表示度数,它们的含义如下:
values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘,实例76将详细介绍电子罗盘的实现过程.
values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1] ≤180。假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values[1]的值应该是0(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)。这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values[1]会在0到-180之间变化,也就是说,从手机顶部抬起时,values[1]的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values[1]会在0到180之间变化。也就是values[1]的值会逐渐增大,直到等于180。可以利用values[1]和下面要介绍的values[2]来测量桌子等物体的倾斜度.
values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values[2]的值应为0。将手机左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。将手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化.
1.2加速传感器 。
该传感器的values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧向右侧移动,values[0]为负值;从右向左移动,values[0]为正值。读者可以通过本节的例子来体会加速传感器中的值的变化。要想使用相应的传感器,仅实现SensorEventListener接口是不够的,还需要使用下面的代码来注册相应的传感器.
。
。
如果想注册其他的传感器,可以改变getDefaultSensor方法的第1个参数值,例如,注册加速传感器可以使用Sensor.TYPE_ACCELEROMETER。在Sensor类中还定义了很多传感器常量,但要根据手机中实际的硬件配置来注册传感器。如果手机中没有相应的传感器硬件,就算注册了相应的传感器也不起任何作用。getDefaultSensor方法的第2个参数表示获得传感器数据的速度。SensorManager.SENSOR_DELAY_ FASTEST表示尽可能快地获得传感器数据。除了该值以外,还可以设置3个获得传感器数据的速度值,这些值如下:
SensorManager.SENSOR_DELAY_NORMAL:默认的获得传感器数据的速度。 SensorManager.SENSOR_DELAY_GAME:如果利用传感器开发游戏,建议使用该值。 SensorManager.SENSOR_DELAY_UI:如果使用传感器更新UI中的数据,建议使用该值.
1.3重力感应器 。
加速度传感器的类型常量是Sensor.TYPE_GRAVITY。重力传感器与加速度传感器使用同一套坐标系。values数组中三个元素分别表示了X、Y、Z轴的重力大小。Android SDK定义了一些常量,用于表示星系中行星、卫星和太阳表面的重力。下面就来温习一下天文知识,将来如果在地球以外用Android手机,也许会用得上.
。
1.4 光线传感器 。
。
光线传感器的类型常量是Sensor.TYPE_LIGHT。values数组只有第一个元素(values[0])有意义。表示光线的强度。最大的值是120000.0f。Android SDK将光线强度分为不同的等级,每一个等级的最大值由一个常量表示,这些常量都定义在SensorManager类中,代码如下:
。
。
上面的八个常量只是临界值。读者在实际使用光线传感器时要根据实际情况确定一个范围。例如,当太阳逐渐升起时,values[0]的值很可能会超过LIGHT_SUNRISE,当values[0]的值逐渐增大时,就会逐渐越过LIGHT_OVERCAST,而达到LIGHT_SHADE,当然,如果天特别好的话,也可能会达到LIGHT_SUNLIGHT,甚至更高。 1.5陀螺仪传感器 陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:values[0]:延X轴旋转的角速度。 values[1]:延Y轴旋转的角速度。 values[2]:延Z轴旋转的角速度。 当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。陀螺仪传感器经常被用来计算手机已转动的角度,代码如下:
。
。
上面代码中通过陀螺仪传感器相邻两次获得数据的时间差(dT)来分别计算在这段时间内手机延X、 Y、Z轴旋转的角度,并将值分别累加到angle数组的不同元素上。 1.6其他传感器 其他传感器在前面几节介绍了加速度传感器、重力传感器、光线传感器、陀螺仪传感器以及方向传感器。除了这些传感器外,Android SDK还支持如下的几种传感器。关于这些传感器的使用方法以及与这些传感器相关的常量、方法,读者可以参阅官方文档.
近程传感器(Sensor.TYPE_PROXIMITY) 线性加速度传感器(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种传感器。如果使用了手机不支持的传感器,一般不会抛出异常,但也无法获得传感器传回的数据。读者在使用传感器时最好先判断当前的手机是否支持所使用的传感器.
最后此篇关于android 传感器(OnSensorChanged)使用介绍的文章就讲到这里了,如果你想了解更多关于android 传感器(OnSensorChanged)使用介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这是我的职责。 public void onSensorChanged(SensorEvent event) { if (event.sensor.getType()
我有以下函数来监听加速度计和磁力计值: // Storage for Sensor readings public float[] mGravity = new float[3]; pub
我昨天刚开始使用 android 和 java,但遇到了问题。我正在尝试将传感器的值输出到某些 TextView。文本更新,但使用定义时设置的值。 onSensorChanged 应该更新这些值吗?
我正在开发一个可穿戴应用程序,我注意到一个奇怪的行为。我有一个类 FooService extends Service implements SensorEventListener 并且我重写了 on
我有一个 SensorEventListener,它在 onSensorChanged() 方法中执行如下操作: public void onSensorChanged(SensorEvent e){
我试图在 1 秒内获得 100 个加速度计读数,但它不是 100 个不同的读数,而是 100 次给出 1 个相同的读数。 当我按下应用程序中的按钮时,我尝试显示这 100 个加速度计读数 我的 Mai
我读过一些关于哪个线程调用各种回调方法的讨论,例如与传感器关联的回调方法。大多数声称 UI 线程调用回调 - 即使涉及单独的工作线程。我们确定吗? 考虑这种情况:一个单独的类实现 Runnable 和
今晚我在传感器方面遇到了很多麻烦,但似乎是因为没有调用 onSensorChanged()。很抱歉最终出现重复问题,但我没有看到任何解决方案。这是我的代码: public SensorManager
我正在编写 Android 应用程序,但在使用加速度计时遇到了一些问题。奇怪的是,我的函数 onSensorChanged() 没有被调用,我不知道为什么:/你能帮帮我吗? :) 这是我的代码: @S
我正在尝试开发一个检测跌倒的应用程序,到目前为止,跌倒的准确性在可接受的范围内,但问题是“OnSensorChanged”的调用过于频繁,导致 toast 不断出现在我的屏幕上. 我认为问题在于,在自
我需要在另一种方法中使用传感器的值。我不知道如何从 onSensorChanged() 方法获取值。 我尝试创建一个全局字段,在其中写入传感器值,但在 onSensorChanged() 方法之外该字
当我使用onSensorChanged()测试手机的加速度计时,发现它响应速度很快。几乎每1~3msonSensorChanged()就会被激活。我查了一些其他手机的信息,感觉有点奇怪,所以我怀疑我的
我是 Android 开发新手。我正在构建一个简单的 Android 应用程序,它分析加速计传感器数据并使用 MediaPlayer 播放声音。 SensorEventListener 实现代码:
当传感器打开时,onSensorChanged 上有数据 连续。 我想: 开启传感器 10 秒,每隔 10 秒读取一次数据。 关闭传感器 20 秒。 不断重复同一件事(步骤 1 到 2)。 我使用 S
我已经编写了一种通过网络发送 UDP 消息的方法。它工作正常。 在那之后,我尝试使用我的 Galaxy S 智能手机的加速计传感器。我得到了加速计值,并将它们显示在屏幕上。当值发生变化时(onSens
我将传感器用作 Sensor.TYPE_ACCELEROMETER。我正在按如下方式实现 OnSensorChanged() 方法: @Override public void onS
我正在使用传感器加速度计,我想知道它是否可能以及如何在 onSensorChanged 中运行两个东西。1. 我想将加速度计数据 x、y、z 始终存储在现场2. 如果检测到抖动,运行另一个 Activ
这是我的问题的后续:Android thread runnable performance 我在思考应用程序的同步方法时遇到了一些困难 我轮询传感器并在传感器值发生变化时将其存储到数组中 float[
只是想知道,有没有办法在 Android 手机上获取光传感器的值,而无需等待 onSensorChanged() 事件发生?为了节省电量,我在获得单个 lux 值后使用 registerListene
我需要检查移动设备是否处于水平位置(没有横向,我的意思是就像你把它放在 table 上一样)。 我知道我必须使用“SensorEventListener”接口(interface)和“onSensor
我是一名优秀的程序员,十分优秀!