Captura de pantalla de GoogleMap Android API V2

Actualización final

Google ha cumplido la solicitud de función. Por favor vea esta respuesta abajo.

Pregunta original

Utilizando la versión antigua de la API de Google Maps para Android, pude capturar una captura de pantalla del mapa de google para compartirla a través de las redes sociales. He utilizado el siguiente código para capturar la captura de pantalla y guardar la imagen en un archivo y funcionó muy bien:

public String captureScreen() { String storageState = Environment.getExternalStorageState(); Log.d("StorageState", "Storage state is: " + storageState); // image naming and path to include sd card appending name you choose for file String mPath = this.getFilesDir().getAbsolutePath(); // create bitmap screen capture Bitmap bitmap; View v1 = this.mapView.getRootView(); v1.setDrawingCacheEnabled(true); bitmap = Bitmap.createBitmap(v1.getDrawingCache()); v1.setDrawingCacheEnabled(false); OutputStream fout = null; String filePath = System.currentTimeMillis() + ".jpeg"; try { fout = openFileOutput(filePath, MODE_WORLD_READABLE); // Write the string to the file bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout); fout.flush(); fout.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block Log.d("ImageCapture", "FileNotFoundException"); Log.d("ImageCapture", e.getMessage()); filePath = ""; } catch (IOException e) { // TODO Auto-generated catch block Log.d("ImageCapture", "IOException"); Log.d("ImageCapture", e.getMessage()); filePath = ""; } return filePath; } 

Sin embargo, el nuevo objeto de GoogleMap utilizado por V2 de la api no tiene un método "getRootView ()" como MapView.

Traté de hacer esto:

  SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.basicMap); View v1 = mapFragment.getView(); 

Pero la captura de pantalla que recibo no tiene ningún contenido de mapa y se ve así: Captura de pantalla de mapa en blanco

¿Alguien ha descubierto cómo tomar una captura de pantalla del nuevo Google Maps Android API V2?

Actualizar

También traté de obtener la rootView de esta manera:

 View v1 = getWindow().getDecorView().getRootView(); 

Esto resulta en una captura de pantalla que incluye la barra de acción en la parte superior de la pantalla, pero el mapa sigue en blanco como la captura de pantalla adjunta.

Actualizar

Se ha enviado una solicitud de función a Google. Por favor, haz clic en la función de solicitud de característica si esto es algo que quieres que Google agregue en el futuro: Añadir capacidad de captura de pantalla a Google Maps API V2

Actualización – Google ha añadido un método de instantánea ** !:

Se ha cumplido la solicitud de característica para un método para tomar una captura de pantalla de la capa de OpenGL de Google Map API V2 OpenGL.

Para realizar una captura de pantalla, simplemente implemente la siguiente interfaz:

 public abstract void onSnapshotReady (Bitmap snapshot) 

y llama:

public final void snapshot (GoogleMap.SnapshotReadyCallback callback)

Ejemplo que toma una captura de pantalla y luego presenta las opciones estándar de "Compartir imagen":

 public void captureScreen() { SnapshotReadyCallback callback = new SnapshotReadyCallback() { @Override public void onSnapshotReady(Bitmap snapshot) { // TODO Auto-generated method stub bitmap = snapshot; OutputStream fout = null; String filePath = System.currentTimeMillis() + ".jpeg"; try { fout = openFileOutput(filePath, MODE_WORLD_READABLE); // Write the string to the file bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout); fout.flush(); fout.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block Log.d("ImageCapture", "FileNotFoundException"); Log.d("ImageCapture", e.getMessage()); filePath = ""; } catch (IOException e) { // TODO Auto-generated catch block Log.d("ImageCapture", "IOException"); Log.d("ImageCapture", e.getMessage()); filePath = ""; } openShareImageDialog(filePath); } }; mMap.snapshot(callback); } 

Una vez que la imagen se ha terminado de ser capturado, se disparará el diálogo estándar "Compartir imagen" para que el usuario puede elegir cómo les gustaría compartirlo:

 public void openShareImageDialog(String filePath) { File file = this.getFileStreamPath(filePath); if(!filePath.equals("")) { final ContentValues values = new ContentValues(2); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath()); final Uri contentUriFile = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); final Intent intent = new Intent(android.content.Intent.ACTION_SEND); intent.setType("image/jpeg"); intent.putExtra(android.content.Intent.EXTRA_STREAM, contentUriFile); startActivity(Intent.createChooser(intent, "Share Image")); } else { //This is a custom class I use to show dialogs...simply replace this with whatever you want to show an error message, Toast, etc. DialogUtilities.showOkDialogWithText(this, R.string.shareImageFailed); } } 

La documentación está aquí

A continuación se muestran los pasos para capturar la captura de pantalla de Google Map V2 con ejemplo

Paso 1. Android Sdk Manager (Window > Android Sdk Manager) luego Expand Extras ahora update/install Google Play Services to Revision 10 ignore este paso si ya está installed

Lea las notas aquí https://developers.google.com/maps/documentation/android/releases#august_2013

Paso 2. Restart Eclipse

Paso 3. import com.google.android.gms.maps.GoogleMap.SnapshotReadyCallback;

Paso 4. Hacer método para capturar / almacenar pantalla / imagen de mapa como abajo

 public void CaptureMapScreen() { SnapshotReadyCallback callback = new SnapshotReadyCallback() { Bitmap bitmap; @Override public void onSnapshotReady(Bitmap snapshot) { // TODO Auto-generated method stub bitmap = snapshot; try { FileOutputStream out = new FileOutputStream("/mnt/sdcard/" + "MyMapScreen" + System.currentTimeMillis() + ".png"); // above "/mnt ..... png" => is a storage path (where image will be stored) + name of image you can customize as per your Requirement bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); } catch (Exception e) { e.printStackTrace(); } } }; myMap.snapshot(callback); // myMap is object of GoogleMap +> GoogleMap myMap; // which is initialized in onCreate() => // myMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map_pass_home_call)).getMap(); } 

Paso 5. Ahora llame a este método CaptureMapScreen() donde desea capturar la imagen

En mi caso estoy calling this method on Button click in my onCreate() que está funcionando bien

me gusta:

 Button btnCap = (Button) findViewById(R.id.btnTakeScreenshot); btnCap.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { CaptureMapScreen(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }); 

Consulta Doc aquí y aquí

Editar : esta respuesta ya no es válida: se ha cumplido la solicitud de características de capturas de pantalla en Google Maps Android API V2. Vea esta respuesta para un ejemplo .

Respuesta aceptada original

Dado que los nuevos mapas de la API de Android v2 se muestran con OpenGL, no hay posibilidades de crear una captura de pantalla.

Dado que la respuesta mejor votada no funciona con polilíneas y otras superposiciones en la parte superior del fragmento de mapa (Lo que estaba buscando), quiero compartir esta solución.

 public void captureScreen() { GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() { @Override public void onSnapshotReady(Bitmap snapshot) { try { getWindow().getDecorView().findViewById(android.R.id.content).setDrawingCacheEnabled(true); Bitmap backBitmap = getWindow().getDecorView().findViewById(android.R.id.content).getDrawingCache(); Bitmap bmOverlay = Bitmap.createBitmap( backBitmap.getWidth(), backBitmap.getHeight(), backBitmap.getConfig()); Canvas canvas = new Canvas(bmOverlay); canvas.drawBitmap(snapshot, new Matrix(), null); canvas.drawBitmap(backBitmap, 0, 0, null); OutputStream fout = null; String filePath = System.currentTimeMillis() + ".jpeg"; try { fout = openFileOutput(filePath, MODE_WORLD_READABLE); // Write the string to the file bmOverlay.compress(Bitmap.CompressFormat.JPEG, 90, fout); fout.flush(); fout.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block Log.d("ImageCapture", "FileNotFoundException"); Log.d("ImageCapture", e.getMessage()); filePath = ""; } catch (IOException e) { // TODO Auto-generated catch block Log.d("ImageCapture", "IOException"); Log.d("ImageCapture", e.getMessage()); filePath = ""; } openShareImageDialog(filePath); } catch (Exception e) { e.printStackTrace(); } } }; ; map.snapshot(callback); } 

Eclipse DDMS puede capturar la pantalla incluso es google mapa V2.

Trate de llamar a / system / bin / screencap o / system / bin / screenshot si tiene la "raíz". Aprendí que de cómo Eclipse androide DDMS implementar "captura de pantalla"

  • Mostrar barra de herramientas para el marcador de Google Maps automáticamente
  • Hacer TileOverlays transparente
  • Android Google Map V2 Pantalla ¿Mostrar y mostrar sólo el botón de zoom?
  • Ocultar infoWindow cuando se hace clic en el marcador por segunda vez (Google Map Android API V2)
  • Cajón de navegación google maps v2, cajón de bloqueo de mapas
  • Google Maps Android API v2: ¿Mi marcador de ubicación siempre sobre otros marcadores?
  • Android Polyline - Adición punto por punto
  • Agregar varios ClusterManager al mapa de Google
  • Cómo actualizar los marcadores en el mapa en android?
  • Para Android Map api v2 Descripción referencias biblioteca no existente google-play-services_lib \ bin \ google-play-services_lib.jar
  • Adición de un botón a una vista personalizada de InfoWindowAdapter que puede registrar clics
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.