如何从我的应用程序打开标准的Google Map应用程序?
一旦用户在我的应用程序中按下button,我想要打开标准的Google地图应用程序,并显示特定的位置。 我该怎么做? (不使用com.google.android.maps.MapView
)
您应该使用geo-URI创build一个Intent
对象:
String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); context.startActivity(intent);
如果你想指定一个地址,你应该使用另一种forms的geo-URI: geo:0,0?q=address
。
参考: https : //developer.android.com/guide/components/intents-common.html#Maps
您也可以简单地使用http://maps.google.com/maps作为您的URI
String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "&daddr=" + destinationLatitude + "," + destinationLongitude; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); startActivity(intent);
或者您可以确保仅使用Google地图应用程序,则可以通过使用来停止出现意图filter(对话框)
intent.setPackage("com.google.android.apps.maps");
像这样:
String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "&daddr=" + destinationLatitude + "," + destinationLongitude; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); intent.setPackage("com.google.android.apps.maps"); startActivity(intent);
或者你可以通过在每一组坐标之后在括号内添加一个string来向位置添加标签,如下所示:
String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "(" + "Home Sweet Home" + ")&daddr=" + destinationLatitude + "," + destinationLongitude + " (" + "Where the party is at" + ")"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); intent.setPackage("com.google.android.apps.maps"); startActivity(intent);
以用户当前位置作为起点(不幸的是,我还没有find标记当前位置的方法),那么就按照下面的步骤saddr
参数:
String uri = "http://maps.google.com/maps?daddr=" + destinationLatitude + "," + destinationLongitude + " (" + "Where the party is at" + ")"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); intent.setPackage("com.google.android.apps.maps"); startActivity(intent);
为了完整起见,如果用户没有安装地图应用程序,那么捕获ActivityNotFoundException将是一个好主意,正如@TonyQ所述,然后我们可以在没有地图应用程序限制的情况下再次启动活动,我们可以很确定我们永远不会到达吐司,因为互联网浏览器也是一个有效的应用程序来启动这个urlscheme。
String uri = "http://maps.google.com/maps?daddr=" + 12f + "," + 2f + " (" + "Where the party is at" + ")"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); intent.setPackage("com.google.android.apps.maps"); try { startActivity(intent); } catch(ActivityNotFoundException ex) { try { Intent unrestrictedIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); startActivity(unrestrictedIntent); } catch(ActivityNotFoundException innerEx) { Toast.makeText(this, "Please install a maps application", Toast.LENGTH_LONG).show(); } }
使用string格式将有所帮助,但您必须充分了解语言环境。 在德国,浮动将以逗号分隔,而不是一个点。
使用String.format("geo:%f,%f",5.1,2.1);
在语言环境英语结果将是"geo:5.1,2.1"
但与德语区域你会得到"geo:5,1,2,1"
您应该使用英文区域设置来防止此行为。
String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); context.startActivity(intent);
要为地理点设置标签,您可以使用以下方法扩展地理位置:
! 但要小心这个geo-uri仍在开发 http://tools.ietf.org/html/draft-mayrhofer-geo-uri-00
String uri = String.format(Locale.ENGLISH, "geo:%f,%f?z=%d&q=%f,%f (%s)", latitude, longitude, zoom, latitude, longitude, label); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); context.startActivity(intent);
从谷歌检查这个页面:
http://developer.android.com/guide/appendix/g-app-intents.html
您可以使用表单的URI
geo:latitude,longitude
打开Google地图查看器并将其指向一个位置。
您也可以使用下面的代码片段,以这种方式在开始意图之前检查Google地图的存在。
Uri gmmIntentUri = Uri.parse(String.format(Locale.ENGLISH,"geo:%f,%f", latitude, longitude)); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); if (mapIntent.resolveActivity(getPackageManager()) != null) { startActivity(mapIntent); }
参考: https : //developers.google.com/maps/documentation/android-api/intents
有时,如果没有任何与geo:protocal关联的应用程序,则可以使用try-catch来获取ActivityNotFoundException来处理它。
它发生在你使用一些模拟器,如默认情况下未安装google map的androVM。
我有一个示例应用程序,在此准备意图,并将CITY_NAME传递给地图标记活动,最终使用地理编码器使用CITY_NAME计算经度和纬度。
以下是启动地图标记活动和完整的MapsMarkerActivity的代码片段。
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } else if (id == R.id.action_refresh) { Log.d(APP_TAG, "onOptionsItemSelected Refresh selected"); new MainActivityFragment.FetchWeatherTask().execute(CITY, FORECAS_DAYS); return true; } else if (id == R.id.action_map) { Log.d(APP_TAG, "onOptionsItemSelected Map selected"); Intent intent = new Intent(this, MapsMarkerActivity.class); intent.putExtra("CITY_NAME", CITY); startActivity(intent); return true; } return super.onOptionsItemSelected(item); }
public class MapsMarkerActivity extends AppCompatActivity implements OnMapReadyCallback { private String cityName = ""; private double longitude; private double latitude; static final int numberOptions = 10; String [] optionArray = new String[numberOptions]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Retrieve the content view that renders the map. setContentView(R.layout.activity_map); // Get the SupportMapFragment and request notification // when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); // Test whether geocoder is present on platform if(Geocoder.isPresent()){ cityName = getIntent().getStringExtra("CITY_NAME"); geocodeLocation(cityName); } else { String noGoGeo = "FAILURE: No Geocoder on this platform."; Toast.makeText(this, noGoGeo, Toast.LENGTH_LONG).show(); return; } } /** * Manipulates the map when it's available. * The API invokes this callback when the map is ready to be used. * This is where we can add markers or lines, add listeners or move the camera. In this case, * we just add a marker near Sydney, Australia. * If Google Play services is not installed on the device, the user receives a prompt to install * Play services inside the SupportMapFragment. The API invokes this method after the user has * installed Google Play services and returned to the app. */ @Override public void onMapReady(GoogleMap googleMap) { // Add a marker in Sydney, Australia, // and move the map's camera to the same location. LatLng sydney = new LatLng(latitude, longitude); // If cityName is not available then use // Default Location. String markerDisplay = "Default Location"; if (cityName != null && cityName.length() > 0) { markerDisplay = "Marker in " + cityName; } googleMap.addMarker(new MarkerOptions().position(sydney) .title(markerDisplay)); googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); } /** * Method to geocode location passed as string (eg, "Pentagon"), which * places the corresponding latitude and longitude in the variables lat and lon. * * @param placeName */ private void geocodeLocation(String placeName){ // Following adapted from Conder and Darcey, pp.321 ff. Geocoder gcoder = new Geocoder(this); // Note that the Geocoder uses synchronous network access, so in a serious application // it would be best to put it on a background thread to prevent blocking the main UI if network // access is slow. Here we are just giving an example of how to use it so, for simplicity, we // don't put it on a separate thread. See the class RouteMapper in this package for an example // of making a network access on a background thread. Geocoding is implemented by a backend // that is not part of the core Android framework, so we use the static method // Geocoder.isPresent() to test for presence of the required backend on the given platform. try{ List<Address> results = null; if(Geocoder.isPresent()){ results = gcoder.getFromLocationName(placeName, numberOptions); } else { Log.i(MainActivity.APP_TAG, "No Geocoder found"); return; } Iterator<Address> locations = results.iterator(); String raw = "\nRaw String:\n"; String country; int opCount = 0; while(locations.hasNext()){ Address location = locations.next(); if(opCount == 0 && location != null){ latitude = location.getLatitude(); longitude = location.getLongitude(); } country = location.getCountryName(); if(country == null) { country = ""; } else { country = ", " + country; } raw += location+"\n"; optionArray[opCount] = location.getAddressLine(0)+", " +location.getAddressLine(1)+country+"\n"; opCount ++; } // Log the returned data Log.d(MainActivity.APP_TAG, raw); Log.d(MainActivity.APP_TAG, "\nOptions:\n"); for(int i=0; i<opCount; i++){ Log.i(MainActivity.APP_TAG, "("+(i+1)+") "+optionArray[i]); } Log.d(MainActivity.APP_TAG, "latitude=" + latitude + ";longitude=" + longitude); } catch (Exception e){ Log.d(MainActivity.APP_TAG, "I/O Failure; do you have a network connection?",e); } } }
链接到期,所以我已经粘贴上面的完整代码,但以防万一,如果你想看到完整的代码,那么它的可用在: https : //github.com/gosaliajigar/CSC519/tree/master/CSC519_HW4_89753
- 如何更改Android应用程序的包名称
- Genymotion如何使用Chrome开发工具进行debugging
- :app:dexDebug ExecException用非零的退出值2结束
- 在Android 4上使用Android Studio的NoClassDefFoundError
- 如何检索android studio中签名的APK的密钥别名和密钥密码(从Eclipse迁移)
- 为首选项创build自定义布局
- Android java.net.UnknownHostException:主机无法parsing
- Android自定义ListView无法点击项目
- 如何从Firebase android获取所有的子列表