December 20, 2018
Resolved Issues
- Resolved another issue where apps would crash when trying to load a map (Issue 120507393). You should use this release (version 2.34.2) instead of the November 22 release (version 2.34.1) or the November 1 release (version 2.34.0).
Notes
- The new dependencies and updated
compileSdkVersion
as noted below for the November 22 release are still required.
November 22, 2018
Resolved Issues
- Resolved an issue where apps would crash when trying to load a map (Issue 119727875). You should use this release (version 2.34.1) instead of the November 1 release (version 2.34.0).
Notes
New dependencies: You need to add these new dependencies to your app's
build.gradle
file:implementation 'com.android.support:support-v4:+' implementation 'com.android.support:appcompat-v7:+' implementation 'com.google.android.gms:play-services-basement:15.0.1' implementation 'com.google.android.gms:play-services-base:15.0.1'
You should also set
compileSdkVersion
to the latest version (currently 28) in your app'sbuild.gradle
.
See the getting-started guide for full configuration instructions.
November 1, 2018
Features
- Added the
UiSettings.setScrollGesturesEnabledDuringRotateOrZoom(boolean)
and theUiSettings.isScrollGesturesEnabledDuringRotateOrZoom()
methods, allowing you to set a preference for whether scroll gestures can take place at the same time as a zoom or rotate gesture. If enabled, users can scroll the map while rotating or zooming the map. If disabled, the map cannot be scrolled while the user rotates or zooms the map using gestures. This setting doesn't disable scroll gestures entirely, only during rotation and zoom gestures, nor does it restrict programmatic movements and animation of the camera.
Resolved Issues
- Resolved a StackOverflowError that occurred when viewing areas with many indoor buildings. (Issue 35829548)
- Resolved a bug where POI icons were hidden when a custom style that specified icon saturation was applied. (Issue 65660536)
Old Style Removed - November 1, 2018
Features
- Removed support for the old basemap style. The opt-in and opt-out API
options in the
AndroidManifest.xml
(see below) are no longer supported. This applies to all versions of the Maps SDK for Android. See the blog post for more information about the new style.
New Style Enabled by Default - June 14, 2018
Features
Enabled the new basemap style by default. You can still opt-out temporarily if you need time to modify your app to accommodate the new style. If you do, please follow Issue 72780606 which contains the timeline for end of support of the previous basemap style. We will be posting updates there as they are available.
To opt-out, add the following tag to your
AndroidManifest.xml
file, within the<application>
tag. The device must have at least Google Play Services version 12.0.0 in order for the opt-out to work. If you had previously opted-in to the new basemap style, this opt-out tag should replace the opt-in tag. See the blog post for more information about the new style.<meta-data android:name="com.google.android.m4b.maps.API_OPTIONS" android:value="B3H9HE845CFHYG"/>
New Style Opt-In - April 12, 2018
Features
Enabled opt-in for the new basemap style. To opt-in, add the following tag to your
AndroidManifest.xml
file, within the<application>
tags. The device must have at least Google Play Services version 12.0.0 in order for the opt-in to work. See the blog post for more information about the new style.<meta-data android:name="com.google.android.m4b.maps.API_OPTIONS" android:value="B3MWHUG2MR0DQW"/>
April 12, 2018
Features
- Added a mechanism for developers to enable experimental features.
March 20, 2018
Features
- When setting the position of a Street View Panorama, you can now provide a
StreetViewSource
allowing the search to be restricted to outdoor-only results. Note this feature is experimental and some searches may still include indoor panoramas. For details, see the guide to Street View.
Resolved Issues
- Fixed a bug where
IndoorBuilding.getDefaultLevelIndex()
was wrongly returning the active level index instead.
November 6, 2017
Features
- This release expands the custom styling capabilities for polylines and for the outlines of polygons and circles in lite mode, to match the full API, by adding support for stroke patterns, joint types and caps. See examples in the tutorial on adding polygons and polylines to represent areas and routes.
September 18, 2017
Features
Use the new
GoogleMap.OnMyLocationClickListener
to detect when the user clicks the My Location blue dot. (Issue 35822305)
@Override
public void onMyLocationClick(@NonNull Location location) {
Toast.makeText(this, "Current location:\n" + location, Toast.LENGTH_LONG).show();
}
For details, see the guide to the My Location layer.
July 28, 2017
Resolved Issues
DexException: play-services-basement-11.0.2 google-maps-sdk-m4b-2.28.0
occurring in projects that depend onfirebase-messaging
andgoogle-maps-sdk-m4b
(Issue 63931524)IllegalArgumentException: totalAngleRad must be >= 0.0f and <= 2*PI: -2.9516223E-4
occurring when you apply joint type ROUND in polyline options. (Issue 36777405)
June 7, 2017
Resolved Issues
- There was an issue where the Google map did not appear on devices with Android 7.x Nougat, when users increased the display size on their device. (See information about display size settings in Android N.) This issue is now fixed. (Issue 37538038)
February 15, 2017
Features
- This release introduces custom styling for polylines and for the outlines of polygons and circles. Change the stroke pattern from a solid line (default) to your choice of dashes, dots, and gaps. In polylines and polygons, you can specify a bevel or round joint type to replace the default fixed miter joints. You can also change the cap at each end of a polyline from a butt (default) to a square or round cap, or specify a custom bitmap to be used as the cap. The styling of stroke patterns, joint types and start/end caps is available in the full API but not in lite mode. See examples in the tutorial on adding polygons and polylines to represent areas and routes. (Issues 4633, 4787, 4884)
- You can now store arbitrary data objects with your geometry objects. For
example, call
setTag()
to add a data object to a polyline. Similar methods are available for polylines, polygons, circles and ground overlays, as well as the already-existingsetTag()
andgetTag()
methods on markers. (Issue 10306)
Resolved Issues
java.lang.IllegalStateException: LruCache does not have a sizeOf implementation for: null
. (Issue 8211)OutOfMemoryError
while zooming or panning the map. (Issue 5621)- NPE on
MapView#onCreate.
(Issue 10878) - Seeing
Suppressed StrictMode policy violation
in the logs (partially fixed). (Issue 11077) - Unable to remove Guava from
google-maps-sdk-m4b aar
. (Issue 10246)
October 24, 2016
Resolved Issues
- Circle filling flickers on fast update of circle radius and center. (Issue 5707)
- Crash if Google Play app is not available. (Issue 4862)
- Calling
Marker.showInfoWindow()
inonMarkerClick(Marker)
and returning true causesMarker.isInfoWindowShown
to still return false on subsequent marker clicks. (Issue 5408) - Poor performance when app memory footprint is large. (Issue 5445)
- StrictMode violations shown in log. (Issue 10170)
- Warning when building and installing m4b build:
Ignoring InnerClasses attribute for an anonymous inner class
. (Issue 10050)
Notes
- The previously-deprecated
getStreetViewPanorama()
function is no longer available in the Google Play services SDK. (It is still available in the Google Play services APK that is delivered to Android devices. Existing apps therefore continue running normally until you recompile them.) ThegetStreetViewPanorama()
function has been deprecated since December 2014. Instead, you should useStreetViewPanoramaView.getStreetViewPanoramaAsync()
orStreetViewPanoramaFragment.getStreetViewPanoramaAsync()
to get a ready-to-use Street View panorama. See the developer's guide.
September 21, 2016
Features
This release introduces custom styling of the base map. (Issue 5463.) You can pass a JSON style declaration to your
MapStyleOptions
, changing the visual display of features like roads, parks, businesses, and other points of interest. This means that you can emphasize particular components of the map or make the map complement the style of your app. Custom styling is available for maps with a map type ofnormal
.- See the quick guide to styling your map, using night mode as an example style.
- Use styling to prevent certain features from appearing on the map. (Issue 4841)
- Learn the full power of custom styling in the style reference.
The new Maps Platform Styling Wizard provides a quick way to generate a JSON style declaration for your map. The Maps SDK for Android supports the same style declarations as the Maps JavaScript API.
Business points of interest (POIs) now appear by default on the map, provided the map type is
normal
. (Prior to this release, local POIs appeared on the map, but not business POIs.) Business POIs represent businesses such as shops, restaurants, hotels, and more. See the guide to points of interest.You can respond to click events on a POI.
Resolved Issues
- Getting warning Google Maps Android API:
GLHudOverlay deprecated; draw(): no-op
. (Issue 10201) - Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations. (Issue 10166)
- Android Nougat developer preview: MapView blank when resized in Multi Window mode and not focused. (Issue 213354)
- Warnings when building and installing the Premium Plan (
m4b
) build. (Issue 10050)
Notes
Forwarding of lifecycle methods: If you're using the
MapView
class, and the API is in fully interactive mode rather than lite mode, your app must forward the following activity lifecycle methods to the corresponding methods in theMapView
class:onCreate()
,onStart()
,onResume()
,onPause()
,onStop()
,onDestroy()
,onSaveInstanceState()
, andonLowMemory()
. Prior to this release, there was no need to forwardonStart()
andonStop()
, but when you recompile your app with the new release, it's essential to forward them too. See the documentation for details.Improvements to the Premium Plan SDK package:
- A top-level README file describing the package contents.
- The top-level directory renamed to
maps_for_business_sdk
, making it easier to update existing libraries manually. - Various improvements to the documentation and file comments, including
clarified comments about permissions in
AndroidManifest.xml
. - Corrected name
release_m4b.jar
in.release-classpath
. - Removed reference to a non-existent source jar in
.release-classpath
.
August 1, 2016
Features
This release introduces a set of new camera change listeners for camera motion start, ongoing, and end events. You can also see why the camera is moving, whether it's caused by user gestures, built-in API animations or developer-controlled movements. Below is a summary of the new listeners. For details, see the guide to camera change events. (Issue 4636)
- The
onCameraMoveStarted()
callback of theOnCameraMoveStartedListener
is invoked when the camera starts moving. The callback method receives areason
for the camera motion. - The
onCameraMove()
callback of theOnCameraMoveListener
is invoked multiple times while the camera is moving or the user is interacting with the touch screen. - The
OnCameraIdle()
callback of theOnCameraIdleListener
is invoked when the camera stops moving and the user has stopped interacting with the map. - The
OnCameraMoveCanceled()
callback of theOnCameraMoveCanceledListener
is invoked when the current camera movement has been interrupted.
- The
You can store an arbitrary data object with a marker using
Marker.setTag()
, and retrieve the data object usingMarker.getTag()
. For details, see the guide to associating data with a marker. (Issue 4650)With
GoogleMap.setMinZoomPreference()
andGoogleMap.setMaxZoomPreference()
you can set a preferred minimum and/or maximum zoom level. This is useful, for example, if your app shows a defined area around a point of interest, or if you're using a custom tile overlay with a limited set of zoom levels. For details, see the guide to setting minimum/maximum zoom preferences. (Issue 4663)With
GoogleMap.setLatLngBoundsForCameraTarget()
, you can constrain the lat/lng centre bounds of the focal point of the map (the camera target) so that users can only scroll and pan within these bounds. For example, a retail app for a shopping centre or airport may want to constrain the map to a particular bounds, allowing users to scroll and pan within those bounds. For details, see the guide to restricting the user's panning to a given area.
Improvements and Resolved Issues
- Marker icon anchor breaks with Google Play services 9.0.83. (Issue 9768)
ActivityNotFoundException
when Google Map is uninstalled/deactivated. (Issue 9483)
Notes
- The
OnCameraChangeListener
is deprecated in favour of the new listeners described above - that is,OnCameraMoveStartedListener
,OnCameraMoveListener
,OnCameraMoveCanceledListener
andOnCameraIdleListener
.
July 14, 2016
- There are no functional changes in this release. The new library download fixes a packaging bug that caused duplicate file exceptions when depending on recent releases of the Google Play services SDK.
June 29, 2016
Features
- The new
MarkerOptions.zIndex()
sets the stack order of a marker in relation to other markers on the map. Read more about marker z-indexes and the effect of z-index on click events. (Issue 4688) - You can set a transparency factor on tile overlays, so users can see the base map below the overlaid tiles. Read more about tile overlay transparency and the way it works with fade-in animation. (Issue 4765)
- It's now easier to make circles clickable. You can enable and disable
clickability by providing a
CircleOptions
object with aclickable
option, or by callingCircle.setClickable(boolean)
. Use anOnCircleClickListener
to listen to click events on a clickable circle. See a code sample.
Resolved Issues
- NullPointerException: Attempt to invoke virtual method
boolean java.io.File.mkdir()
on a null object reference. (Issue 9021) - NullPointerException: Attempt to invoke interface method
java.util.Iterator java.util.List.iterator()
on a null object reference atcom.google.maps.api.android.lib6.d.ei.a()
. (Issue 9008) - Calling
Marker.setIcon()
with resource id on marker outside view makes the marker white. (Issue 9765) - Setting icon for google map markers will sometimes cause a flicker. (Issue 8531)
- Calling
Marker.setIcon()
causes info window to disappear. (Issue 5419) - Marker stops dragging if icon is changed in
onMarkerDragStart
event. (Issue 5932) - Info window no longer highlights on touch when implementing custom
InfoWindowAdapter
. (Issue 7809) - Polylines drawn incorrectly in certain cases. (Issue 5313)
- Strange behaviour drawing polyline. (Issue 5123)
- Polylines which venture near the poles are drawn incorrectly. (Issue 9176)
- NullPointerException when clicking directions toolbar button. (Issue 8817)
- Possible explicit call to the
System.gc()
inGoogleMap.getProjection().toScreenLocation()
. (Issue 6483) - When using
SupportMapFragment
, the API leaks memory on screen rotation until the map is loaded for the current zoom level. (Issue 5905) GoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng,zoom))
messes up the zoom if cancelled. (Issue 6947)
Notes
- The previously-deprecated
getMap()
function is no longer available in the SDK. (It is still available in the Google Play services APK that is delivered to Android devices.) ThegetMap()
function has been deprecated since December 2014. See the release blog post for help with converting fromgetMap()
togetMapAsync()
. - Deprecation notice: In a future release, indoor
maps will only be available on
normal
type maps. From that future release, indoor maps will not be supported onsatellite
,terrain
orhybrid
maps. Even where indoor is not supported,isIndoorEnabled()
will continue to return the value that has been set viasetIndoorEnabled()
, as it does now. By default,setIndoorEnabled
istrue
. Subscribe to these release notes for a notification of each release.
February 11, 2016
Features
This release introduces a number of new event listeners:
OnInfoWindowLongClickListener
triggers a callback toonInfoWindowLongClick(Marker)
when the user long clicks on an info window. This listener behaves similarly to the existing click listener.OnInfoWindowCloseListener
triggers a callback toonInfoWindowClose(Marker)
when an info window closes. For details, see the guide to info window events. (Issue 5469)OnPolylineClickListener
triggers a callback toonPolylineClick(Polyline)
when the user clicks on a polyline. See the guide to polyline events.OnPolygonClickListener
triggers a callback toonPolygonClick(Polygon)
when the user clicks on a polygon. See the guide to polygon events. (Issue 4683)OnGroundOverlayClickListener
triggers a callback toonGroundOverlayClick(GroundOverlay)
when the user clicks on a ground overlay. See the guide to ground overlay events.- You can enable or disable the clickability of polylines, polygons and ground
overlays by calling
setClickable(boolean)
on the relevant object.
Resolved Issues
- Zoom into maximum level when info window is double tapped. (Issue 4640)
- Android maps v2 marker infowindow RTL text problem. (Issue 5608)
- Correct tiles generated by TileProvider but rendered solid white on the map. (Issue 8084)
- Memory leak. (Issue 8696)
- Turning on the my location layer leaks the Activity. (Issue 8111)
Notes
- Google Maps Engine was discontinued at the end of January 2016. For that
reason, the
MapsEngineLayer
class has been removed from the Maps SDK for Android. For more details, see the Google Maps Engine information page.
November 12, 2015
Notes
- If you're targeting version 8.3 or later of the Google Play services SDK, you
no longer need the
WRITE_EXTERNAL_STORAGE
permission to use the Maps SDK for Android. For details, see the configuration guide. - All the code samples for the Maps SDK for Android are now available
on GitHub.
Note that the samples use the
com.google.android.gms.maps
package, not thecom.google.android.m4b.maps
used with the Google Maps Platform Premium Plan. The samples also require the Google Play services SDK, as they use the Location APIs for parts of the demo.
October 1, 2015
Features
- The Maps SDK for Android now supports ambient mode for wearable apps. Ambient mode is for always on apps, and is activated when the user is no longer actively using the app, allowing the app to remain visible on the wearable device. The Maps SDK for Android provides a simplified, low-color rendering of the map. This mode reduces the power consumption of your app and ensures a consistent look and feel with other ambient apps, such as watch faces.
Notes
- Android 6.0 (Marshmallow) introduces a new model for handling permissions, which streamlines the process for users when they install and upgrade apps. If your app targets API level 23 or later, you can use the new permissions model. This is particularly important if you're using the My Location layer in the Maps SDK for Android. To learn more, see the documentation for the My Location layer.
June 23, 2015
Resolved Issues
- Problems when running on devices that have a version of Google Play services older than 7.3.
June 2, 2015
Features
- The Maps SDK for Android is now available on Android Wear. Create map-based apps that run directly on wearable devices.
Resolved Issues
- Problems rendering a map in a
MapView
when setting thezOrderOnTop
property to true or when embedding aMapView
in a scrollable container. (Issue 7936) - Map toolbar always visible in lite mode, even if disabled. (Issue 7947)
May 5, 2015
Features
- A new interface, StreetViewPanorama.OnStreetViewPanoramaLongClickListener, supports long-clicking (tapping and holding down the finger) on a Street View panorama.
- When using the
MapView
class in lite mode, forwarding lifecycle events is now optional, with some exceptions as noted in the documentation. - To disable click events on a map in lite mode, you can call
setClickable()
on the view that contains theMapView
orMapFragment
. This is useful, for example, when displaying a map or maps in a list view, where you want the click event to invoke an action unrelated to the map. For details, see the documentation.
Resolved Issues
showInfoWindow()
now works in lite mode as well as full mode.TileOverlay.clearTileCache()
works as expected after returningNO_TILE
. (Issue 4755)- The API is more selective in its logging behavior in lite mode, when reporting the functions that are not supported in lite mode. It no longer logs the default calls that are made at app startup.
- CameraUpdateFactory is now properly initialized, so you should no longer see
a NullPointerException 'CameraUpdateFactory is not initialized' after
MapView.getMap()
returns a valid GoogleMap. (Issue 6499) - App launch performance is improved, and the main thread is no longer blocked on app launch. (Issue 7532)
- StreetViewPanoramaView no longer requests focus in
onCreate()
, thus no longer causing the view to scroll to make Street View visible. (Issue 7566) - Fixed a resource leak that showed itself in strict mode. (Issue 5992)
- Fixed a NullPointerException that occurred with
setPadding()
in accessibility mode. (Issue 7619) - Fixed a bug crashing apps when loading an icon from an asset. (Issue 7696)
December 8, 2014
Features
- The API offers a new lite mode. When lite mode is enabled, the API serves a bitmap image instead of a fully-interactive map. Lite mode supports all of the map types and a subset of the functionality supplied by the full API. Markers and shapes are drawn on top of the static image client-side, so you still have full control over them. A lite-mode map is useful when you want to display a number of small maps, or a map that is too small to offer meaningful interactivity.
- A new map toolbar is
available in both lite mode and full mode, and is enabled by default in both
modes for apps that are recompiled against the new client library. Tapping on
the toolbar opens the Google Maps mobile app, giving users quick access to
directions and turn-by-turn navigation to the selected marker. In lite mode
the toolbar is static, whereas in full mode it slides in when the user taps a
marker. You can disable the toolbar in both modes, by calling
UiSettings.setMapToolbarEnabled(false)
. - The API supports a new
onMapReady()
callback which you can set by callingMapView.getMapAsync()
orMapFragment.getMapAsync()
. TheonMapReady()
method is called when the map is ready to be used, and provides a non-null instance ofGoogleMap
. This means that you no longer need to check for a non-null map before using the map. See the guide to adding a map. - Similarly, you can now use
StreetViewPanoramaView.getStreetViewPanoramaAsync()
orStreetViewPanoramaFragment.getStreetViewPanoramaAsync()
to get a ready-to-use Street View panorama. See the documentation.
Resolved Issues
GoogleMap.CancelableCallback()
now behaves correctly when animating/moving the camera. (Issue 5208)- The visible region's
LatLngBounds
are now calculated correctly in landscape mode. (Issue 5285) - A marker performance regression is fixed. (Issue 7174)
- The problem with arrowhead shapes in triangulating convex quadrilaterals is fixed. (Issue 6197 - the initial problem reported is now fixed)
Notes
getMap()
is deprecated in favour of the newgetMapAsync()
, described above. Similarly,getStreetViewPanorama()
is deprecated in favor of the newgetStreetViewPanoramaAsync()
.- For apps that are recompiled against the new client library, the map's
zoom controls
are disabled by default. Up to this release, they have been enabled by
default. You can still enable and disable them by calling
UiSettings.setZoomControlsEnabled()
.
October 16, 2014
- Updated some assets to use material design.
May 13, 2014
- Added Street View for embedding and controlling panoramic 360-degree views.
- Added functionality to indoor maps so that you can respond to indoor and level change events, and replace the level picker with your own. (Issue 5939)
- Improved accessibility features across various embedded controls.
- Enabled the rendering of Chinese characters on Maps Engine Layer infocards.
May 6, 2014
Features
- Support for Google Maps Engine Layers.
Add Google Maps Engine layers as interactive Tile Overlays with the new
MapsEngineLayer
class.
January 2014
Features
- Added a
fadeIn
flag toTileOverlayOptions
to toggle the fade-in of tiles.
Resolved issues
- Failed API key authentication attempts are no longer cached. (Issue 6099)
October 2013
Features
- Added a
setImage
method to theGroundOverlay
class that allows you to change the image of a ground overlay. (Issue 4847) - Added an
alpha
option andsetAlpha
method to markers. (Issue 4768) - Added a
setOnMapLoadedCallback
method to theGoogleMap
class.onMapLoaded
is called when the map has completely finished rendering. (Issue 5779) - Added a
setBuildingsEnabled
method to theGoogleMap
class. Buildings are still enabled by default. (Issue 5550) - The Google logo has been updated.
Resolved issues
CameraPosition
returned in aOnCameraChangeListener
now respects map padding. (Issue 5844)GroundOverlay.setPositionFromBounds
now redraws the ground overlay.
September 2013
Features
- Added a
setPadding
method to theGoogleMap
class that allows you to indicate parts of the map that may be obscured by other views. Setting padding re-positions the standard map controls, and camera updates will use the padded region. (Issue 4670, Issue 5321) - Added the
LatLngBounds.getCenter
method. (Issue 4664) - Added methods to
Marker
:setFlat
, which toggles between billboarded (default) and flat markers. (Issue 4881)setInfoWindowAnchor
. (Issue 5338, Issue 5131)setRotation
.
Resolved issues
GooglePlayServicesUtil.getErrorDialog
always returns a dialog, except when Google Play services is available. (Issue 4720)
August 2013
Features
- Initial release.