Главная » Processing » Использование GPS в Processing

0

Большинство смартфонов имеют чип GPS. Это позволяет вам создавать приложения, связанные с местоположением. В этом примере мы рассмотрим способ определения местоположения устройства и отображения его на экране.

Приступим

В этом примере я использовал шрифт Junction – свободный шрифт от The League of Moveable Type. Вы можете скачать его по адресу: http://www.theleagueofmoveabletype.com/ junction. Чтобы начать использовать его, перетащите его в скетч Processing.

Как это делается

Начнем с импорта основных пакетов андроид и объявим несколько переменных, чтобы они у нас заработали:

import android.content.Context; import android.location.*; import android.os.Bundle;

LocationManager manager; GPSLocationListener gps;

float latitude; float longitude; float accuracy; String provider;

PFont junction;

Далее нужно создать новую вкладку под именем GPSLocationListener. pde. В этой вкладке мы напишем класс, реализующий интерфейс LocationListener.

class GPSLocationListener implements LocationListener

{

void onLocationChanged( Location _loc )

{

latitude = (float) _loc.getLatitude(); longitude = (float) _loc.getLongitude(); accuracy = (float) _loc.getAccuracy(); provider = _loc.getProvider();

}

void onProviderDisabled( String _provider )

{

provider = "";

}

void onProviderEnabled( String _provider )

{

provider = _provider;

}

void onStatusChanged( String _provider, int status, Bundle xtras )

{

}

}

В функции setup() мы присвоим нашим переменным начальные значения и загрузим шрифт для отображения информации на экране:

void setup()

{

orientation( PORTRAIT );

latitude = 0;

longitude = 0;

accuracy = 0; provider = "";

junction = createFont( "Junction.otf", 32 ); textFont( junction, 32 );

}

В функции draw() мы создадим переменную типа String с переменными широты, долготы, точности и провайдера. Эта информация отобразится в центре экрана:

void draw()

{

background( 5, 10, 85 );

fill( 250, 255, 13 );

noStroke();

translate( width/2, height/2 );

String msg = "Latitude: " + latitude + "\n"; msg += "Longitude: " + longitude + "\n";

msg += "Accuracy: " + accuracy + "\n"; msg += "Provider: " + provider;

textAlign( CENTER, CENTER );

text( msg, 0, 0 );

}

Также мы задействуем функции onResume() и onPause() для настройки GPS и чтения величин:

void onResume()

{

super.onResume();

gps = new GPSLocationListener();

manager = (LocationManager) getSystemService( Context.LOCATION_ SERVICE );

manager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 0, 0, gps );

}

void onPause()

{

super.onPause();

}

Последнее, что нужно сделать перед запуском скетча – убедиться, что ваше приложение под Android имеет разрешение для доступа к GPS. Откройте меню Android | Sketch Permissions и отметьте чекбокс ACCESS_FINE_LOCATION:

Когда вы запустите приложение, вы увидите что-то похожее на этот скришот. Значения широты и долготы будут другими, в соответствии с вашим местоположением.

Класс GPSLocationListener, который мы написали, реализует Android интерфейс LocationListener. Интерфейс в Java это абстрактный класс, который не может быть рлизован. Интерфейсы должны быть реализованы в других классах. Когда вы реализуете интерфейс, вам следует убедиться, что вы написали все методы интерфейса, даже если вы не будете применять их. Интерфейс LocationListener имеет четыре метода: onLocationChanged(), onProviderDisabled(), onProviderEnabled() и onStatusChanged(). В нашей реализации метод onStatusChanged() ничего не делает, но он нужен нам, чтобы скетч работал. Метод onLocationChanged() из нашего класса устанавливает величины переменных latitude, longitude, accuracy и provider из нашего скетча. Методы onProviderDisabled() и onProviderEnabled() всего лишь изменяют значение переменной провайдера.

В функции onResume() мы создадим объект GPSLocationListener, установим объект LocationManager и запросим местоположение с помощью следующего фрагмента кода:

manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE

);

manager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 0, 0, gps );

Дополнительно

Вообще-то мы немного схитрили с этим примером. Мы использовали Android Network Location Provider, который определяет местоположение с помощью базовых станций и сигнала Wi-Fi вместо GPS. Это не так точно, но это быстрее, энергетически экономичнее и тоже работает в помещении. Если вы хотите работать с настоящим GPS, вам нужно помять LocationManager.NETWORK_ PROVIDER на LocationManager.GPS_Provider.

Источник: Ян Вантомм, Processing 2: креативное программирование, перевод с английского Александры Мишутиной, Published by Packt Publishing Ltd., 2012, BIRMINGHAM – MUMBAI.

По теме:

  • Комментарии