mejor - ¿Cómo grabar la pantalla y tomar capturas de pantalla, usando la API de Android?
grabar pantalla android sin app (1)
El primer paso y el que Ken White sugirió acertadamente y que ya puede haber cubierto es el Código de Ejemplo proporcionado oficialmente.
He utilizado su API anteriormente. Estoy de acuerdo en que la captura de pantalla es bastante sencilla. Pero, la grabación de pantalla también está bajo líneas similares.
Responderé a sus preguntas en 3 secciones y lo resumiré con un enlace. :)
1. Iniciar la grabación de vídeo
private void startScreenRecord(final Intent intent) {
if (DEBUG) Log.v(TAG, "startScreenRecord:sMuxer=" + sMuxer);
synchronized(sSync) {
if (sMuxer == null) {
final int resultCode = intent.getIntExtra(EXTRA_RESULT_CODE, 0);
// get MediaProjection
final MediaProjection projection = mMediaProjectionManager.getMediaProjection(resultCode, intent);
if (projection != null) {
final DisplayMetrics metrics = getResources().getDisplayMetrics();
final int density = metrics.densityDpi;
if (DEBUG) Log.v(TAG, "startRecording:");
try {
sMuxer = new MediaMuxerWrapper(".mp4"); // if you record audio only, ".m4a" is also OK.
if (true) {
// for screen capturing
new MediaScreenEncoder(sMuxer, mMediaEncoderListener,
projection, metrics.widthPixels, metrics.heightPixels, density);
}
if (true) {
// for audio capturing
new MediaAudioEncoder(sMuxer, mMediaEncoderListener);
}
sMuxer.prepare();
sMuxer.startRecording();
} catch (final IOException e) {
Log.e(TAG, "startScreenRecord:", e);
}
}
}
}
}
2. Detener la grabación de vídeo
private void stopScreenRecord() {
if (DEBUG) Log.v(TAG, "stopScreenRecord:sMuxer=" + sMuxer);
synchronized(sSync) {
if (sMuxer != null) {
sMuxer.stopRecording();
sMuxer = null;
// you should not wait here
}
}
}
2.5. Pausar y reanudar la grabación de video
private void pauseScreenRecord() {
synchronized(sSync) {
if (sMuxer != null) {
sMuxer.pauseRecording();
}
}
}
private void resumeScreenRecord() {
synchronized(sSync) {
if (sMuxer != null) {
sMuxer.resumeRecording();
}
}
}
Espero que el código ayude. Aquí está el enlace original al código al que me referí y del cual también se deriva esta implementación (grabación de video).
3. Tomar captura de pantalla en lugar de video
Creo que por defecto es fácil capturar la imagen en formato de mapa de bits. Todavía puede seguir adelante con el ejemplo MediaProjectionDemo para capturar la captura de pantalla.
[EDIT]: Código cifrado para captura de pantalla
a. Para crear una pantalla virtual en función del ancho / alto del dispositivo
mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2);
mVirtualDisplay = sMediaProjection.createVirtualDisplay(SCREENCAP_NAME, mWidth, mHeight, mDensity, VIRTUAL_DISPLAY_FLAGS, mImageReader.getSurface(), null, mHandler);
mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), mHandler);
segundo. A continuación, inicie la captura de pantalla en función de un intento o acción
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
Detener la proyección de medios
sMediaProjection.stop();
do. Luego convertir a imagen-
//Process the media capture
image = mImageReader.acquireLatestImage();
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * mWidth;
//Create bitmap
bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
//Write Bitmap to file in some path on the phone
fos = new FileOutputStream(STORE_DIRECTORY + "/myscreen_" + IMAGES_PRODUCED + ".png");
bitmap.compress(CompressFormat.PNG, 100, fos);
fos.close();
Hay varias implementaciones (código completo) de Media Projection API disponibles. Algunos otros enlaces que pueden ayudarte en tu desarrollo.
Grabación de video con MediaProjectionManager - sitio web
android-ScreenCapture - githubsegún las observaciones del desarrollador de Android :)screenrecorder - github
Captura y graba la pantalla de Android usando las API de MediaProjection - sitio web
Espero que ayude :) Feliz codificación y grabación de pantalla!
PD: ¿Me puede decir la aplicación de Microsoft de la que habla? No lo he usado. Quisiera probarlo :)
Fondo
Android obtuvo una nueva API en Kitkat y Lollipop para capturar la pantalla en video. Puede hacerlo a través de la herramienta ADB, o a través del código (a partir de Lollipop).
Desde que salió la nueva API, surgieron muchas aplicaciones que utilizan esta función, lo que permite grabar la pantalla, y Microsoft incluso creó su propia aplicación competidora Google-Now-on-tap.
Usando ADB, puedes usar:
adb shell screenrecord /sdcard/video.mp4
Incluso puedes hacerlo desde el propio Android Studio.
El problema
No puedo encontrar ningún tutorial o explicación sobre cómo hacerlo utilizando la API, es decir, en el código.
Lo que he encontrado
El único lugar que encontré es la documentación ( here , bajo "Captura de pantalla y compartir"), que me dice esto:
Android 5.0 le permite agregar capacidades de captura de pantalla y compartir pantalla a su aplicación con las nuevas APIs de android.media.projection. Esta funcionalidad es útil, por ejemplo, si desea habilitar el uso compartido de pantalla en una aplicación de videoconferencia.
El nuevo método
createVirtualDisplay()
permite que su aplicación capture el contenido de la pantalla principal (la pantalla predeterminada) en un objeto Surface, que luego puede enviar a través de la red. La API solo permite capturar contenido de pantalla no seguro, y no audio del sistema. Para comenzar la captura de pantalla, su aplicación debe solicitar primero el permiso del usuario iniciando un cuadro de diálogo de captura de pantalla usando un Intent obtenido a través del métodocreateScreenCaptureIntent()
.Para ver un ejemplo de cómo usar las nuevas API, vea la clase MediaProjectionDemo en el proyecto de muestra.
La cosa es que no puedo encontrar ningún ejemplo de "MediaProjectionDemo". En cambio, he encontrado un ejemplo de "Captura de pantalla", pero no entiendo cómo funciona, ya que cuando lo ejecuté, todo lo que he visto es una pantalla parpadeante y no creo que guarde el video un archivo. La muestra parece muy buggy.
Las preguntas
¿Cómo realizo esas acciones usando la nueva API?
- comience a grabar, opcionalmente incluyendo audio (micrófono / altavoz / ambos).
- para de grabar
- tomar una captura de pantalla en lugar de vídeo.
Además, ¿cómo lo personalizo (resolución, fps solicitados, colores, tiempo ...)?