diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 5fb106372..5119f2e7b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -23,6 +23,7 @@ import android.location.Location; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.CallSuper; import android.support.annotation.FloatRange; @@ -2453,6 +2454,28 @@ public class MapView extends FrameLayout { mMapboxMap = mapboxMap; } + @UiThread + void snapshot(@NonNull final MapboxMap.SnapshotReadyCallback callback, @Nullable final Bitmap bitmap) { + final TextureView textureView = (TextureView) findViewById(R.id.textureView); + final boolean canUseBitmap = bitmap != null && textureView.getWidth() == bitmap.getWidth() && textureView.getHeight() == bitmap.getHeight(); + + new AsyncTask() { + @Override + protected Bitmap doInBackground(Void... params) { + if (canUseBitmap) { + return textureView.getBitmap(bitmap); + } else { + return textureView.getBitmap(); + } + } + + @Override + protected void onPostExecute(Bitmap bitmap) { + callback.onSnapshotReady(bitmap); + } + }.execute(); + } + // // View utility methods // diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 088d43e2a..96849688e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -1,5 +1,6 @@ package com.mapbox.mapboxsdk.maps; +import android.graphics.Bitmap; import android.location.Location; import android.os.SystemClock; import android.support.annotation.FloatRange; @@ -1468,6 +1469,16 @@ public class MapboxMap { mMapView.update(); } + @UiThread + public void snapshot(@NonNull SnapshotReadyCallback callback, @Nullable final Bitmap bitmap) { + mMapView.snapshot(callback, bitmap); + } + + @UiThread + public void snapshot(@NonNull SnapshotReadyCallback callback) { + mMapView.snapshot(callback, null); + } + // // Interfaces // @@ -1689,6 +1700,10 @@ public class MapboxMap { void onFinish(); } + public interface SnapshotReadyCallback { + void onSnapshotReady(Bitmap snapshot); + } + private class MapChangeCameraPositionListener implements MapView.OnMapChangedListener { private static final long UPDATE_RATE_MS = 400; diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index ae9c17922..b183f62ac 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -187,7 +187,14 @@ android:name="@string/category" android:value="@string/category_other" /> - + + + + + + + + + + + + +