首页 > 解决方案 > 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));

单击按钮后,我需要立即显示所有这些应用程序。

标签: androidandroid-intent

解决方案


这是一年后的事,我实际上是在尝试使用上面的解决方案,但遇到了一些问题。比如选择器中的两个位智应用

我刚刚在 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)

推荐阅读