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

时间:2014-01-22 07:37:59

标签: android google-maps 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);

意图选择器显示2个应用:GoogleMaps和Waze。

使用Waze的导航功能完美,但使用Google地图无法正常工作。我显示地图但没有导航说明。 如果我直接使用GoogleMaps,那么我可以导航,这与意图参数的传递方式有关。

我在其他一些答案中读到了我需要使用谷歌地图的另一个查询:

"google.navigation:q.."

我有两个问题:

  1. 我是否需要对不同的导航应用程序进行不同的查询?
  2. 如果1为真,我如何使用不同查询的intentChooser?

1 个答案:

答案 0 :(得分: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()));
}

//只需使用&gt;关闭代码