Pull to refresh

Всё гениальное — просто. Написание геолокационных сервисов для J2ME

Reading time 5 min
Views 5K
Доброго времени суток!

Введение


На сегодняшний день геолокационные сервисы такие, как GPS и Cell ID стали неотъемлимой частью нашей жизни. С помощью них мы можем узнать, где мы находимся, например, если мы потерялись, или же просто поделиться своим местоположением в социальных сетях, например, в Foursquare.
Множество мобильных телефонов на J2ME поддерживают Location API (JSR-179). Используя его, мы запросто можем написать какое-нибудь полезное и, что самое главное, интересное приложение для данной платформы.
В данной статье я предлагаю рассмотреть возможности Location API for J2ME и написать маленькое, но весьма интересное приложение. Но обо всём по порядку.


Для чего используются геолокационные сервисы


Геолокационные сервисы позоляют бысто ответить на три вопроса, а именно:
  • Где я?
  • Что находится вокруг меня?
  • И как, чёрт побери, я сюда попал?


Например, вам стало очень плохо (тьфу-тьфу-тьфу), рядом с вами ни единого прохожего и вы не можете сказать ни слова. На помощь вам придёт GPS, который передаст в скорую помощь координаты вашего местонахождения. К сожалению, этот принцип работает только в США при вызове 911.

Ближе к делу


Для того, чтобы воспользоваться нашим приложением нам необходим телефон, который будет отвечать следующим требованиям:
  • платформа J2ME
  • наличие в телефоне JSR-179 (Location API)
  • наличие CDC (Connected Device Configuration) или CLDC 1.1 (Connected Limited Device Configuration профиля)

Такими телефонами являются, например, Nokia E71, E66, N95, N96, 6210 Navigator и многие другие…

Определение местоположение устройства


Чтобы определить местонахождение устройства, Location API использует доступные ей методы позиционирования в реальном времени. Точность зависит от методов, которые используются.
Обычно, используются встроенные GPS устройства, которые отдают нам необходимую информацию, а именно ширина, долгота и высота.

Ширина выражается, как 0-90 градусов (север или юг).
Долгота же выражается, как 0-180 градусов (запад или восток).
Высота же выражается, соответственно, в метрах над уровнем моря.

Приложения могут использовать несколько методов позиционирования.
  • Cell ID: при использовании данного метода в качестве координат местонахождения принимается значение от ближайшей сотовой вышки, так называемой BTS (Base Transceiver Station). Точность такого метода зависит от радиуса действия сотовой вышки. Для GSM сетей это расстояние варьируется от 2 до 20 километров.
  • Используя спутник: GPS или же система глобального позиционирования, использующая данные, принимаемые от одного из 24 спутников на орбите. GPS определяет ваше местонахождение, равное разнице во времени проходящего сигнала от одного спутника к другому. GPS является самым точным определителем местонахождения. Погрешность будет составлять около 4-40 метров (при чистом небе).


От теории к практике


JSR-179 является ничем иным, как пакетом javax.microedition.location, зашитым внутри вашего мобильного телефона. Он предоставляет разработчикам возможность разрабатывать геолокационные сервисы для J2ME, предоставляя всю необходимую информацию (начиная с координат и заканчивая хранилищем для ваших отметок).
Аппаратная платформа определяет, какие методы позиционирования реального времени вам доступны на данный момент. Вам абсолютно не нужно беспокоиться о том, какой метод использовать, т.к. J2ME решит это за вас. Соответственно, будет использоваться самый точный метод, который доступен (GPS, Cell ID).

Убедиться в том, что Location API доступен, мы можем следующим способом:
...
	 public boolean isLocationSupported() {
	     boolean isItTrue = true;
		     try {
			     Class.forName("javax.microedition.location.Location");
			 } catch (Exception e) {
			     isItTrue = false;
			 }
		 return isItTrue;
	 }
...


Итак, поехали дальше


Чтобы написать геолокационное приложение, нам необходимо работать со следующими классами:
  • Criteria, содержащий в себе информацию о точности, времени ответа от спутников или же вышки и скорости.
  • LocationProvider, который работает с данными класса Criteria для определения вашего местонахождения.
  • Location. Объект, содержащий в себе координаты, скорость (если доступно), адрес в виде текста (если доступно), и время, за которое были произведены вычисления.
  • Сами же координаты (да, да, я вас понимаю) мы можем получить от одного из двух классов (Coordinates или QualifiedCoordinates, на выбор). Разница лишь в том, что QualifiedCoordinates предоставляет дополнительно данные о точности измерения, представленных в метрах.


Для понятия и закрепления теории я предлагаю написать нам небольшой MIDlet (так называется J2ME приложение):
// импортируем необходимые нам пакеты
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.location.*;

// объявляем класс нашего приложения, наследованного от MIDlet
public class FirstGeo extends MIDlet implements CommandListener {

     // объявляем необходимые нам объекты
     Display dsp;
	 Form frm;
	 StringItem data;
	 Command cmdExit;
	 
	 // конструктор нашего MIDleta
	 public FirstGeo() {
	     dsp = Display.getDisplay(this);
		 frm = new Form("First Geo-located application");
		 data = new StringItem("Location: ","Unavailable");
		 cmdExit = new Command("Exit",Command.EXIT,1);
	 }
	 
	 // начинаем работу с приложением
	 // этот метод является обязательным для объявления в нашем классе
	 public void startApp() throws MIDletStateChangeException {
	     dsp.setCurrent(frm);
		 frm.append(cmdExit);
		 frm.setCommandListener(this);
		 frm.append(data);
		     // проверяем, доступны ли нам какие-либо средства позиционирования
		     if (isLocationSupported()) {
			     Criteria cr = new Criteria();
				 cr.setHorizontalAccuracy(500);
				 LocationProvider lp = LocationProvider.getInstance(cr);
				 Location l = lp.getLocation(10);
				 QualifiedCoordinates qc = l.getQualifiedCoordinates();
			     data.setText("Latitude: " + qc.getLatitude() + "\n" + "Longitude: " + qc.getLongitude() + "\n" + "Altitude: " +  qc.getAltitude() + "\n");
			 } else {
			     destroyApp(true);
			 }
	 }
	 
	 // этот метод также является необходимым для объявления
	 public void pauseApp() throws MIDletStateChangeException {
	     // ничего не делаем
	 }
	 
	 // и этот
	 public void destroyApp(boolean uncond) throws MIDletStateChangeException {
	     if (uncond == true) {
		     notifyDestroyed();
		 }
	 }
	 
	 public void commandAction(Command c, Displayable d) {
	     if (c == cmdExit && d == dsp) {
		     destroyApp(true);
		 }
	 }
	 
	 // функция, проверяющая доступны ли нам средства позиционирования
	 public boolean isLocationSupported() {
	     boolean isItTrue = true;
		     try {
			     Class.forName("javax.microedition.location.Location");
			 } catch (Exception e) {
			     isItTrue = false;
			 }
		 return isItTrue;
	 }
}


Вот так за пару минут с вами написали приложение, которое определяет ширину, долготу и высоту, что на данный момент избыточно, нашего местоположения.

Целью данного топика было ввести вас в тему построения геолокационных сервисов, что и было сделано. Если вы захотите ознакомится с полным Location API, пожалуйста.

P.S. К сожалению, я нахожусь далеко от рабочего ПК, чтобы скомпилировать исходники и показать вам скриншоты, что обещаю сделать позже.
Tags:
Hubs:
-8
Comments 13
Comments Comments 13

Articles