Grabación de video en pantalla de la actividad actual de Android

¿Es posible grabar videos de la pantalla de la actividad actual de la misma actividad?
Sé cómo tomar una captura de pantalla de la actividad actual, pero no tengo ni idea de cómo grabar un video de la pantalla. ¿Cómo comenzaría con esto? No sé cómo comenzarlo.

La grabación progtwigda de video desde su aplicación requerirá acceso a la raíz. Notarás que las aplicaciones disponibles para hacer esto en la Play Store listan prominentemente “REQUIERE RAÍZ” en la descripción de sus aplicaciones. También notará que también puede haber algunos requisitos de hardware específicos para que este enfoque funcione (“No funciona en Galaxy Nexus o Tegra 2/3 …”) a partir de la descripción de la aplicación Screencast Video Recorder .

Nunca he escrito este código, pero he creado una idea de alto nivel del enfoque requerido. De esta publicación se desprende que debe acceder a los datos del búfer de cuadros a través de “/ dev / graphics / fb0”. El modo de acceso para el búfer de cuadros es 660, lo que significa que necesita acceso de administrador para acceder a él. Una vez que tenga acceso de raíz, puede usar los datos del búfer de cuadros para crear capturas de pantalla (este proyecto podría funcionar para esta tarea) y luego crear videos de estas capturas de pantalla (vea esta otra pregunta sobre cómo crear video a partir de una secuencia de imágenes ).

He usado la aplicación de Screencast y funciona bien en una Samsung Note. Sospecho que este es el enfoque básico que han tomado.

¡Desde Lollipop podemos usar Media Projection API! (API 21+)

Aquí está el siguiente código que utilizo para grabar, tenga en cuenta que primero necesitamos obtener los permisos de usuario para eso;)

private static final int CAST_PERMISSION_CODE = 22; private DisplayMetrics mDisplayMetrics; private MediaProjection mMediaProjection; private VirtualDisplay mVirtualDisplay; private MediaRecorder mMediaRecorder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMediaRecorder = new MediaRecorder(); mProjectionManager = (MediaProjectionManager) getSystemService (Context.MEDIA_PROJECTION_SERVICE); getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics); prepareRecording(); } private void startRecording() { // If mMediaProjection is null that means we didn't get a context, lets ask the user if (mMediaProjection == null) { // This asks for user permissions to capture the screen startActivityForResult(mProjectionManager.createScreenCaptureIntent(), CAST_PERMISSION_CODE); return; } mVirtualDisplay = createVirtualDisplay(); mMediaRecorder.start(); } private void stopRecording() { if (mMediaRecorder != null) { mMediaRecorder.stop(); mMediaRecorder.reset(); } if (mVirtualDisplay != null) { mVirtualDisplay.release(); } if (mMediaProjection != null) { mMediaProjection.stop(); } prepareRecording(); } public String getCurSysDate() { return new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date()); } private void prepareRecording() { try { mMediaRecorder.prepare(); } catch (Exception e) { e.printStackTrace(); return; } final String directory = Environment.getExternalStorageDirectory() + File.separator + "Recordings"; if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { Toast.makeText(this, "Failed to get External Storage", Toast.LENGTH_SHORT).show(); return; } final File folder = new File(directory); boolean success = true; if (!folder.exists()) { success = folder.mkdir(); } String filePath; if (success) { String videoName = ("capture_" + getCurSysDate() + ".mp4"); filePath = directory + File.separator + videoName; } else { Toast.makeText(this, "Failed to create Recordings directory", Toast.LENGTH_SHORT).show(); return; } int width = mDisplayMetrics.widthPixels; int height = mDisplayMetrics.heightPixels; mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mMediaRecorder.setVideoEncodingBitRate(512 * 1000); mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoSize(width, height); mMediaRecorder.setOutputFile(filePath); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode != CAST_PERMISSION_CODE) { // Where did we get this request from ? -_- Log.w(TAG, "Unknown request code: " + requestCode); return; } if (resultCode != RESULT_OK) { Toast.makeText(this, "Screen Cast Permission Denied :(", Toast.LENGTH_SHORT).show(); return; } mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data); // TODO Register a callback that will listen onStop and release & prepare the recorder for next recording // mMediaProjection.registerCallback(callback, null); mVirtualDisplay = getVirtualDisplay(); mMediaRecorder.start(); } private VirtualDisplay getVirtualDisplay() { screenDensity = mDisplayMetrics.densityDpi; int width = mDisplayMetrics.widthPixels; int height = mDisplayMetrics.heightPixels; return mMediaProjection.createVirtualDisplay(this.getClass().getSimpleName(), width, height, screenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/); } 

Este no es el código final sino una BUENA base para comenzar 🙂

Las aplicaciones normales de Android carecen de permiso para capturar el búfer de cuadros (específicamente, no son miembros del grupo AID_GRAPHICS). Esto es por razones de seguridad; de lo contrario, podrían husmear contraseñas, etc. desde el teclado virtual. Por lo tanto, en general, NO PUEDE capturar la pantalla desde una aplicación de Android sin alguna forma de evitar el problema del privilegio.

PUEDE capturar más o menos una instantánea del área de la pantalla actualmente ocupada por su aplicación al desplazarse a la vista superior en su jerarquía de vistas y dibujarla en un bitmap usando View.draw (Canvas), sin embargo, esto no registrará el barra de estado, teclado virtual, superficies OpenGL, etc.

Si quieres hacer algo mejor que esto, necesitarás usar una herramienta externa. Las herramientas necesitan root o para usar la interfaz ADB, ya que los procesos iniciados a través de la interfaz ADB tienen el privilegio AID_GRAPHICS. Usando el último método, una aplicación no privilegiada puede conectarse a un servidor con privilegios para realizar la grabación.

Aproximadamente las herramientas se pueden dividir en las siguientes categorías:

  • Root-only framebuffer grabador aplicaciones (por ejemplo, Screencast). Estos graban directamente desde el dispositivo / dev / graphics / fb0 pero solo funcionan en dispositivos donde el framebuffer es legible (p. Ej., No en el Tegra 2 Nexus 7).

  • Aplicaciones de grabación de captura de pantalla solo de raíz (por ejemplo, SCR, Rec, etc.). Estos capturan la pantalla a través de SurfaceFlinger y trabajan en una gama mucho más amplia de dispositivos.

  • Aplicaciones de grabación de captura de pantalla no raíz (p. Ej., Grabadora, Ascrecorder). Estos requieren que el usuario habilite la depuración del USB e inicie un daemon mientras está conectado a través de una PC host. A partir de entonces, no se requiere la PC host hasta que el dispositivo se reinicie. Puede grabar audio también.

  • Herramientas de ADB (p. Ej., El grabador de pantalla incorporado en Android 4.4). Requiere que esté conectado a través de un USB y no puede capturar audio.

Hace unos meses, hice una comparación de las aplicaciones disponibles, que está disponible aquí:

http://recordable.mobi/compare

Para completar, también hay herramientas USB (p. Ej., Mobizen) que transmiten la pantalla a través de USB (limitado por bandwdith bajo USB y no pueden grabar audio) y algunos dispositivos también pueden transmitir la pantalla a través de wifi, que luego puede capturarse en un dispositivo separado .

Esta es una publicación bastante antigua, pero espero que esto ayude a alguien que todavía está buscando una forma de grabar la pantalla de un dispositivo Android:

Desde Android 5.0, hay una nueva API que se puede usar para la grabación de pantalla: MediaProjection MediaProjection otorga la capacidad de capturar contenido de pantalla, pero no de audio del sistema. Tampoco capturará contenido de pantalla seguro.

En la página de Matt Snider hay un buen ejemplo sobre cómo usar la API para grabar la pantalla en un archivo en la tarjeta SD: LINK

puede capturar la pantalla usando DDMS cuando adb se ejecuta y tiene permiso para el framebuffer:

sigue este enlace para más detalles:

http://thetechjournal.com/electronics/android/how-to-capture-screenshots-and-record-video-on-android-device.xhtml

TAMBIÉN consulte estos enlaces para obtener algunas ideas sobre lo que necesita:

http://answers.oreilly.com/topic/951-how-to-capture-video-of-the-screen-on-android/

http://www.mightypocket.com/2010/09/installing-android-screenshots-screen-capture-screen-cast-for-windows/

y revisa este proyecto:

http://sourceforge.net/projects/ashot/

espero que esto ayude .

También puede grabar su pantalla de esta manera: http://www.youtube.com/watch?v=4K2UDfP4lN8&list=UU4fDGas-Vz1xruuUY4QbF0w&feature=c4-overview .

El video se titula “Cómo capturar / grabar la pantalla de Android sin raíz (Mobizen)”.

El video hace referencia al uso de Mobizen: https://play.google.com/store/apps/details?id=com.rsupport.mvagent