Captura captura de pantalla de GoogleMap Android API V2

Actualización final

La solicitud de función ha sido cumplida por Google. Por favor, mira esta respuesta a continuación.

Pregunta original

Utilizando la versión anterior de la API de Android de Google Maps, pude capturar una captura de pantalla del mapa de Google para compartir a través de las redes sociales. Usé el siguiente código para capturar la captura de pantalla y guardar la imagen en un archivo y funcionó de maravilla:

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 GoogleMap utilizado por V2 de la API no tiene un método “getRootView ()” como lo hace 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 Vista raíz de esta manera:

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

Esto da como resultado una captura de pantalla que incluye la barra de acciones en la parte superior de la pantalla, pero el mapa aún está en blanco, como la captura de pantalla que adjunté.

Actualizar

Se ha enviado una solicitud de función a Google. Por favor, marque la solicitud de función si esto es algo que desea que Google agregue en el futuro: agregue capacidad de captura de pantalla a Google Maps API V2

Actualización: Google agregó un método de captura ** !:

Se ha cumplido la solicitud de función de un método para tomar una captura de pantalla de la capa OpenGL de Android Google Map API V2.

Para tomar 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 “Uso compartido de imágenes”:

 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 ha terminado de capturarse, activará el cuadro de diálogo estándar “Compartir imagen” para que el usuario pueda elegir cómo desea 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 el ejemplo

Paso 1. Abre Android Sdk Manager (Window > Android Sdk Manager) luego Android Sdk Manager (Window > Android Sdk Manager) Expand Extras ahora update/install Google Play Services to Revision 10 ignora 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. Crear un método para capturar / almacenar la pantalla / imagen del mapa como se muestra a continuación

 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 llama a este método CaptureMapScreen() donde quieras 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(); } } }); 

Comprueba Doc aquí y aquí

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

Respuesta original aceptada

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

Dado que la respuesta más votado 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); } 
 private GoogleMap mMap; SupportMapFragment mapFragment; LinearLayout linearLayout; String jobId="1"; 

Archivo de archivo;

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_maps); linearLayout=(LinearLayout)findViewById (R.id.linearlayout); // Obtain the SupportMapFragment and get notified when the map is ready to be used. mapFragment = (SupportMapFragment)getSupportFragmentManager () .findFragmentById (R.id.map); mapFragment.getMapAsync (this); //Taking Snapshot of Google Map } /** * Manipulates the map once available. * This callback is triggered when the map is ready to be used. * This is where we can add markers or lines, add listeners or move the camera. In this case, * we just add a marker near Sydney, Australia. * If Google Play services is not installed on the device, the user will be prompted to install * it inside the SupportMapFragment. This method will only be triggered once the user has * installed Google Play services and returned to the app. */ @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // Add a marker in Sydney and move the camera LatLng sydney = new LatLng (-26.888033, 75.802754); mMap.addMarker (new MarkerOptions ().position (sydney).title ("Kailash Tower")); mMap.moveCamera (CameraUpdateFactory.newLatLng (sydney)); mMap.setOnMapLoadedCallback (new GoogleMap.OnMapLoadedCallback () { @Override public void onMapLoaded() { snapShot(); } }); } // Initializing Snapshot Method public void snapShot(){ GoogleMap.SnapshotReadyCallback callback=new GoogleMap.SnapshotReadyCallback () { Bitmap bitmap; @Override public void onSnapshotReady(Bitmap snapshot) { bitmap=snapshot; bitmap=getBitmapFromView(linearLayout); try{ file=new File (getExternalCacheDir (),"map.png"); FileOutputStream fout=new FileOutputStream (file); bitmap.compress (Bitmap.CompressFormat.PNG,90,fout); Toast.makeText (MapsActivity.this, "Capture", Toast.LENGTH_SHORT).show (); sendSceenShot (file); }catch (Exception e){ e.printStackTrace (); Toast.makeText (MapsActivity.this, "Not Capture", Toast.LENGTH_SHORT).show (); } } };mMap.snapshot (callback); } private Bitmap getBitmapFromView(View view) { Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas (returnedBitmap); Drawable bgDrawable =view.getBackground(); if (bgDrawable!=null) { //has background drawable, then draw it on the canvas bgDrawable.draw(canvas); } else{ //does not have background drawable, then draw white background on the canvas canvas.drawColor(Color.WHITE); } view.draw(canvas); return returnedBitmap; } //Implementing Api using Retrofit private void sendSceenShot(File file) { RequestBody job=null; Gson gson = new GsonBuilder () .setLenient () .create (); Retrofit retrofit = new Retrofit.Builder () .baseUrl (BaseUrl.url) .addConverterFactory (GsonConverterFactory.create (gson)) .build (); final RequestBody requestBody = RequestBody.create (MediaType.parse ("image/*"),file); job=RequestBody.create (MediaType.parse ("text"),jobId); MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData ("name",file.getName (), requestBody); API service = retrofit.create (API.class); Call call=service.sendScreen (job,fileToUpload); call.enqueue (new Callback () { @Override public void onResponse(Call  call, Response response) { if (response.body ().getMessage ().equalsIgnoreCase ("Success")){ Toast.makeText (MapsActivity.this, "success", Toast.LENGTH_SHORT).show (); } } @Override public void onFailure(Call  call, Throwable t) { } }); } 

}

Espero que esto ayude a capturar la captura de pantalla de tu mapa

Llamada al método:

 gmap.setOnMapLoadedCallback(mapLoadedCallback); 

Declaración de método:

 final SnapshotReadyCallback snapReadyCallback = new SnapshotReadyCallback() { Bitmap bitmap; @Override public void onSnapshotReady(Bitmap snapshot) { bitmap = snapshot; try { //do something with your snapshot imageview.setImageBitmap(bitmap); } catch (Exception e) { e.printStackTrace(); } } }; GoogleMap.OnMapLoadedCallback mapLoadedCallback = new GoogleMap.OnMapLoadedCallback() { @Override public void onMapLoaded() { gmap.snapshot(snapReadyCallback); } }; 

Capture la captura de pantalla del mapa. Será útil

  private GoogleMap map; private static LatLng latLong; 

`

 public void onMapReady(GoogleMap googleMap) { map = googleMap; setMap(this.map); animateCamera(); map.moveCamera (CameraUpdateFactory.newLatLng (latLong)); map.setOnMapLoadedCallback (new GoogleMap.OnMapLoadedCallback () { @Override public void onMapLoaded() { snapShot(); } }); } 

`

Método snapShot () para tomar una captura de pantalla del mapa

  public void snapShot(){ GoogleMap.SnapshotReadyCallback callback=new GoogleMap.SnapshotReadyCallback () { Bitmap bitmap; @Override public void onSnapshotReady(Bitmap snapshot) { bitmap=snapshot; try{ file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"map.png"); FileOutputStream fout=new FileOutputStream (file); bitmap.compress (Bitmap.CompressFormat.PNG,90,fout); Toast.makeText (PastValuations.this, "Capture", Toast.LENGTH_SHORT).show (); }catch (Exception e){ e.printStackTrace (); Toast.makeText (PastValuations.this, "Not Capture", Toast.LENGTH_SHORT).show (); } } };map.snapshot (callback); } 

Mi salida está debajo enter image description here

Eclipse DDMS puede capturar la pantalla, incluso si se trata del mapa de Google V2.

Intenta llamar a / system / bin / screencap o / system / bin / screenshot si tienes la “raíz”. Aprendí eso de cómo Eclipse Android DDMS implementa la “captura de pantalla”