启动导航活动的意图

27
在我的应用程序中,我有一个选项可以启动导航到所选POI的功能。基本上,我想从我的应用程序中启动一款带有转向导航指示的导航器。问题在于,我不知道安装了哪个(如果有)导航器。
因此,问题是如何通过首先向用户显示适合导航的活动列表来启动意图,让他选择要使用的活动?还要找到一种方法将额外的参数传递给所选的活动(这对我来说听起来像是一个问题,因为不同的导航应用程序使用不同的附加参数名称,我猜)。
如果不清楚,我正在寻找一种显示适用于导航的应用程序列表并提供设置默认选项的方式。
编辑:在此处查找实现 http://datamoil.blogspot.com/2011/04/android-universal-intent-to-start.html
4个回答

21

不好的消息是,导航没有标准的Intent URI。

是的,存在google.navigation URI,并且应用程序可以选择支持它。

我能想到的最好解决方案是:

  • 明确检查已知的应用程序
  • 隐式地检查钩住google.navigation: 和 可能的geo:(但是这样也会得到地图应用程序)

您可以使用PackageManage.queryIntentActivities枚举可能的隐式目标。


不幸的是,你是对的。我按照你的建议实现了它。虽然它不是最优雅的解决方案,但它可以正常工作并基本符合我的预期。 - Ilya Saunkin

12

尝试:

Intent intent = new Intent(Intent.ACTION_VIEW, 
    Uri.parse("google.navigation:q=New+York+NY")); 
startActivity(intent);

感谢您的努力,但这不是我要找的。Google导航仅在美国境内运作,并不一定是首选的导航应用程序。我认为我的问题已经很清楚了,我正在寻找一种显示适合导航的应用程序列表的方法。 - Ilya Saunkin
2
这完全取决于导航应用程序使用的意图过滤器。据我所知,导航意图没有特定的类别。我手机上的导航应用程序捕获了我刚才发布的意图。因此,当我调用它时,我会得到不同应用程序的列表,而不仅仅是谷歌导航。 - pumpkee
2
每个智能导航应用程序都应该为此意图进行注册,因为当您选择一个地址并单击导航时,这就是地图调用的意图。 - pumpkee
2
显然并非所有的应用都有这样的公共意图。例如Navigon就有一个公共意图来实现这一点。http://www.navigon.com/portal/common/faq/files/online_documents/NAVIGON_Android_public_Intent.pdf - Ilya Saunkin

5

首先,在按钮的监听器中,我使用了onTap方法:

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=New+York+NY")); 
mContext.startActivity(i);

然后在清单文件中简单地使用:

<activity android:name=".LaunchGPS" android:screenOrientation="portrait">
  <intent-filter>       
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

这将打开您手机上安装的任何导航应用程序,例如VZ Navigator、Google或其他预装应用。对我来说第一次就完美地起作用了。希望这能解决您的问题。

上面的答案也是这样做的。但对我没用。请阅读androidika的回答下面的评论。 - Ilya Saunkin

0

我发现使用这段代码有更多的优势(仅用于显示可用的导航应用程序)

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:"));
if (intent.resolveActivity(getActivity().getPackageManager()) != null)   {
    startActivityForResult(Intent.createChooser(intent, "Continues with:", CHOOSE_NAVIGATOR_ID);
} else {
   // Handle failure...
}

1
你能否解释一下这段代码?我对Java一无所知。 - user6250760
我正在使用意图对象来“筛选”当前安装在手机上能够解释此类型方案的应用程序(通常是地图或导航应用程序)。 这个动作被委托给resolveActivity方法,实际上检查是否至少有一个应用程序可以解释这个URI。 如果存在,将创建一个“chooser”,即一个特殊的可点击列表,其中包含各种兼容的应用程序图标,触摸其中一个,将会发送到其应用程序并传递之前在URI中定义的参数。 - Lorenzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接