Release Notes for Maps Android API Premium Plan

The Google Maps Android API for the Google Maps APIs Premium Plan was first
released in August 2013. This page is updated with each release. The changelog
below lists the releases by date and includes any new features, bug fixes, and
significant performance improvements.

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 of normal.

The new Google Maps APIs Styling Wizard provides
a quick way to generate a JSON style declaration for your map. The
Google Maps Android API supports the same style declarations as the
Google 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.

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 the MapView class: onCreate(), onStart(),
onResume(), onPause(), onStop(), onDestroy(), onSaveInstanceState(),
and onLowMemory(). Prior to this release, there was no need to forward
onStart() and onStop(), 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 the OnCameraMoveStartedListener
is invoked when the camera starts moving. The callback method receives a
reason for the camera motion.

The onCameraMove() callback of the OnCameraMoveListener is invoked
multiple times while the camera is moving or the user is interacting with
the touch screen.

The OnCameraIdle() callback of the OnCameraIdleListener is invoked
when the camera stops moving and the user has stopped interacting with the
map.

The OnCameraMoveCanceled() callback of the
OnCameraMoveCanceledListener is invoked when the current camera movement
has been interrupted.

You can store an arbitrary data object with a marker using Marker.setTag(),
and retrieve the data object using Marker.getTag(). For details, see the
guide to associating data with a
marker.
(Issue 4650)

With GoogleMap.setMinZoomPreference() and GoogleMap.setMaxZoomPreference()
you can set a prefered 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.

The
OnCameraChangeListener
is deprecated in favour of the new listeners described above - that is,
OnCameraMoveStartedListener, OnCameraMoveListener,
OnCameraMoveCanceledListener and
OnCameraIdleListener.

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.

It's now easier to make circles clickable. You can enable and disable
clickability by providing a
CircleOptions
object with a clickable option, or by calling
Circle.setClickable(boolean). Use an
OnCircleClickListener
to listen to click events on a clickable circle. See a
code sample.

Possible explicit call to the System.gc() in
GoogleMap.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.) The getMap() function has been
deprecated since December 2014. See the
release blog post
for help with converting from getMap() to getMapAsync().

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 on satellite,
terrain or hybrid maps. Even where indoor is not
supported, isIndoorEnabled() will continue to return the value
that has been set via setIndoorEnabled(), as it does now. By
default, setIndoorEnabled is true.
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 to onInfoWindowLongClick(Marker) when the user long
clicks on an info window. This listener behaves similarly to the existing
click listener.

Google Maps Engine was discontinued at the end of January 2016. For that
reason, the MapsEngineLayer class has been removed from the
Google Maps Android API. 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
Google Maps Android API. For details, see the
configuration guide.

All the code samples for the Google Maps Android API are now available
on GitHub.
Note that the samples use the com.google.android.gms.maps package, not
the com.google.android.m4b.maps used with the Google Maps APIs 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 Google Maps Android API 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 Google Maps Android API 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
Google Maps Android API. 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 Google Maps Android API 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 the zOrderOnTop
property to true or when embedding a MapView in a scrollable container.
(Issue 7936)

May 5, 2015

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 the MapView or MapFragment. 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 returning NO_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 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
calling MapView.getMapAsync() or MapFragment.getMapAsync(). The
onMapReady() method is called when the map is ready to be used, and provides
a non-null instance of GoogleMap. 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() or
StreetViewPanoramaFragment.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)

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 new getMapAsync(), described
above. Similarly, getStreetViewPanorama() is deprecated in favor of the
new getStreetViewPanoramaAsync().

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 2013

Added a setOnMapLoadedCallback method to the GoogleMap class.
onMapLoaded is called when the map has completely finished rendering.
(Issue 5779)

Added a setBuildingsEnabled method to the GoogleMap class. Buildings are
still enabled by default. (Issue 5550)

The Google logo has been updated.

Resolved issues

CameraPosition returned in a OnCameraChangeListener now respects map
padding. (Issue 5844)

GroundOverlay.setPositionFromBounds now redraws the ground overlay.

September 2013

Features

Added a setPadding method
to the GoogleMap 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)