¿Cómo tomar una captura de pantalla mediante programación en Android?
¿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?
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
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;
}
Nota: funciona sólo para teléfonos rooteados
Programáticamente, puede ejecutar adb shell /system/bin/screencap -p /sdcard/img.png
como 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.png
y Bitmap
utilice como desee.