Подавление диалога выбора целей 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"));