×
Namespaces

Variants
Actions
(Difference between revisions)

Como capturar os valores do acelerômetro, em Java ME

From Nokia Developer Wiki
Jump to: navigation, search
valderind4 (Talk | contribs)
bogdan.galiceanu (Talk | contribs)
m
Line 1: Line 1:
[[Category:How To]][[Category:Code Examples]][[Category:S60 5th Edition]][[Category:Java ME]][[Category:Mobile Sensor API (JSR-256)]][[Category:Sensor]][[Category:Java_ME_(Português)]] [[Category:Lang-PT]]
+
[[Category:Java_ME_(Português)]][[Category:Lang-PT]][[Category:How To]][[Category:Code Examples]][[Category:S60 (Português)]][[Category:Mobile Sensor API (JSR-256)]][[Category:Sensor]]
  
 
Original em: [[How to get accelerator sensor values in Java ME]]
 
Original em: [[How to get accelerator sensor values in Java ME]]

Revision as of 11:58, 12 July 2009


Original em: How to get accelerator sensor values in Java ME

Contents

Introdução

Os dispositivos S60 quinta edição suportam a MOBILE SENSOR API (JSR-256). O Nokia 5800 XM e o Nokia N97 são os primeiros dispositivos a ter esta API implementada. Os dispositivos S60 quinta edição (e a maioria dos dispositivos S60 terceira edição FP1 e os da terceira edição FP2) tem um acelerômetro, que providencia valores baseados na posição e movimento do dispositivo. Por exemplo, quando a tela do aparelho móvel e mudada de posição, a tela é atualizada para a posição

Como mostrado no Como recuperar informações de sensores em Java ME, na API MOBILE SENSOR no Nokia N97 encontra-se dois diferentes sensores de acelerômetros, um dá valores inteiros, outros valores em ponto flutuante. Este artigo mostra, como capturar valores destes acelerômetros em um MIDlet

Os passos para se usar o acelerômetro são os seguintes:

  • Encontre um sensor do tipo acelerômetro no dispositivo.
  • Selecione o sensor dando valores inteiros ou em ponto flutuantes
  • Passe a URL para o sensor
  • Abra a SensorConnection para o sensor
  • Implemente o método dataReceived() para usar os dados do sensor

O simples código abaixo mostra como pesquisar o tipo do acelerômetro do sensor do acelerômetro e como o tipo do valor do sensor pode ser selecionado. O método também captura a URL do sensor e retorna a correta SensorConnection para ele

Simples código

O simples código abaixo mostra como pesquisar o tipo do acelerômetro do sensor do acelerômetro e como o tipo do valor do sensor pode ser selecionado. O método também captura a URL do sensor e retorna a correta SensorConnection para ele.

    /**
* Searches sensors of "accelerator" quantity and if found returns a
* SensorConnection opened to it. Based on the boolean value of type_int
* either TYPE_DOUBLE or TYPE_INT sensor is used.
* @return SensorConnection, which has been opened to a sensor matching the criteria
*/

private SensorConnection openSensor() {
infos = SensorManager.findSensors("acceleration", null);
if (infos.length==0) return null;
int datatypes[] = new int[infos.length];
int i = 0;
String sensor_url = "";
if (!type_int) {
System.out.println("Searching TYPE_DOUBLE sensor...");
while (!sensor_found) {
datatypes[i] = infos[i].getChannelInfos()[0].getDataType();
if (datatypes[i] == 1) { //ChannelType.TYPE_DOUBLE = 1
sensor_url = infos[i].getUrl();
System.out.println("Sensor: " + sensor_url + ": TYPE_DOUBLE found.");
sensor_found = true;
}
else i++;
}
}
else if (type_int) {
System.out.println("Searching TYPE_INT sensor...");
while (!sensor_found) {
datatypes[i] = infos[i].getChannelInfos()[0].getDataType();
if (datatypes[i] == 2) { //ChannelType.TYPE_INT = 2
sensor_url = infos[i].getUrl();
System.out.println("Sensor: " + sensor_url + ": TYPE_INT found.");
sensor_found = true;
}
else i++;
}
}
System.out.println("Sensor: " + sensor_url);
try {
return (SensorConnection)Connector.open(sensor_url);
}catch (IOException ioe) {
ioe.printStackTrace();
return null;
}
}

O seguinte método mostra, como configurar o DataListener para capturar os valores do sensor:

    /**
* Initializes (opens) the sensor and sets the DataListener
*/

private synchronized void initSensor() {
sensor = openSensor();
if (sensor == null) return;
try {
sensor.setDataListener(this, BUFFER_SIZE);
while(!isStopped){
try{
wait();
}catch(InterruptedException ie){}
}
sensor.removeDataListener();
}catch (IllegalMonitorStateException imse) {
imse.printStackTrace();
}catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
try {
sensor.close();
} catch(IOException ioe){
ioe.printStackTrace();
}
if (isStopped) {
sensor = null;
}
}

Finalmente, o método dataReceived() é implementado para dar os valores do sensor. O método getIntegerDirections também é listado, ele calcula a média dos valores armazenados.

     /**
* Notification of the received sensor data.
* @param sensor - SensorConnection, the origin of the received data
* @param data - the received sensor data
* @param isDataLost - true if some data has been lost
*/

public void dataReceived(SensorConnection sensor, Data[] data, boolean isDataLost) {
if (!type_int) {
double[] directions = getDirections(data);
x = directions[0];
y = directions[1];
z = directions[2];
}
else {
int[] directions = getIntegerDirections(data);
x_int = directions[0];
y_int = directions[1];
z_int = directions[2];
}
repaint();
}
 
/**
* Gets the directions (axis_x, axis_y and axis_z values) from the accelerator
* sensor data. An average value is calculated from the buffer values.
* @param data The sensor data
* @return directions The array containing the axis_x, axis_y and axis_z values
*/

private static int[] getIntegerDirections(Data[] data) {
int [][] intValues = new int[3][BUFFER_SIZE];
int[] directions = new int[3];
for (int i=0; i<3; i++){
intValues[i] = data[i].getIntValues();
int temp = 0;
for (int j = 0; j<BUFFER_SIZE; j++) {
temp = temp + intValues[i][j];
}
directions[i] = temp/BUFFER_SIZE;
}
return directions;
}

Os arquivos SensorTestMIDlet.jad e SensorTestMIDlet.jar estão disponíveis aqui. O MIDle mostra os valores do sensor e desenha um indicador gráfico baseado nesses valores, como mostrado na figura abaixo.

An image showing the SensorTest MIDlet running in Nokia N97 SDK 0.5.

Uma imagem mostrando o SensorTest MIDlet sendo executado no Nokia N97 SDK 0.5.

Aplicação exemplo

Veja também

114 page views in the last 30 days.
×