Skip to content

Instantly share code, notes, and snippets.

@Bramengton
Last active December 9, 2020 11:37
Show Gist options
  • Save Bramengton/f067bdb70ed19be3d5e4d4dcc7a80fec to your computer and use it in GitHub Desktop.
Save Bramengton/f067bdb70ed19be3d5e4d4dcc7a80fec to your computer and use it in GitHub Desktop.
Open navigation app and build route by coordinates (google map, waze, maps.me, navitel. city guide, osmand, yandex navigation, 2gis)
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 <type>/from/<lon>,<lat>/to/<lon>,<lat>
// <type> - vehicle type (car (car route), ctx (public transport), pedestrian (hiking route), taxi) default is "car"
// <lon>,<lat> - 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);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment