2010-08-27 18 views

Respuesta

17

Algo así podría funcionar para usted:

View v = view.getRootView(); 
v.setDrawingCacheEnabled(true); 
Bitmap b = v.getDrawingCache(); 
+2

Gracias, esto es justo lo que necesitaba!Tuve un problema similar, pero solo quería un mapa de bits de mi aplicación, no la interfaz de usuario OS, etc. –

12

Hay una larga discusión sobre esto en android-developers, pero la respuesta corta es: No se puede programáticamente realizar una captura de pantalla de un dispositivo Android en el momento, a menos que

  1. Usted tiene acceso root en ese teléfono, o
  2. Su aplicación es una aplicación de sistema

El permiso de manifiesto de Android READ_FRAME_BUFFER existe (consulte los documentos de la API here), pero actualmente solo puede ser utilizado por las aplicaciones del sistema. Hay varias razones para esto, una es que es un riesgo de seguridad. Si un fondo puede tomar una captura de pantalla de la pantalla del teléfono en cualquier momento, entonces las personas podrían usar técnicas de OCR para olfatear las contraseñas del usuario a medida que se ingresaron, entre otra información privada.

Así que no, una aplicación VNC no es posible en este momento sin root. Para tomar una captura de pantalla de su computadora (mientras el teléfono está conectado a través del usb) puede usar DDMS.

+0

Según lo que ha dicho aquí, parece que una aplicación del sistema podría instalarse mediante recuperación sin stock y no necesariamente necesita la ROM ser enraizado No he oído hablar de ninguna aplicación del sistema VNC, incluso 1.75 años después de haber publicado esta respuesta. Hay muchos usuarios de ROM personalizados y parece que hay un gran vacío esperando a que alguien venga con una buena aplicación de VNC. –

+2

Con respecto al punto 2: debe ser más que una aplicación de sistema (es decir, en la carpeta del sistema), debe estar firmado por la clave del sistema operativo, que es mucho más restrictiva. Esta es la diferencia entre un permiso que es "signatureOrSystem" y "signature". –

7

Usted puede probar la siguiente librería: http://code.google.com/p/android-screenshot-library/ Android pantalla Biblioteca (ASL) permite capturar imágenes mediante programación de los dispositivos Android sin requisito de tener privilegios de acceso 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 cada inicio del dispositivo.

+0

Su respuesta es muy útil para mí, pero cuando uso esta biblioteca, me sigue mostrando un brindis diciendo "Servicio nativo no encontrado". ¿Has encontrado un problema así? Por favor ayúdame. Gracias –

+2

"Servicio nativo no encontrado" para mí ... ¿Qué me falta aquí? –

3

Creo que es posible en kitkat usando el comando adb para captura de pantalla. Puede utilizar este comando para pantalla de registro como un video

adb shell screenrecord /sdcard/demo.mp4 

Puede encontrar más detalles here

puede ejecutar el comando adb de su aplicación. Verifica el resultado here

+1

No. Después de ejecutar: 'screenrecord --verbose --time-limit 5 /sdcard/recvid.mp4' en el método getRuntime(). Exec() ... El proceso se ejecuta, sin embargo aparece el error: "Negación de permiso: difusión pide ejecutar como usuario -1 pero está llamando desde el usuario 0; esto requiere android.permission.INTERACt_ACROSS_USERS_FULL ... "¡Sin embargo, he podido ejecutar 'screenrecord --help' muy bien! – giannileuani

1

puso en onClick ..

Bitmap bitmap = takeScreenshot(); 
saveBitmap(bitmap); 

y escribir funtcion ..

public Bitmap takeScreenshot() { 
    View rootView = findViewById(android.R.id.content).getRootView(); 
    rootView.setDrawingCacheEnabled(true); 
    return rootView.getDrawingCache(); 
} 

public void saveBitmap(Bitmap bitmap) { 
    File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png"); 
    FileOutputStream fos; 
    try { 
     fos = new FileOutputStream(imagePath); 
     bitmap.compress(CompressFormat.PNG, 100, fos); 
     fos.flush(); 
     fos.close(); 
    } catch (FileNotFoundException e) { 
     Log.e("GREC", e.getMessage(), e); 
    } catch (IOException e) { 
     Log.e("GREC", e.getMessage(), e); 
    } 
} 
Cuestiones relacionadas