android - Android 意图选择器 - 导航应用
问题描述
在我的应用程序中,我有一个按钮,可以打开带有已发送坐标的 Google 地图。
final ImageView view = findViewById(R.id.navigate);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://maps.google.com/maps?daddr="+gps1+","+gps2));
startActivity(intent);
}
});
这工作正常,但我想在单击按钮后向用户提供他设备中的所有导航应用程序。
所以不要自动打开谷歌地图,而是让用户选择使用哪个应用程序。
我找到了这个解决方案,但这仅适用于谷歌地图和 Waze。由于我不知道用户在他的设备上有哪些导航应用程序以及有多少导航应用程序,因此我无法对所有现有导航应用程序进行硬编码。
String url = "waze://?ll=" + latitude + ", " + longitude + "&navigate=yes";
Intent intentWaze.setPackage("com.waze");
Intent intentWaze = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
String uriGoogle = "google.navigation:q=" + latitude + "," + longitude;
Intent intentGoogleNav.setPackage("com.google.android.apps.maps");
Intent intentGoogleNav = new Intent(Intent.ACTION_VIEW, Uri.parse(uriGoogle));
String title = context.getString(R.string.title);
Intent chooserIntent = Intent.createChooser(intentGoogleNav, title);
Intent[] arr = new Intent[1];
arr[0] = intentWaze;
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, arr);
context.startActivity(chooserIntent);
那么是否有任何解决方案,可以提供用户拥有的所有导航应用程序?
例如对于共享功能,它的工作原理如下:
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,
infox);
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, getString(R.string.share)));
这将显示许多具有共享可能性的应用程序。如何为带有地图的应用程序做同样的事情?
编辑:我将此添加到 google 和 waze 代码中,所以现在我已在选择器中列出:Google 地图、Waze 和一个未知的 android 图标,当我单击它时,它会显示我设备上的所有导航应用程序!但是,只有当我单击那个未命名的图标并且它只打开那些没有导航的地图时。
String urlx = "geo:" + gps1 + ", " + gps2;
Intent intentOther = new Intent(Intent.ACTION_VIEW, Uri.parse(urlx));
单击按钮后,我需要立即显示所有这些应用程序。
解决方案
这是一年后的事,我实际上是在尝试使用上面的解决方案,但遇到了一些问题。比如选择器中的两个位智应用
我刚刚在 kotlin 中重写了解决方案以及对我真正有用的解决方案
val url = "waze://?ll=" + latitude + ", " + longitude + "&navigate=yes"
var intentWaze = Intent(Intent.ACTION_VIEW, Uri.parse(url)).setPackage("com.waze")
val uriGoogle = "google.navigation:q=" + latitude + "," + longitude
var intentGoogleNav = Intent(Intent.ACTION_VIEW, Uri.parse(uriGoogle)).setPackage("com.google.android.apps.maps")
val title: String = context.getString(R.string.app_name)
val chooserIntent = Intent.createChooser(intentGoogleNav, title)
val arr = arrayOfNulls<Intent>(1)
arr[0] = intentWaze
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, arr)
context.startActivity(chooserIntent)
推荐阅读
- android - Android Studio 从 Mp3 文件中检索 ID3 元数据注释
- vba - 无法使用 XMLHTTP 请求获取文档的内容
- flutter - 如何将装饰(边框、提示文本、前缀图标、后缀图标)添加到新的自动完成小部件....?
- java - 用java语言解析时到达文件末尾
- c++ - 有没有办法在 Windows 上的 C++ 中安装 OpenCV,而不使用任何 IDE,而只能在 cmd 中?
- php - 来自数据库的未定义常量 laravel-8 计数数据
- css - 即使容器具有 justify-content: 'space-between',如何让 2 个项目彼此相邻?
- python - 如何将两个序列化程序绑定到单独的一个序列化程序 django rest 框架中?
- azerothcore - 安装某些模块时遇到问题
- macos - 无法在 macOS M1 上构建映像:gcc:错误:缺少“-march=”的参数