¿Cómo tomar una captura de pantalla mediante programación en Android?

Resuelto korovaisdead asked hace 54 años • 26 respuestas

¿Cómo puedo tomar una captura de pantalla de un área seleccionada de la pantalla del teléfono, no con ningún programa sino con un código?

korovaisdead avatar Jan 01 '70 08:01 korovaisdead
Aceptado

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 cualesquiera que sean sus necesidades:

Primero, necesitas agregar un permiso adecuado para guardar el archivo:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Y este es el código (ejecutándose en una Actividad):

private void takeScreenshot() {
    Date now = new Date();
    android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);

    try {
        // image naming and path  to include sd card  appending name you choose for file
        String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg";

        // create bitmap screen capture
        View v1 = getWindow().getDecorView().getRootView();
        v1.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
        v1.setDrawingCacheEnabled(false);

        File imageFile = new File(mPath);

        FileOutputStream outputStream = new FileOutputStream(imageFile);
        int quality = 100;
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
        outputStream.flush();
        outputStream.close();

        openScreenshot(imageFile);
    } catch (Throwable e) {
        // Several error may come out with file handling or DOM
        e.printStackTrace();
    }
}

Y así es como puedes abrir la imagen generada recientemente:

private void openScreenshot(File imageFile) {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    Uri uri = Uri.fromFile(imageFile);
    intent.setDataAndType(uri, "image/*");
    startActivity(intent);
}

Si desea utilizar esto en la vista de fragmentos, utilice:

View v1 = getActivity().getWindow().getDecorView().getRootView();

en lugar de

View v1 = getWindow().getDecorView().getRootView();

en la función tomar captura de pantalla ()

Nota :

Esta solución no funciona si su cuadro de diálogo contiene una vista de superficie. Para obtener más información, consulte la respuesta a la siguiente pregunta:

Android toma una captura de pantalla de Surface View y muestra una pantalla negra

taraloca avatar Apr 13 '2011 14:04 taraloca

Llame a este método y pase el ViewGroup más externo del que desea obtener una captura de pantalla:

public Bitmap screenShot(View view) {
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
            view.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}
Justin Morris avatar Apr 19 '2013 17:04 Justin Morris

Nota: funciona sólo para teléfonos rooteados

Programáticamente, puede ejecutar adb shell /system/bin/screencap -p /sdcard/img.pngcomo se muestra a continuación

Process sh = Runtime.getRuntime().exec("su", null,null);
OutputStream os = sh.getOutputStream();
os.write(("/system/bin/screencap -p " + "/sdcard/img.png").getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();    

luego lea img.pngy Bitmaputilice como desee.

Viswanath Lekshmanan avatar Mar 04 '2013 18:03 Viswanath Lekshmanan