Comment puis-je prendre une capture d'écran de la zone sélectionnée de téléphone à écran pas par n'importe quel programme, mais à partir du code.
Réponses
Trop de publicités?Récemment, j'ai fait quelque chose de similaire à utiliser pour le partage avec les médias sociaux. Voici le code qui m'a permis de capture d'écran pour être stocké sur la carte sd et de les utiliser ultérieurement pour quels que soient vos besoins:
// image naming and path to include sd card appending name you choose for file
String mPath = Environment.getExternalStorageDirectory().toString() + "/" + ACCUWX.IMAGE_APPEND;
// create bitmap screen capture
Bitmap bitmap;
View v1 = mCurrentUrlMask.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
OutputStream fout = null;
imageFile = new File(mPath);
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
fout.flush();
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Puis, quand vous en avez besoin pour accéder à l'utiliser quelque chose comme ceci:
Uri uri = Uri.fromFile(new File(mPath));
L'appel de cette méthode, en passant plus à l'extérieur ViewGroup que vous voulez une capture d'écran:
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;
}
Par programmation, vous pouvez exécuter "adb shell /system/bin/screencap -p /sdcard/img.png" comme ci-dessous
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();
alors lisez img.png, bitmap et l'utiliser comme votre désir. fonctionne uniquement sur téléphone enracinée
Mualig réponse est très bonne, mais j'ai eu le même problème Ewoks décrit, je n'obtiens pas le fond. Alors, parfois, est assez bon et j'ai parfois du texte noir sur fond noir (selon le thème).
Cette solution est fortement basé dans Mualig code et le code que j'ai trouvé dans Robotium. Je suis en rejetant l'utilisation de dessin cache en appelant directement à la méthode de tirage. Avant cela, je vais essayer d'obtenir l'arrière-plan dessiné à partir de l'activité actuelle de tirer en premier.
// Some constants
final static String SCREENSHOTS_LOCATIONS = Environment.getExternalStorageDirectory().toString() + "/screenshots/";
// Get device dimmensions
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
// Get root view
View view = mCurrentUrlMask.getRootView();
// Create the bitmap to use to draw the screenshot
final Bitmap bitmap = Bitmap.createBitmap(size.x, size.y, Bitmap.Config.ARGB_4444);
final Canvas canvas = new Canvas(bitmap);
// Get current theme to know which background to use
final Activity activity = getCurrentActivity();
final Theme theme = activity.getTheme();
final TypedArray ta = theme
.obtainStyledAttributes(new int[] { android.R.attr.windowBackground });
final int res = ta.getResourceId(0, 0);
final Drawable background = activity.getResources().getDrawable(res);
// Draw background
background.draw(canvas);
// Draw views
view.draw(canvas);
// Save the screenshot to the file system
FileOutputStream fos = null;
try {
final File sddir = new File(SCREENSHOTS_LOCATIONS);
if (!sddir.exists()) {
sddir.mkdirs();
}
fos = new FileOutputStream(SCREENSHOTS_LOCATIONS
+ System.currentTimeMillis() + ".jpg");
if (fos != null) {
if (!bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos)) {
Log.d(LOGTAG, "Compress/Write failed");
}
fos.flush();
fos.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}