java - para - manual de programacion android pdf
Pantalla Video Grabación de Actividad Actual Android. (6)
Desde Lollipop podemos usar la API de Proyección de Medios! (API 21+)
Aquí está el siguiente código que uso 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 el inicio :)
¿Es posible grabar un video en pantalla de la actividad actual en ejecución de la misma actividad?
Sé cómo hacer una captura de pantalla de la actividad actual, pero no tengo idea de cómo grabar un video en pantalla. ¿Cómo empezaría con eso? No sé cómo empezar.
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 La MediaProjection otorga la capacidad de capturar el contenido de la pantalla, pero no el audio del sistema. Tampoco capturará contenido seguro de la pantalla.
En la página de Matt Snider hay un buen ejemplo de cómo usar la API para grabar realmente la pantalla en un archivo en la tarjeta SD: LINK
La grabación programática de video desde su aplicación requerirá acceso de root. Notará que las aplicaciones disponibles para hacer esto en la Play Store tienen una lista destacada de "REQUIRES ROOT" en sus descripciones de aplicaciones. También notará que también puede haber algunos requisitos de hardware específicos para que funcione este enfoque ("No funciona en Galaxy Nexus o Tegra 2/3 ..." - de la descripción de la aplicación del grabador de video Screencast .
Nunca he escrito este código, pero he reunido una idea de muy alto nivel del enfoque requerido. A partir de esta post parece que tiene que acceder a los datos del buffer de cuadros a través de "/ dev / graphics / fb0". El modo de acceso para el buffer de cuadros es 660, lo que significa que necesita acceso de root para acceder a él. Una vez que tenga acceso a la raíz, puede usar los datos del marco para crear capturas de pantalla (este project podría funcionar para esta tarea) y luego crear videos a partir de estas capturas de pantalla (vea esta otra pregunta SO sobre cómo crear videos a partir de una secuencia de imágenes ).
He usado la aplicación Screencast y funciona bien en un Samsung Note. Sospecho que este es el enfoque básico que han tomado.
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 rastrear contraseñas, etc. desde el teclado virtual. Entonces, en general, NO PUEDES capturar la pantalla desde una aplicación de Android sin alguna forma de evitar el problema de privilegios.
PUEDE capturar más o menos una instantánea del área de pantalla que actualmente ocupa su aplicación al desplazarse a la vista superior en la jerarquía de su vista y dibujarla en un Mapa de bits utilizando View.draw (Lienzo), sin embargo, esto no registrará el Barra de estado, teclado suave, superficies OpenGL etc.
Si desea hacerlo mejor, necesitará utilizar una herramienta externa. Las herramientas necesitan root o utilizar 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 privilegiado para realizar la grabación.
Aproximadamente las herramientas se pueden dividir en las siguientes categorías:
Aplicaciones de grabación de framebuffer solo para raíz (por ejemplo, Screencast). Estos graban directamente desde el dispositivo / dev / graphics / fb0 pero solo funcionan en dispositivos en los que se puede leer el framebuffer (por ejemplo, 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 funcionan en una gama mucho más amplia de dispositivos.
Aplicaciones de grabación de captura de pantalla no raíz (por ejemplo, grabable, Ascrecorder). Estos requieren que el usuario habilite la depuración USB e inicie un demonio mientras está conectado a través de una PC host. A partir de entonces, la PC host no será necesaria hasta que se reinicie el dispositivo. Puede grabar audio también.
Herramientas de ADB (por ejemplo, el grabador de pantalla incorporado en Android 4.4). Requerirte estar conectado a través de un USB y no poder 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 (por ejemplo, Mobizen) que transmiten la pantalla a través de USB (limitado por el bajo ancho de banda del USB y no puede grabar audio) y algunos dispositivos también pueden transmitir la pantalla a través de wifi, que luego puede capturarse en un dispositivo separado .
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)".
La referencia de video sobre el uso de Mobizen: https://play.google.com/store/apps/details?id=com.rsupport.mvagent
puede capturar la pantalla utilizando DDMS mientras se ejecuta adb y tiene permiso para el framebuffer:
siga este enlace para más detalles:
TAMBIÉN compruebe que estos enlaces pueden tener algunas ideas sobre lo que necesita:
http://answers.oreilly.com/topic/951-how-to-capture-video-of-the-screen-on-android/
y verifica este proyecto:
http://sourceforge.net/projects/ashot/
espero que esto ayude .