在我的应用程序中,我有一个按钮,可以打开带有发送坐标的谷歌地图。
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)));
这将显示许多具有共享可能性的应用程序。如何对带有地图的应用程序执行相同的操作?
编辑:我将其添加到谷歌和Waze代码中,所以现在我已经在选择器中列出:谷歌地图,Waze和一个未知的Android图标,当我单击它时,它会显示我设备上的所有导航应用程序!但是,仅当我单击该未命名图标时,它只会打开这些地图而没有导航。
String urlx = "geo:" + gps1 + ", " + gps2;
Intent intentOther = new Intent(Intent.ACTION_VIEW, Uri.parse(urlx));
我需要在单击按钮后立即显示所有这些应用程序。
因此,正如我发现的那样,没有通用的方法可以在意图选择器中的所有导航应用程序上强制导航路线,所以我像上面提到的那样解决了它,只是我在 geo 中添加了一个参数,如下所示:
geo:0,0?q=latitude,longitude
并添加到清单:
<data android:scheme="geo"/>
这在选择器中显示了我设备上的所有导航应用程序,并且主要显示地图上的点和坐标,但是像Waze这样的一些应用程序也会立即计算路线,所以我认为这是一个很好的解决方案。
这是一年后,我实际上正在尝试使用上面的解决方案,但我遇到了一些问题。例如选择器中的两个位智应用程序
我刚刚用 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)