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
- Cómo tomar capturas de pantalla en Android 2.3.3 sin root?
- La captura de pantalla DDMS no funciona
- Captura de pantalla en negro
- Android: publicar una aplicación con diferentes capturas de pantalla correspondientes a diferentes idiomas?
- Captura de pantalla de Android OpenGL
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.
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
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
- Captura de pantalla desde el servicio de fondo de otra aplicación (mediante programación)
- Escuche la acción de captura de pantalla en android
- Tomar una captura de pantalla de una vista completa
- ¿Necesito capturas de pantalla para tablets Android de 7 y 10 pulgadas?
- facebook screenshot-tests-para-android thow NullPointer en hacer captura de pantalla
- Google Play, capturas de pantalla para tabletas y orden de imágenes
- ¿Cómo tomar la captura de pantalla mediante programación?
- Toma de pantalla de la pantalla actual
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
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(); } }
- ¿Debug una aplicación Android firmada automáticamente? (Lo necesita para la integración de facebook)
- El evento Spinner OnclickListener se ejecuta dos veces, cómo manejar ambos eventos