¿Cómo puedo tomar una captura de pantalla de un área seleccionada de la pantalla del teléfono no mediante ningún programa sino desde el código?
android
screenshot
korovaisdead
fuente
fuente
Respuestas:
Aquí está el código que permitió que mi captura de pantalla se almacenara en una tarjeta SD y se usara más tarde para lo que sea que necesite:
Primero, debe agregar un permiso adecuado para guardar el archivo:
Y este es el código (que se ejecuta en una Actividad):
Y así es como puede abrir la imagen generada recientemente:
Si desea usar esto en la vista de fragmentos, use:
en vez de
en takeScreenshot () función
Nota :
Esta solución no funciona si su cuadro de diálogo contiene una vista de superficie. Para más detalles, consulte la respuesta a la siguiente pregunta:
Captura de pantalla de Android Take de Surface View muestra pantalla en negro
fuente
mCurrentUrlMask
debe ser unaView
clase única en la API de Android que tiene elgetRootView()
método. Probablemente es una vista en la interfaz de usuario.View v1 = mCurrentUrlMask.getRootView();
que he utilizadoView v1 = getWindow().getDecorView().getRootView();
y funciona para mí.Llame a este método, pasando el ViewGroup más externo del que desea una captura de pantalla:
fuente
view
? "getWindow().getDecorView().getRootView()
, la vista da como resultado una captura de pantalla de la aplicación, no de la pantalla.Nota: funciona solo para teléfonos rooteados
Programáticamente, puede ejecutar
adb shell /system/bin/screencap -p /sdcard/img.png
como a continuaciónluego lea
img.png
comoBitmap
y use como desee.fuente
System.err : java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
, mi dispositivo es Android 5.0EDITAR: ten piedad de los votos negativos. Fue cierto en 2010 cuando respondí la pregunta.
Todos los programas que permiten capturas de pantalla solo funcionan en teléfonos rooteados.
fuente
No se requiere permiso de root o no se requiere una gran codificación para este método.
En adb shell con el siguiente comando, puede tomar una captura de pantalla.
Este comando no requiere ningún permiso de root, por lo que también puede realizarlo desde el código Java de la aplicación de Android.
Más información sobre el código Keyevent en Android, consulte http://developer.android.com/reference/android/view/KeyEvent.html
Aquí lo hemos usado. KEYCODE_SYSRQ su valor es 120 y se utiliza para la tecla Solicitud del sistema / Imprimir pantalla.
Como dijo CJBS, la imagen de salida se guardará en / sdcard / Pictures / Screenshots
fuente
/sdcard/Pictures/Screenshots
su -c "input keyevent 120"
esta bien !!La respuesta de Mualig es muy buena, pero tuve el mismo problema que describe Ewoks, no entiendo el fondo. Entonces, a veces es lo suficientemente bueno y a veces obtengo texto negro sobre fondo negro (dependiendo del tema).
Esta solución está fuertemente basada en el código Mualig y el código que encontré en Robotium. Estoy descartando el uso de la memoria caché de dibujo llamando directamente al método de dibujo. Antes de eso, trataré de dibujar el fondo de la actividad actual para dibujarlo primero.
fuente
Agregue el permiso en el manifiesto
Para admitir Marshmallow o versiones superiores, agregue el siguiente código en la actividad del método Crear
fuente
Como referencia, una forma de capturar la pantalla (y no solo la actividad de su aplicación) es capturar el framebuffer (dispositivo / dev / graphics / fb0). Para hacer esto, debe tener privilegios de root o su aplicación debe ser una aplicación con permisos de firma ("Un permiso que el sistema otorga solo si la aplicación solicitante está firmada con el mismo certificado que la aplicación que declaró el permiso"), que es muy poco probable a menos que haya compilado su propia ROM.
Cada captura de framebuffer, de un par de dispositivos que he probado, contenía exactamente una captura de pantalla. La gente ha informado que contiene más, supongo que depende del tamaño del marco / pantalla.
Traté de leer el framebuffer continuamente, pero parece volver por una cantidad fija de bytes leídos. En mi caso, eso es (3 410 432) bytes, que es suficiente para almacenar un marco de visualización de 854 * 480 RGBA (3 279 360 bytes). Sí, el marco, en binario, generado desde fb0 es RGBA en mi dispositivo. Esto probablemente dependerá de un dispositivo a otro. Esto será importante para que lo decodifiques =)
En mi dispositivo / dev / graphics / fb0 los permisos son para que solo la raíz y los usuarios de los gráficos de grupo puedan leer el fb0.
graphics es un grupo restringido, por lo que probablemente solo accederá a fb0 con un teléfono rooteado mediante el comando su.
Las aplicaciones de Android tienen la identificación de usuario (uid) = aplicación _ ## y la identificación de grupo (guid) = aplicación _ ## .
adb shell tiene uid = shell y guid = shell , que tiene muchos más permisos que una aplicación. En realidad, puede verificar esos permisos en /system/permissions/platform.xml
Esto significa que podrá leer fb0 en el shell adb sin root, pero no lo leerá dentro de la aplicación sin root.
Además, otorgar permisos READ_FRAME_BUFFER y / o ACCESS_SURFACE_FLINGER en AndroidManifest.xml no hará nada para una aplicación normal porque solo funcionará para aplicaciones de ' firma '.
También revise este hilo cerrado para más detalles.
fuente
Mi solución es:
y
Las imágenes se guardan en la carpeta de almacenamiento externo.
fuente
view
qué estás pasandoImageUtils.loadBitmapFromView(this, view)
?Puede probar la siguiente biblioteca: http://code.google.com/p/android-screenshot-library/ Android Screenshot Library (ASL) permite capturar capturas de pantalla mediante programación de dispositivos Android sin necesidad de tener privilegios de acceso a la raíz. En cambio, ASL utiliza un servicio nativo que se ejecuta en segundo plano, iniciado a través del Android Debug Bridge (ADB) una vez por inicio de dispositivo.
fuente
Según la respuesta de @JustinMorris arriba y @NiravDangi aquí https://stackoverflow.com/a/8504958/2232148 debemos tomar el fondo y el primer plano de una vista y ensamblarlos así:
El parámetro de calidad toma una constante de Bitmap.Config, normalmente
Bitmap.Config.RGB_565
oBitmap.Config.ARGB_8888
.fuente
AGREGAR PERMISO
fuente
Puedes intentar hacer algo como esto,
Obtener un caché de mapa de bits de un diseño o una vista haciendo algo como Primero,
setDrawingCacheEnabled
debe obtener un diseño (un diseño lineal o un diseño relativo, o una vista)entonces
Luego haces lo que quieras con el mapa de bits. Ya sea convirtiéndolo en un archivo de imagen o enviando la uri del mapa de bits a otro lugar.
fuente
Para aquellos que desean capturar un GLSurfaceView, el método getDrawingCache o el dibujo al lienzo no funcionará.
Debe leer el contenido del framebuffer de OpenGL después de que se haya procesado el marco. Hay una buena respuesta aquí
fuente
He creado una biblioteca simple que toma una captura de pantalla de a
View
y le da un objeto de mapa de bits o lo guarda directamente en cualquier ruta que deseehttps://github.com/abdallahalaraby/Blink
fuente
Screenshot.takeScreenshot(view, mPath); imageView.setImageBitmap(Screenshot.getBitmapScreenshot(view, mPath));
Cómo obtener una vista de la actividad actual. No quiero usar la identificación del xml.takeScreenshotForScreen()
en su lugar.Camino corto es
fuente
Solo extendiendo la respuesta de taraloca. Debe agregar las siguientes líneas para que funcione. He hecho que el nombre de la imagen sea estático. Asegúrese de utilizar la variable de marca de tiempo de taraloca en caso de que necesite un nombre de imagen dinámico.
Y en el archivo AndroidManifest.xml las siguientes entradas son obligatorias:
fuente
Si desea tomar una captura de pantalla,
fragment
siga esto:Anular
onCreateView()
:Lógica para tomar captura de pantalla:
método
shareScreenShotM)()
:Método takeScreenShot ():
Método savePic ():
Para la actividad, simplemente puede usar en
View v1 = getWindow().getDecorView().getRootView();
lugar demView
fuente
La mayoría de las respuestas a esta pregunta utilizan el
Canvas
método de dibujo o el método de caché de dibujo. Sin embargo, elView.setDrawingCache()
método está en desuso en la API 28 . Actualmente, la API recomendada para hacer capturas de pantalla es laPixelCopy
clase disponible en API 24 (pero los métodos que aceptanWindow
parámetros están disponibles en API 26 == Android 8.0 Oreo). Aquí hay un ejemplo de código de Kotlin para recuperar unBitmap
:fuente
¡Solo para aplicaciones del sistema!
Nota: Las aplicaciones del sistema no necesitan ejecutar "su" para ejecutar este comando.
fuente
La vista de parámetros es el objeto de diseño raíz.
fuente
Para la captura de pantalla de desplazamiento de página completa
Si desea capturar una captura de pantalla de Vista completa (que contiene una vista de desplazamiento más o menos), consulte esta biblioteca
Todo lo que tiene que hacer es importar Gradel y crear un objeto de BigScreenshot
BigScreenshot longScreenshot = new BigScreenshot(this, x, y);
Se recibirá una devolución de llamada con el mapa de bits de las Capturas de pantalla tomadas mientras se desplaza automáticamente a través del grupo de visualización de pantalla y al final se ensamblan.
@Override public void getScreenshot(Bitmap bitmap) {}
Lo que se puede guardar en la galería o cualquier uso es necesario después de
fuente
Tome una captura de pantalla de una vista en Android.
fuente
si desea capturar una vista o diseño como RelativeLayout o LinearLayout, etc., simplemente use el código:
ahora puede guardar este mapa de bits en el almacenamiento del dispositivo:
fuente