Get Googlemap Snapshot On Background
Solution 1:
Please see update!
Seems it impossible to get Google Map snapshot on background on invisible MapView
because map didn't even starting to load, when it is invisible. You can set correct size for invisible MapVew
(e.g. based on this article), but seems it will be empty black bar with "Google" logo. Possible simplest workaround - still show MapView
, but disable controls and gestures on it:
`publicvoidonMapReady(GoogleMap googleMap){
mGoogleMap = googleMap;
mGoogleMap.getUiSettings().setAllGesturesEnabled(false);
...
}`
or download map image via Static Map API and draw whatever you need locally on downloaded bitmap.
UPDATE:
It's possible to get Google Map snapshot on background on invisible MapView
via setting it to Lite Mode on creation:
...
GoogleMapOptionsoptions=newGoogleMapOptions()
.compassEnabled(false)
.mapToolbarEnabled(false)
.camera(CameraPosition.fromLatLngZoom(KYIV,15))
.liteMode(true);
mMapView = newMapView(this, options);
...
And it's necessary to determine the MapView
size in onMapReady()
via measure()
and layout()
calls to initiate map image loading - than, after map image loaded, it's possible get it in onMapLoaded()
callback:
mMapView.setDrawingCacheEnabled(true);
mMapView.measure(View.MeasureSpec.makeMeasureSpec(mMapWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(mMapHeight, View.MeasureSpec.EXACTLY));
mMapView.layout(0, 0, mMapWidth, mMapHeight);
mMapView.buildDrawingCache(true);
Bitmapb= Bitmap.createBitmap(mMapView.getDrawingCache()); // <- that is bitmap with map image
mMapView.setDrawingCacheEnabled(false);
It is mandatory to call onCreate()
on MapView
object before getMapAsyhc()
, otherwise no map will appear.
Full source code:
publicclassMainActivityextendsAppCompatActivity {
privatestaticfinalStringMAP_VIEW_BUNDLE_KEY="MapViewBundleKey";
staticfinalLatLngKYIV=newLatLng(50.450311, 30.523730);
private ImageView mImageView;
private MapView mMapView;
// dimensions of map imageprivateintmMapWidth=600;
privateintmMapHeight=800;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.image_view);
BundlemapViewBundle=null;
if (savedInstanceState != null) {
mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY);
}
GoogleMapOptionsoptions=newGoogleMapOptions()
.compassEnabled(false)
.mapToolbarEnabled(false)
.camera(CameraPosition.fromLatLngZoom(KYIV,15))
.liteMode(true);
mMapView = newMapView(this, options);
mMapView.onCreate(mapViewBundle);
mMapView.getMapAsync(newOnMapReadyCallback() {
@OverridepublicvoidonMapReady(GoogleMap googleMap) {
// form your card (add markers, path etc.) here:
googleMap.addMarker(newMarkerOptions()
.position(KYIV)
.title("Kyiv"));
// set map size in pixels and initiate image loading
mMapView.measure(View.MeasureSpec.makeMeasureSpec(mMapWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(mMapHeight, View.MeasureSpec.EXACTLY));
mMapView.layout(0, 0, mMapWidth, mMapHeight);
googleMap.setOnMapLoadedCallback(newGoogleMap.OnMapLoadedCallback() {
@OverridepublicvoidonMapLoaded() {
mMapView.setDrawingCacheEnabled(true);
mMapView.measure(View.MeasureSpec.makeMeasureSpec(mMapWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(mMapHeight, View.MeasureSpec.EXACTLY));
mMapView.layout(0, 0, mMapWidth, mMapHeight);
mMapView.buildDrawingCache(true);
Bitmapb= Bitmap.createBitmap(mMapView.getDrawingCache());
mMapView.setDrawingCacheEnabled(false);
mImageView.setImageBitmap(b);
}
});
}
});
}
@OverridepublicvoidonSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
BundlemapViewBundle= outState.getBundle(MAP_VIEW_BUNDLE_KEY);
if (mapViewBundle == null) {
mapViewBundle = newBundle();
outState.putBundle(MAP_VIEW_BUNDLE_KEY, mapViewBundle);
}
}
}
and activity_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="{PACKAGE_NAME}.MainActivity"><ImageViewandroid:id="@+id/image_view"android:layout_width="fill_parent"android:layout_height="fill_parent"
/></RelativeLayout>
which get screenshot with marker on map:
If you wish to show the My Location dot on your lite mode map and use the default location source, you will need to call onResume()
and onPause()
:
...
@OverrideprotectedvoidonResume() {
super.onResume();
if (mMapView != null) {
mMapView.onResume();
}
}
@OverrideprotectedvoidonPause() {
if (mMapView != null) {
mMapView.onPause();
}
super.onPause();
}
...
because the location source will only update between these calls.
Post a Comment for "Get Googlemap Snapshot On Background"