Yandex maps android intent

Интеграция карт в ваше Android-приложение

Есть много разных идей, для реализации которых могут понадобиться карты на мобильных устройствах.
Возможности таких устройств позволяют довольно оперативно получать информацию о местоположении, графические данные и графические преобразования для отображения объёма ландшафта.

В данном статье я расскажу как интегрировать возможность просмотра карт для мобильных устройств на основе Android, на примере Yandex Карт и Google Maps.
Функционал библиотек этих компаний позволяет:

  • Перемещать карту
  • Изменять масштаб
  • Изменять виды карт
  • Получать события от карты

Начнём с отечественного производителя.

Yandex

Библиотеку Yandex MapKit можно скачать с GitHub’а, там же есть версия и для iOS.
Но прежде чем начать использовать, нам надо получить API-key, для этого идём на почту и пишем письмо в support@mobmaps.yandex.ru, указав в заголовке «Map Kit запрос API-ключа». В ответ вам пришлют письмо с указанием дополнительных ссылок на документацию, на правила использования и собственно с самим ключом в теле письма (а могут и не прислать, кстати).

Пока ждём письмо, берём библиотеку и прикрепляем её к проекту.

После долгого ожидания с кружкой кофе, знакомимся с содержимым письма и информации по ссылкам, берём ключик и пишем в вашем layout’е приложения следующий код:

где заместо «you are key» вставляем полученный ключ. Всё, карта есть.

Далее код показывает, как перемещать карту на заданную координату и использовать зум:

Google

Для использования Google Maps надо совершить куда более изощрённые действия. Я расскажу, как получить debug-key для использования карт, но процесс получения release версии похоже несколько замороченней, но я release ещё не получал.

Для получения debug-key, надо найти ваше хранилище ключей, для отладки.
По-умолчанию, путь будет выглядеть примерно так:

Затем открываем командную строку, переходим в каталог, куда установлена Java:

где путь_до_хранилища_ключей — свой путь до debug.keystore (осторожно, возможны проблемы с пробелами в пути).

После чего в том же окне будет выведен md5-ключ после «Certificate fingerprint (MD5)».
Идём по ссылке и регистрируем код.
После чего Google сгенерирует с нужным кодом для layout и встроенным кодом, берём его и вставляем к себе в layout.
Далее нам, надо наш Activity представить в примерно следующем виде:

Замечу, что Activity наследован должен быть от MapActivity хранящийся в com.google.android.maps.MapActivity.
А в манифесте прописать между тегами вставить:

И не забыть, про разрешение доступа в интернет для приложения:

В остальном функционал GoogleMaps и YandexMapKit весьма схож:

Как можно видеть, процесс интеграции карт в приложения довольно простой, а спектр использования довольно широк.
Более подробно можно ознакомиться ниже.

Определение собственной позиции

Чтобы немного расширить пример, приложу кусок кода:

Но для использования этого кода, в манифесте следует указать следующее разрешение:

Источник

Launch Yandex.Maps Android app

This section applies to the Yandex.Maps mobile app, version 4.0 or higher.

Читайте также:  Андроид не может включиться постоянно перезагружается

You can launch mobile Yandex.Maps for Android from a Java app or browser page. Use the yandexmaps URL scheme to launch the app. Yandex.Maps can run the following actions on launch:

Support for geo scheme section shows how to open the map using a different URI scheme. With this method, the user can choose which app to open.

Open map

You can display the map using the following URL format:

Map center coordinates (longitude, latitude).

Map zoom. An integer from 1 to 18, where 1 is the least detailed map zoom (whole world), and 18 is the highest zoom possible.

Viewport. Longitudinal and latitudinal size of the viewport in degrees, comma-separated. For example, to set a viewport of 10.5 degrees, specify: spn=10.5, 10.5 .

The viewport center is set using the ll parameter (map center).

If z (zoom) is already set, then spn is ignored.

Map type and traffic information.

Type of map: map (Map), sat (Satellite), skl (Hybrid), pmap (Public Map).

Show road traffic: trf (\»traffic\» layer). You can enable the traffic layer only, or combine it with some map type. In this case, the parameter values are comma-separated. For example: l=map,trf .

Parameter Data type Description

Map center coordinates (longitude, latitude).

Map zoom. An integer from 1 to 18, where 1 is the least detailed map zoom (whole world), and 18 is the highest zoom possible.

Viewport. Longitudinal and latitudinal size of the viewport in degrees, comma-separated. For example, to set a viewport of 10.5 degrees, specify: spn=10.5, 10.5 .

The viewport center is set using the ll parameter (map center).

If z (zoom) is already set, then spn is ignored.

Map type and traffic information.

Type of map: map (Map), sat (Satellite), skl (Hybrid), pmap (Public Map).

Show road traffic: trf (\»traffic\» layer). You can enable the traffic layer only, or combine it with some map type. In this case, the parameter values are comma-separated. For example: l=map,trf .

Источник

Bramengton / NavigationApps.java

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

Parameter Data type Description
import android.content.ActivityNotFoundException ;
import android.content.Context ;
import android.content.ContextWrapper ;
import android.content.Intent ;
import android.content.pm.PackageManager ;
import android.net.Uri ;
import android.util.Log ;
import org.json.JSONArray ;
import org.json.JSONException ;
/**
* @author Bramengton on 16.08.2018.
*/
public final class NavigationApps extends ContextWrapper <
private Intent mIntent;
private static final Intent GOOGLE = new Intent ( Intent . ACTION_VIEW )
.setPackage( » com.google.android.apps.maps » );
private static final Intent WAZE = new Intent ( Intent . ACTION_VIEW )
.setPackage( » com.waze » );
private static final Intent MAPSME = new Intent ( » com.mapswithme.maps.pro.action.BUILD_ROUTE » )
.setPackage( » com.mapswithme.maps.pro » );
private static final Intent NAVITEL = new Intent ( Intent . ACTION_VIEW )
.setPackage( » com.navitel » );
private static final Intent CITYGUIDE = new Intent ( Intent . ACTION_SEND )
.setType( » vnd.android.cursor.item/vnd.net.probki.cityguide.cmd » )
.setPackage( » cityguide.probki.net » );
private static final Intent OSMAND = new Intent ( Intent . ACTION_VIEW )
.setPackage( » net.osmand » );
private static final Intent YANDEX = new Intent ( » ru.yandex.yandexnavi.action.BUILD_ROUTE_ON_MAP » )
.setPackage( » ru.yandex.yandexnavi » );
private static final Intent TWOGIS = new Intent ( Intent . ACTION_VIEW )
.setPackage( » ru.dublgis.dgismobile » );
public enum Apps <
GOOGLE , WAZE , OSMAND , MAPSME , NAVITEL , CITYGUIDE , YANDEX , TWOGIS
>
// App link to Google Play Market
private static final String MARKET_LINK = » market://details?id=%s » ;
// Google api for delivery to navigation app next point coordinates
private static final String GOOGLE_NAVIGATION = » google.navigation:ll=%s,%s » ;
private static final String GOOGLE_MAP_NAVIGATION = » http://maps.google.com/maps?%s » ; // saddr=%1$s&daddr=%2$s+to:%3$s
// Waze api for delivery to weze next point coordinates
private static final String WAZE_NAVIGATION = » waze://?ll=%s,%s&navigate=yes » ;
private static final String CITYGUIDE_NAVIGATION = » cgcmd delroute setroute %s » ;
// 2GIS api for delivery to 2gis navigator next point coordinates in custom format /from/ , /to/ ,
// — vehicle type (car (car route), ctx (public transport), pedestrian (hiking route), taxi) default is «car»
// , — coordinates of the beginning and end of the route.
private static final String TWOGIS_NAVIGATION = » dgis://2gis.ru/routeSearch/rsType/car/to/%s,%s » ;
private static final String TWOGIS_MAP_NAVIGATION = » dgis://2gis.ru/routeSearch/rsType/car/%s » ;
public NavigationApps ( Context base ) <
super (base);
>
/**
* Set geo coordinates point of destination point
* @param flag select one of enumerated apps
* @param points array of coordinates like (lat, lon, lat, lon)
*/
public NavigationApps setDestination ( final Apps flag , LatLng . points ) <
mIntent = new Intent ();
switch (flag) <
case GOOGLE :
if (points . length == 1 ) <
mIntent = GOOGLE . setData( Uri . parse( String . format( GOOGLE_NAVIGATION , points[ 0 ] . latitude, points[ 0 ] . longitude)));
break ;
>
StringBuilder google = new StringBuilder ();
int i = 0 ;
for ( LatLng point : points) <
switch (i) <
case 0 :
google . append( » &daddr= » ) . append(point . toString());
break ;
default :
google . append( » +to: » ) . append(point . toString());
break ;
>
i ++ ;
>
mIntent = GOOGLE . setData( Uri . parse( String . format( GOOGLE_MAP_NAVIGATION , google . toString())));
break ;
case NAVITEL :
mIntent = NAVITEL . setData( Uri . parse( String . format( GOOGLE_NAVIGATION , points[ 0 ] . latitude, points[ 0 ] . longitude)));
break ;
case OSMAND :
mIntent = OSMAND . setData( Uri . parse( String . format( GOOGLE_NAVIGATION , points[ 0 ] . latitude, points[ 0 ] . longitude)));
break ;
case WAZE :
mIntent = WAZE . setData( Uri . parse( String . format( WAZE_NAVIGATION , points[ 0 ] . latitude, points[ 0 ] . longitude)));
break ;
case MAPSME :
mIntent = MAPSME ;
mIntent . putExtra( » lat_to » , points[ 0 ] . latitude);
mIntent . putExtra( » lon_to » , points[ 0 ] . longitude);
mIntent . putExtra( » router » , » vehicle » );
break ;
case YANDEX :
mIntent = YANDEX ;
mIntent . putExtra( » lat_to » , points[ 0 ] . latitude);
mIntent . putExtra( » lon_to » , points[ 0 ] . longitude);
break ;
case CITYGUIDE :
mIntent = CITYGUIDE ;
StringBuilder cityguide = new StringBuilder ();
// cityguide.append(points.length > 1 ? points.length/2 : 0);
cityguide . append(points . length > 1 ? points . length : 0 );
for ( LatLng point : points) <
cityguide . append( » » ) . append(point . latitude) . append( » » ) . append(point . longitude);
>
// Log.e(«LOGIN», String.format(«CITYGUIDE: cgcmd delroute setroute %s», cityguide.toString()));
mIntent . putExtra( Intent . EXTRA_TEXT , String . format( CITYGUIDE_NAVIGATION , cityguide . toString()));
break ;
case TWOGIS :
if (points . length == 1 ) <
mIntent = TWOGIS . setData( Uri . parse( String . format( TWOGIS_NAVIGATION , points[ 0 ] . longitude, points[ 0 ] . latitude)));
break ;
>
StringBuilder tgis = new StringBuilder ();
int j = 0 ;
for ( LatLng point : points) <
if (j == 0 ) tgis . append( String . format( » from/%s,%s » , point . longitude, point . latitude));
else <
if (j > 1 ) break ; // only for 2 points
tgis . append( String . format( » /to/%s,%s » , point . longitude, point . latitude));
>
j ++ ;
>
mIntent = TWOGIS . setData( Uri . parse( String . format( TWOGIS_MAP_NAVIGATION , tgis . toString())));
break ;
>
return this ;
>
/**
* Check selected navigation application is installed or not
* @param flag select one of enumerated apps
*/
public void checkPackage ( Apps flag ) throws ActivityNotFoundException <
Intent intent;
switch (flag) <
case GOOGLE :
intent = GOOGLE ;
break ;
case NAVITEL :
intent = NAVITEL ;
break ;
case OSMAND :
intent = OSMAND ;
break ;
case WAZE :
intent = WAZE ;
break ;
case MAPSME :
intent = MAPSME ;
break ;
case YANDEX :
intent = YANDEX ;
break ;
case CITYGUIDE :
intent = CITYGUIDE ;
break ;
case TWOGIS :
intent = TWOGIS ;
break ;
default : return ;
>
if ( ! isPackageInstalled(intent)) <
openMarket(intent);
>
>
/**
* Show the selected navigation application and build a route
* @param install if navigation application not installed open GooglePlay on instalation page
*/
public void guideMe ( boolean install ) throws ActivityNotFoundException <
if (isPackageInstalled(mIntent)) <
startActivity(mIntent . addFlags( Intent . FLAG_ACTIVITY_NEW_TASK )
.addFlags( Intent . FLAG_ACTIVITY_RESET_TASK_IF_NEEDED )
.addFlags( Intent . FLAG_ACTIVITY_CLEAR_TOP ));
> else <
if (install) <
openMarket(mIntent);
> else <
throw new ActivityNotFoundException ();
>
>
>
private boolean isPackageInstalled ( Intent intent ) <
try <
return getApplicationContext() . getPackageManager() . getPackageInfo(intent . getPackage(), 0 ) . packageName . equalsIgnoreCase(intent . getPackage());
> catch ( PackageManager . NameNotFoundException e) <
return false ;
>
>
private void openMarket ( Intent intent ) <
startActivity(
new Intent ( Intent . ACTION_VIEW , Uri . parse( String . format( MARKET_LINK , intent . getPackage())))
.addFlags( Intent . FLAG_ACTIVITY_NEW_TASK )
.addFlags( Intent . FLAG_ACTIVITY_RESET_TASK_IF_NEEDED )
.addFlags( Intent . FLAG_ACTIVITY_CLEAR_TOP )
);
>
public static class LatLng <
public double latitude;
public double longitude;
public LatLng ( double var1 , double var3 ) <
if ( — 180.0D var3 && var3 180.0D ) <
this . longitude = var3;
> else <
this . longitude = ((var3 — 180.0D ) % 360.0D + 360.0D ) % 360.0D — 180.0D ;
>
this . latitude = Math . max( — 90.0D , Math . min( 90.0D , var1));
>
public final int hashCode () <
long var2 = Double . doubleToLongBits( this . latitude);
int var1 = 31 + ( int )(var2 ^ var2 >>> 32 );
var2 = Double . doubleToLongBits( this . longitude);
return var1 * 31 + ( int )(var2 ^ var2 >>> 32 );
>
public final boolean equals ( Object var1 ) <
if ( this == var1) <
return true ;
> else if ( ! (var1 instanceof LatLng )) <
return false ;
> else <
LatLng var2 = ( LatLng )var1;
return Double . doubleToLongBits( this . latitude) == Double . doubleToLongBits(var2 . latitude) && Double . doubleToLongBits( this . longitude) == Double . doubleToLongBits(var2 . longitude);
>
>
public final String toString () <
double var1 = this . latitude;
double var3 = this . longitude;
return String . format( » %s, %s » ,var1,var3);
>
>
>

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Читайте также:  Six guns разборки банд android
Оцените статью