【问题标题】:Android: Generic way to reliably start navigation activity using default appAndroid:使用默认应用程序可靠地启动导航活动的通用方法
【发布时间】:2022-11-11 04:40:26
【问题描述】:

我知道,这个问题和 Android 一样古老(几乎),在 SO 和其他地方有很多关于这个主题的问题。但是,我还没有找到解决此问题的最新有效解决方案:

有没有一种通用的方法来打开一个导航应用程序,使用一个没有指定特定导航应用程序的通用 URI 方案,它实际上适用于那里的主要导航应用程序?

我正在使用 Android 13(Pixel 6)的物理设备上运行这些测试。应用程序在目标 API 31 (Android 12) 上。

首先,这是来自调试会话的证明,证明 Uri 是正确的,坐标也是正确的:

URI 方案“地理”:

Uri gmmIntenturi = Uri.parse("geo:q=" + location.getLatitude() + "," + location.getLongitude());
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntenturi);
startActivity(mapIntent);

结果:

  • 位智:
    • 我收到一条错误消息,说“出了点问题:抱歉,我们目前只能提供 3000 英里以下的路线。我们正在努力增加它”:

    • 在这种情况下的距离是 560 公里的飞行距离或 672 公里的驾驶

  • 谷歌地图:
    • 打开谷歌地图/导航,显示我当前的位置,没有路线

URI 方案“google.navigation”:

Uri gmmIntenturi= Uri.parse("google.navigation:q=" + location.getLatitude() + "," + location.getLongitude());
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntenturi);
startActivity(mapIntent);

结果:

  • 位智:
    • 打开应用程序,显示我当前的位置
    • 似乎根本不关心 URI 中的位置
  • 谷歌导航:
    • 打开应用程序,并在 URI 中正确显示到该位置的路线

是否有更好的方法来可靠地打开默认导航应用程序(或向用户显示可供选择的导航应用程序列表),其中默认/选择的应用程序会自动从设备的当前位置导航到给定坐标?

【问题讨论】:

  • 我认为您的问题是您使用的 URI 没有被某些应用程序“可接受地”处理,并且在 Intent 被选择的任何应用程序使用之前无法知道是否会发生这种情况来处理它。据我所知,一个应用程序没有办法去“哎呀,我的坏”并重新广播Intent,所以另一个应用程序可以对其进行破解(并且不能保证这些应用程序认为他们做错了什么)。如果应用程序说它可以处理该 URI(通过其intent-filters),那么它将被视为一个选项。
  • 是的,但我真的不明白。我读到使用 geo: 和 google.navigation 应该可以工作,并且应用程序出现在列表中,表明它们确实使用这些 Uri 方案侦听意图。他们打开了,但是什么也没有发生。所以,我真的在寻找一种方法来正确地做到这一点......
  • 我的意思是,Android 方面似乎运行良好?你有一个 URI,一些应用程序声称能够处理它,它被传递给他们......一旦应用程序获得 URI,如果它没有按照你期望的方式处理它,那么这要么是一个问题应用程序或 URI 本身。 Android 系统对此无能为力,并且它没有任何方法来“测试”应用程序以查看它们是否真的可以处理 Intent,然后再决定哪个应该执行/应该显示哪个。我对这里的 URI 方案一无所知,但我会调查一下,以及每个应用程序支持什么
  • 只是快速环顾四周(这可能是您在谈论的)4 年前有人问同样的问题:stackoverflow.com/q/47496232/13598222 看起来应用程序本身就是不可靠的,尤其是对于“标准”格式。也许什么都没有改变!如果没有人遵循单一标准,我不知道您是否可以做很多事情 - 所有解决方案似乎都是直接针对特定应用程序
  • 是的,这就是我害怕的=(

标签: android android-intent navigation url-scheme


【解决方案1】:

我的问题是:

有没有更好的方法来可靠地打开默认导航应用程序(或 向用户显示可供选择的导航应用程序列表),其中默认/选择 应用程序自动从当前导航到给定坐标 设备的位置?

快速的答案是:

您似乎需要手动添加不同的导航意图,专门为每个导航应用程序设计,以便按预期工作。

创建“选择器”似乎非常有效,因为您可以为所需的所有导航应用程序添加代码,但只有那些安装在设备上的应用程序才会真正显示在选择器中。这是一些代码:

public static void startNavigation(Context context, double latitude, double longitude)
{
    Uri uriWaze = Uri.parse("https://waze.com/ul?ll=" + latitude + "," +  longitude + "&navigate=yes");
    Intent intentWaze = new Intent(Intent.ACTION_VIEW, uriWaze);
    intentWaze.setPackage("com.waze");

    String uriGoogle = "google.navigation:q=" + latitude + "," + longitude;
    Intent intentGoogleNav = new Intent(Intent.ACTION_VIEW, Uri.parse(uriGoogle));
    intentGoogleNav.setPackage("com.google.android.apps.maps");

    String title = "Choose nav";
    Intent chooserIntent = Intent.createChooser(intentGoogleNav, title);
    Intent[] arr = new Intent[1];
    arr[0] = intentWaze;
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, arr);
    context.startActivity(chooserIntent);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2016-04-21
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多