Cómo tomar una captura de pantalla mediante programación en android de Alert Dialog

He visto el siguiente enlace y se toma una captura de pantalla con la respuesta superior

Sin embargo, lo que quiero es que la aplicación tome una captura de pantalla del cuadro de diálogo de alerta que estoy mostrando al usuario, la solución anterior y el código abajo sólo toma una captura de pantalla de lo que está detrás del diálogo de alerta y por lo tanto no es bueno

Aquí está el código que se utiliza en caso de que alguien no ha pasado por el enlace proporcionado

Date now = new Date(); android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now); try { // image naming and path to include sd card appending name you choose for file String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg"; // create bitmap screen capture View v1 = getWindow().getDecorView().getRootView(); v1.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); v1.setDrawingCacheEnabled(false); File imageFile = new File(mPath); FileOutputStream outputStream = new FileOutputStream(imageFile); int quality = 100; bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); outputStream.flush(); outputStream.close(); openScreenshot(imageFile); } catch (Throwable e) { // Several error may come out with file handling or OOM e.printStackTrace(); } 

EDIT: código de diálogo solicitado

 public void showCalc(String title, String message) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(true); builder.setTitle(title); builder.setMessage(message); builder.setPositiveButton("Capture + Open", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //Remove Values From Inventory captureScreenAndOpen(); } }); builder.setNegativeButton("Capture", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { captureScreen(); Context context = getApplicationContext(); Toast.makeText(context, "Screenshot Captured", Toast.LENGTH_LONG).show(); } }); builder.setNeutralButton("Return", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); builder.show(); } 

EDITAR ADICIONALMENTE:

Aquí podrás ver dos capturas de pantalla, la primera muestra la captura de pantalla guardada cuando todo se guarda en la captura de pantalla del diálogo, te darás cuenta de que en la parte inferior hay un poco de texto que siempre está presente en la parte inferior.

Captura de pantalla1

La segunda captura de pantalla es donde hay tanto texto en el diálogo que el cuadro de diálogo es desplazable para que pueda ver todos los datos, se dará cuenta de que la cadena inferior en la primera captura de pantalla no está presente

Captura de pantalla2

Si es posible, me gustaría que todos los datos se muestran, no estoy seguro si una función de captura de pantalla sería capaz de hacer esto o un método alternativo

Desarrollado en el emulador de Android 5 y su funcionamiento. Tomó su código de diálogo y el código de captura de pantalla del enlace que ha proporcionado.

Este es su AlertDialog

 public void showCalc(String title, String message) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(true); builder.setTitle(title); builder.setMessage(message); builder.setPositiveButton("Capture + Open", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //Remove Values From Inventory captureScreenAndOpen(); } }); builder.setNegativeButton("Capture", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { AlertDialog dialog2 =AlertDialog.class.cast(dialog); takeScreenshot(dialog2); Context context = getApplicationContext(); Toast.makeText(context, "Screenshot Captured", Toast.LENGTH_LONG).show(); } }); builder.setNeutralButton("Return", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); builder.show(); } 

Este es el código de captura de pantalla

 private void takeScreenshot(AlertDialog dialog) { Date now = new Date(); android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now); try { // image naming and path to include sd card appending name you choose for file String mPath = "/data/data/com.rohit.test/test.jpg"; // use your desired path // create bitmap screen capture View v1 = dialog.getWindow().getDecorView().getRootView(); v1.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); v1.setDrawingCacheEnabled(false); File imageFile = new File(mPath); FileOutputStream outputStream = new FileOutputStream(imageFile); int quality = 100; bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); outputStream.flush(); outputStream.close(); } catch (Throwable e) { // Several error may come out with file handling or OOM e.printStackTrace(); } } 

Captura de pantalla

Introduzca aquí la descripción de la imagen

Nota1: Puede generalizar el método takeScreenshot si cambia el tipo de argumento a View y mueve dialog.getWindow().getDecorView().getRootView(); Al código de diálogo desde donde se llama a este método.

Nota2: le vio la pregunta actualizada. No creo que puedas obtener datos enteros en la captura de pantalla cuando algunos de ellos están ocultos. Piense como una captura de pantalla normal (en la computadora o incluso en el teléfono). Usted toma la foto de solamente lo que usted puede ver.

Pruebe esta biblioteca:

https://github.com/jraska/Falcon

Puede capturar diálogos a su captura de pantalla.

1. Mi querido amigo Usted está haciendo una cosa mal por la cual usted no es capaz de tomar la captura de pantalla del cuadro de diálogo.

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

Usted está captando toda la pantalla que está debajo de su AlertDialog

Puede utilizar estos métodos para realizar las tareas enviando la vista de su cuadro de diálogo a este método

Obtener mapa de bits desde una vista

  public static Bitmap loadView(View v) { Bitmap b = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.layout(0, 0, v.getWidth(), v.getHeight()); v.draw(c); return b; } 

Cómo guardar el mapa de bits

  void saveFile(Bitmap bitmap) { String extr = Environment.getExternalStorageDirectory().toString() + File.separator + "Folder"; String fileName = new SimpleDateFormat("yyyyMMddhhmm'_bitmap.jpg'", Locale.US).format(new Date()); File myPath = new File(extr, fileName); FileOutputStream fos = null; try { fos = new FileOutputStream(myPath); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Screen", "screen"); } catch (Exception e) { e.printStackTrace(); } } 
  • Android: ¿Cómo puede obtener framebuffer (captura de pantalla) en un dispositivo con raíz?
  • Android usando el generador de arte de dispositivo para capturas de pantalla
  • Evitar la captura de pantalla en las aplicaciones de Android
  • Cómo tomar una captura de pantalla mediante programación en Android?
  • ¿Alguna razón por la que no pueda tomar una captura de pantalla de mi aplicación con el acceso directo integrado de ICS?
  • Detectar una captura de pantalla Android
  • Android Captura de pantalla o hace video de imágenes
  • ¿Toma una captura de pantalla parcial en Android?
  • ¿Es posible tomar una captura de pantalla de una vista, sin mostrar la vista?
  • Captura de pantalla en android
  • Tamaños de captura de pantalla para publicar la aplicación android en Google Play
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.