使用IntentChooser的导航应用程序-这是相同的查询吗?

bla*_*lay 3 maps android google-maps

我尝试从我的应用程序中调用导航。

我打电话给这个查询:

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);
Run Code Online (Sandbox Code Playgroud)

意向选择器显示2个应用程序:GoogleMaps和Waze。

使用Waze进行导航时,效果很好,但使用Google地图却无法正常工作。我得到显示的地图,但没有导航说明。如果我直接使用GoogleMaps,则可以进行导航,这与意图参数的传递方式有关。

我读了一些其他答案,我需要对谷歌地图使用另一个查询:

"google.navigation:q.."
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 我需要对不同的导航应用程序进行不同的查询吗?
  2. 如果1为true,如何将intentChooser与其他查询一起使用?

bla*_*lay 5

这是我的解决方案:

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()));
}
Run Code Online (Sandbox Code Playgroud)

//只需用>关闭标签