Подавление диалога выбора целей Google Maps

Когда я использую этот код

   string url = "somegooglemapsurl.com";
   Intent mapLauncherIntent = new Intent(android.content.Intent.ACTION_VIEW,  Uri.parse(url));
   startActivity(mapLauncherIntent);

Появится диалоговое окно выбора, спрашивающее, хочу ли я открыть эту карту в приложении карт или в браузере. Я бы хотел, чтобы переход от активности приложения к Google Maps был плавным. Как я могу отключить этот диалог и сказать Android, чтобы открыть карту в деятельности карты?

РЕДАКТИРОВАТЬ: Когда я попадаю в Google Maps, я хочу открыть подсказку направления с использованием общественного транспорта в определенном месте. Я могу сделать это через URL-адрес карты Google, но URL-адрес вызывает диалог выбора.

3 ответа

Решение

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

Он также проверяет, установлены ли карты Google, и предпочитает использовать это, если так.

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?daddr=0,0%20(Imaginary%20Place)&dirflg=r"));
if (isAppInstalled("com.google.android.apps.maps")) {
    intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
}
startActivity(intent);

// helper function to check if Maps is installed
private boolean isAppInstalled(String uri) {
    PackageManager pm = getApplicationContext().getPackageManager();
    boolean app_installed = false;
    try {
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
        app_installed = true;
    } catch (PackageManager.NameNotFoundException e) {
        app_installed = false;
    }
    return app_installed;
}

Вот различные методы, которые я нашел до сих пор:

1. Непосредственно запустить навигацию:

Это явное намерение будет непосредственно запускать Google Navigation:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("google.navigation:q=my+street+address");
startActivity(intent);

Это непосредственно запустит навигацию (к сожалению, без предоставления пользователю выбора транспортных средств)

,

2. Позвольте пользователю выбрать транспортное средство:

Это запустит приложение навигации Google, но позволяет пользователю выбрать средство перед запуском навигации:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://maps.google.com/maps/?daddr=my+street+address");
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
startActivity(intent);

,

3. Запустите на карте Google:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("geo:0,0?q=my+street+address");
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
startActivity(intent);

Это запустит Карты, откуда пользователь может начать навигацию (и выбрать режим транспортировки).

Во всех случаях вы должны либо использовать PackageManager и queryIntentActivities(), либо обработку исключений для обработки случаев, когда у пользователя не установлены Google Maps/Navigation.

В моем приложении я использую метод 2, который работает просто отлично. Надеюсь это поможет.

Дополнение: вот метод, чтобы проверить, установлено приложение или нет. Я использую это, чтобы проверить, установлено ли com.google.android.apps.maps перед вызовом intent.setClassName().

public static boolean isAppInstalled(String uri) {
    PackageManager pm = getContext().getPackageManager();
    boolean app_installed = false;
    try {
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
        app_installed = true;
    } catch (PackageManager.NameNotFoundException e) {
        app_installed = false;
    }
    return app_installed;
}

Прежде всего, я просто укажу, что избавление от этого диалогового окна выбора - не обязательно хорошая вещь. Вы хотите предоставить пользователю как можно больше выбора в том, как он обрабатывает данные, это является частью красоты экосистемы Android. Тем не менее, это несправедливо судить без понимания вашего приложения, так что...

Вы можете использовать geo протокол:

http://developer.android.com/guide/appendix/g-app-intents.html

Вместо того, чтобы передать что-то вроде maps.google.com/blablabla отформатируйте ваш URI вот такgeo:0,0?q=my+street+address,

Пример:

Intent mapLauncherIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=1111+imaginary+dr"));
Другие вопросы по тегам