Навигационные приложения с IntentChooser- это тот же запрос?
Я пытаюсь вызвать навигацию из моего приложения.
Я звоню с этим запросом:
String link = "geo:" + posInfo.getLatitude() + "," + posInfo.getLongitude();
Intent navigateIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
Intent chooser = Intent.createChooser(navigateIntent, ctx.getString(R.string.navigate_intent_chooser_title));
ctx.startActivity(chooser);
Выбор намерений отображает 2 приложения: GoogleMaps и Waze.
Навигация с Waze работает отлично, но с картами Google это не работает. Карта отображается, но нет инструкций по навигации. Если я использую GoogleMaps напрямую, я могу перемещаться, так что это связано с тем, как передаются целевые параметры.
Я прочитал в некоторых других ответах, что мне нужно использовать другой запрос для карт Google:
"google.navigation:q.."
У меня есть 2 вопроса:
- Нужны ли разные запросы для разных навигационных приложений?
- Если 1 истинно, как я могу использовать intentChooser с другим запросом?
1 ответ
Решение
Это мое решение:
private static final String PERFIX_DEFAULT_NAVIGATE_LINK_BY_COORDINATES = "geo:";
private static final String PERFIX_DEFAULT_NAVIGATE_LINK_BY_ADDRESS = "geo:0,0?q=";
private static final String PERFIX_DEFAULT_GOOGLE_NAVIGATE = "google.navigation:q=";
private static Intent getChooserNavigateIntent(Context context, Intent navigateIntent, POSEntityInfo posInfo, boolean isCoordinates) {
// Check if there is a default app opener for this type of content.
final PackageManager packageManager = context.getPackageManager();
ResolveInfo defaultAppInfo = packageManager.resolveActivity(navigateIntent,
PackageManager.MATCH_DEFAULT_ONLY);
// create the intent for intent chooser
List<Intent> targetedOpenIntents = new ArrayList<Intent>();
List<ResolveInfo> appInfoList = packageManager.queryIntentActivities(navigateIntent,
PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo appInfo : appInfoList) {
String packageName = appInfo.activityInfo.packageName;
Intent targetedOpenIntent = new Intent(android.content.Intent.ACTION_VIEW).setPackage(packageName);
targetedOpenIntent = getNavigateIntent(appInfo, targetedOpenIntent, isCoordinates, posInfo);
targetedOpenIntents.add(targetedOpenIntent);
}
// create the intent chooser. delete the first member in the list(the default activity)
Intent chooserIntent = Intent.createChooser(targetedOpenIntents.remove(0),
context.getString(R.string.navigate_intent_chooser_title)).putExtra(Intent.EXTRA_INITIAL_INTENTS,
targetedOpenIntents.toArray(new Parcelable[]{}));
return chooserIntent;
}
private static Intent getNavigateIntent(ResolveInfo appInfo, Intent navigateIntent, boolean isCoordinates, POSEntityInfo posInfo) {
// link urls
final String GOOGLE_NAVIGATE_PACKAGE = "com.google.android.apps.maps";
String suffixAddressLink = posInfo.getStreet() + " " + posInfo.getStreetNum() + "," + posInfo.getCity();
String suffixCoordinatesLink = posInfo.getLatitude() + "," + posInfo.getLongitude();
boolean isGoogleMaps = GOOGLE_NAVIGATE_PACKAGE.equals(appInfo.activityInfo.packageName);
//build the link url
StringBuilder link = new StringBuilder();
link.append(isCoordinates ? (isGoogleMaps ? PERFIX_DEFAULT_GOOGLE_NAVIGATE : PERFIX_DEFAULT_NAVIGATE_LINK_BY_COORDINATES) : (isGoogleMaps ? PERFIX_DEFAULT_GOOGLE_NAVIGATE : PERFIX_DEFAULT_NAVIGATE_LINK_BY_ADDRESS));
link.append(isCoordinates ? suffixCoordinatesLink : suffixAddressLink);
Log.d(TAG, "Link = " + link);
return navigateIntent.setData(Uri.parse(link.toString()));
}
// Просто закрыли теги с помощью>