544 votes

Comment par programmation à prendre une capture d'écran sur Android?

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.

484voto

taraloca Points 2847

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));

155voto

JustinMorris Points 2173

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;
}

44voto

Viswanath L Points 3173

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

34voto

GDR Points 821

EDIT: aie pitié avec les downvotes. C'était vrai en 2010, lorsque j'ai répondu à la question.

Tous les programmes qui permettent de captures d'écran de travailler uniquement sur les téléphones rootés.

19voto

xamar Points 184

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();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X