Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Revision as of 05:46, 23 October 2013 by hamishwillee (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

传感器API的介绍以及使用

From Wiki
Jump to: navigation, search
WP Metro Icon Chinese.png
Article Metadata

兼容于
平台:
Series 40

文章
Amazing1100 在 17 Jul 2012 创建
最后由 hamishwillee 在 23 Oct 2013 编辑


Contents

引言

在Java Runtime 2.0.0 for Series 40中首次引入了传感器相关API,通过这些API我们可以从移动设备中获取传感器的数据。

这些传感器API不仅可以应用于Series40设备,同样使用与Symbian设备,当然不同的设备会有不同的所支持的传感器,你可以通过Nokia设备参数规范 来获取 不同设备所支持的传感器的相关信息。


传感器介绍

每一个传感器是由一个或者多个频道(Channel)组成,而每一个频道就是一个独立的数据感应源。比如加速传感器会从3个频道来回去加速度的值,3个频道分别负责X, Y, Z三个方向的加速度数值。

通常传感器可以被分为两种类型:

  • 传感器数据为一个给定的数值区域以及精度,比如说用来侦测当前网络信号强度的传感器的数据为一个百分比的值。
  • 仅仅两种状态的 On/Off的传感器,比如说 用来判断当前是否连接充电器的传感器


所有的传感器一般后有下面的一些属性:

  • 精确度
  • 最大值
  • 最小值


使用传感器API

为了能在一个MIDlet中获取传感器数值,你首先需要判断当前设备对传感器的支持,然后建立一个与传感器的连接。 通常,传感器是通过一个唯一的URL来标识自身的,URL是以 “sensor:” 开头的。 你需要通过 “ javax.microedition.io.Connector.open” 这个方法来建立一个传感器连接, 具体的过程如下图:

Series40 Sensor connection sequence chart.png


我们通过连接打开一个传感器后,我们需要明白传感器工作的模式,主要有一下两种:

  • 同步模式:

在这种模式下,通过SensorConnection.getData 这个方法来同步的获取数据。

  • 异步模式:

在这种模式下,需要通过DataListener.dataReceived 该接口的函数中来获取通知以及传感器数值,你可以再连接建立时,或者满足某种条件时,来启动DataListener的监听。 异步模式下的传感器生命周期如下图:

Series40 Sensor connection lifecycle chart.png



使用传感器API一般需要以下步骤:

获取传感器信息

// 获取当前设备支持的所有传感器的相关信息
SensorInfo[] sensorInfos = SensorManager.findSensors(null, null);
 
// 获取类型为速度传感器的信息
SensorInfo[] sensorInfos = SensorManager.findSensors("acceleration", null);
 
// 通过URL直接获取特定传感器信息
SensorInfo[] sensorInfos = SensorManager.findSensors("sensor:acceleration");


The following code snippet determines the number of available channels in the sensor and handles them according to data type. The example uses the DataListener interface to retrieve the sensor data. For more information, see section Using data listeners. 传感器的数值主要有三种:

  • TYPE_INT
  • TYPE_DOUBLE
  • TYPE_OBJECT


下面的代码演示了如何如何处理以及获取传感器不同类型数据:


public void dataReceived(SensorConnection sensor, Data[] data, boolean isDataLost ) {
ChannelInfo[] channelinfo = sensor.getSensorInfo().getChannelInfos();
for(int i = 0; i < channelinfo.length; i++) {
switch (channelinfo[i].getDataType()) {
case ChannelInfo.TYPE_INT:
displayData(data[i].getIntValues());
break;
case ChannelInfo.TYPE_DOUBLE:
displayData(data[i].getDoubleValues());
break;
case ChannelInfo.TYPE_OBJECT:
displayData(data[i].getObjectValues());
break;
}
}
}

建立于传感器的连接

使用“ javax.microedition.io.Connector.open ”该方法来建立一个与传感器的连接:

SensorConnection sensorConnection;
try {
sensorConnection = (SensorConnection)Connector.open(sensorInfo.getUrl());
} catch (IOException e) {
// Handle Exception if Connector.open() fails
}

从传感器获取数据

下面代码演示了如何通过SensorConnection.getData 以同步模式来获取传感器数据:

int bufferSize = 10;
Data[] data = sensorConnection.getData(bufferSize);
 
int bufferingPeriod = 1000;
boolean includeTimestamps = true;
boolean includeUncertainities = true;
boolean includeValidities = true;
Data[] data = sensorConnection.getData(bufferSize,
bufferingPeriod,
includeTimestamps,
includeUncertainities,
includeValidities);


然后根据传感器不同的数据类型,调用不同的函数来获取真正的数值:

double[] doubleValues;
int[] intValues;
Data[] data = sensorConnection.getData(bufferSize);
if(data[0].getChannelInfo().getDataType() == ChannelInfo.TYPE_DOUBLE) {
// Get double values
doubleValues = data[0].getDoubleValues();
}
else if(data[0].getChannelInfo().getDataType() == ChannelInfo.TYPE_INT) {
// Get int values
intValues = data[0].getIntValues();
}



接下来,我们看看如何通过异步方式来获取传感器数据:

首先你需要实现DataListener 接口:

class MyDataListener implements DataListener {
public void dataReceived(SensorConnection aConnection, Data[] aData, boolean aIsDataLost) {
// Store received data
}


设置DataListener:

MyDataListener datalistener = new MyDataListener();
 
int bufferSize = 10;
sensorConnection.setDataListener(dataListener, bufferSize);
 
// ...
 
int bufferingPeriod = 1000;
boolean includeTimestamps = true;
boolean includeUncertainities = false;
boolean includeValidities = false;
sensorConnection.setDataListener(dataListener,
bufferSize,
bufferingPeriod,
includeTimestamps,
includeUnvertainities,
includeValities);
 
// ...
 
sensorConnection.removeDataListener();

关闭连接

使用完毕,请确保关闭与传感器的连接:

sensorConnection.close()

实例演示

下面的例子,通过使用加速传感器控制一个小球在屏幕内滚动。

开发环境:Netbean + Nokia SDK for Java 2.0 测试手机: Nokia3060

#   MovingBall例程 下载


相关链接

This page was last modified on 23 October 2013, at 05:46.
674 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×