Освой Android играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Карты Google и Просмотр улиц (StreetView)

Запуск приложения для работы с картами при помощи намерения

На большинстве стандартных телефонов и планшетов есть программа Карты Google. Мы можем из своего приложения запустить эту программу с различными настройками.

Если вы будете тестировать примеры на эмуляторе, то вам необходимо использовать виртуальное устройство с поддержкой Google APIs.

Google APis

Запуск приложения для работы с картами при помощи намерения

Запускается программа стандартным способом через намерение. Допустим, у нас есть кнопка и код для щелчка будет следующим:


// Kotlin
button.setOnClickListener {
    val geoUriString = "geo:0,10?z=2"
    val geoUri: Uri = Uri.parse(geoUriString)
    val mapIntent = Intent(Intent.ACTION_VIEW, geoUri)
    if (mapIntent.resolveActivity(packageManager) != null) {
        startActivity(mapIntent)
    }
}

// Java public void onClick(View view) { String geoUriString = "geo:0,10?z=2"; Uri geoUri = Uri.parse(geoUriString); Intent mapIntent = new Intent(Intent.ACTION_VIEW, geoUri); if (mapIntent.resolveActivity(getPackageManager()) != null) { startActivity(mapIntent); } }

Приложение Карты Google понимает специальный формат:

geo:latitude,longitude
geo:latitude,longitude?z=zoom

Первая строчка принимает два параметра: широту и долготу. Вторая строчка дополнительно имеет параметр масштабирования от 2 до 23 (2 - четверть планеты, 23 - максимальное приближение, например, крыша дома, на которой встречаются коты и кошки).

Документация утверждает, что можно использовать зум с уровнем 1 (весь мир) и раньше это действительно работало. Но потом карты обновились и значение 1 стало вызывать крах программы. Поэтому лучше использовать 2

В нашем примере для широты использовалось значение 0 - это экватор. Про долготу рассказывать не буду - не надо было в школе прогуливать уроки географии.

Имея нужные данные и зная необходимый формат, мы можем сформировать задание на запуск приложения для работы с картами. Как правило, на Android-телефонах это программа Карты (Maps). Если у вас на телефоне установлены и другие карты (Яндекс.Карты, iGo), то сначала появится диалоговое окно, где пользователю будет предложено выбрать в каком приложении должна быть показана заданная точка.


// Kotlin
val geoUriString = "geo:55.869555,37.503964?z=15"
val geoUri: Uri = Uri.parse(geoUriString)
val mapIntent = Intent(Intent.ACTION_VIEW, geoUri)
if (mapIntent.resolveActivity(packageManager) != null) {
    startActivity(mapIntent)
}

// Java String geoURI = "geo:55.869555,37.503964?z=15"; Uri geo = Uri.parse(geoURI); Intent geoIntent = new Intent(Intent.ACTION_VIEW, geo); if (geoIntent.resolveActivity(getPackageManager()) != null) { startActivity(geoIntent); }

или так


String geoUri = String.format("geo:%s,%s?z=15", Double.toString(lat), Double.toString(lng));
Intent geoIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(geoUri));

if (geoIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(geoIntent);
}

Запустив приложение и нажав на кнопку, который отвечает за данный код, мы запустим приложение, отвечающее за карты, и окажемся в нужном месте где-то в районе Ховрино (Москва).

Говорят, коты имеют встроенный GPS и им легко разобраться в координатах. Недаром они так ловко находят дорогу домой, даже если их потеряли за сотни километров. Но мы с вами такими способностями не обладаем и точно сказать координаты своего дома не можем.

Впрочем, совсем не обязательно знать точные координаты местоположения объекта. Можно поступить проще. Существует ещё один формат:

geo:0,0?q=my+street+address

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


val geoUriString = "geo:0,0?q=Belgium" // Kotlin
String geoUriString = "geo:0,0?q=Belgium"; // Java
// остальной код без изменений

Карты достаточно умны, чтобы понять ваш запрос и покажет территорию Бельгии. Впрочем, на русском он тоже понимает. Как видите, в этом случае мы передаём нулевые координаты и добавляем к ним запрос ?q=.

Также можно указать и уровень масштабирования:


val geoUriString = "geo:0,0?q=Кот Д'Ивуар&z=8" // Kotlin
String geoUriString = "geo:0,0?q=Кот Д'Ивуар&z=8"; // Java

Хотите увидеть Париж и умереть? Можете попросить показать кофейни рядом с Парижем.


geo:0,0?q=Coffee Shops near Paris, France

Впрочем, хватит писать на заморском языке. Давайте лучше поищем какой-нибудь театр кошек в Москве:


val geoUriString = "geo:0,0?q=москва+театр+кошек&z=8"  // Kotlin
String geoUriString = "geo:0,0?q=москва+театр+кошек&z=8"; // Java

Запускаем приложение и видим нужное место. Удобно, не правда ли?

Театр кошек на картах Google

Просмотр улиц (Google StreetView)

Кроме карт, у Google есть приложение Просмотр улиц (StreetView), интегрированное в Карты. Запуск программы ничем не отличается от запуска карт, только нужно использовать другой формат:


// Kotlin
val geoUriString = "google.streetview:cbll=59.939448,30.328264&cbp=1,99.56,,1,2.0&mz=19"
val geoUri = Uri.parse(geoUriString)
val mapIntent = Intent(Intent.ACTION_VIEW, geoUri)

if (mapIntent.resolveActivity(packageManager) != null) {
    startActivity(mapIntent)
}

// Java public void onClick(View view) { String geoUriString = "google.streetview:cbll=59.939448,30.328264&cbp=1,99.56,,1,2.0&mz=19"; Uri geoUri = Uri.parse(geoUriString); Intent mapIntent = new Intent(Intent.ACTION_VIEW, geoUri); if (mapIntent.resolveActivity(getPackageManager()) != null) { startActivity(mapIntent); } }

По этим параметрам выводится набережная канала Грибоедова в Питере.

StreetView

Сам формат выглядит следующим образом:

google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom
  • lat - широта
  • lng - долгота
  • yaw - центр панорамы в градусах по часовой стрелке с севера. Обязательно используйте две запятые.
  • pitch - центр обзора панорамы в градусах от -90 (взор вверх) до 90 (взгляд вниз)
  • zoom - масштаб панорамы. 1.0 = нормальный, 2.0 = приближение в 2 раза, 3.0 = в 4 раза и так далее
  • mapZoom - масштабирование места карты, связанное с панорамой. Это значение используется при переходе на Карты.

Также можно внедрить карты в своё приложение. Но это уже совсем другая история.

Если вам попадутся коты на картах, то присылайте мне свои находки.

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

Обсуждение урока на форуме

Реклама