Сделать скриншот android java

Создание Скриншотов С Помощью Java

Узнайте, как делать скриншоты с помощью Java.

Автор: baeldung
Дата записи

1. введение

В этом уроке мы рассмотрим несколько различных способов создания скриншота на Java.

2. Создание скриншота с помощью Робота

В нашем первом примере мы сделаем скриншот главного экрана.

Для этого мы будем использовать метод createScreenCapture() из класса Robot . Он принимает Rectangle в качестве параметра, который задает границы снимка экрана и возвращает BufferedImage объект. BufferedImage может быть дополнительно использован для создания файла изображения:

Размеры экрана доступны через класс Toolkit с помощью метода getScreenSize () . В системах с несколькими экранами по умолчанию используется основной дисплей.

После захвата экрана в BufferedImage, мы можем записать его в файл с помощью ImageIO.write() . Для этого нам понадобятся два дополнительных параметра. Формат изображения и сам файл изображения. В нашем примере мы используем . bmp формат, но и другие подобные . также доступны png, .jpg или .gif .

3. Создание скриншота нескольких экранов

Также можно сделать скриншот нескольких дисплеев одновременно . Как и в предыдущем примере, мы можем использовать метод createScreenCapture() из класса Robot . Но на этот раз границы скриншота должны охватывать все необходимые экраны.

Чтобы получить все дисплеи, мы будем использовать класс Graphics Environment и его метод getScreenDevices () .

Затем мы выберем границы каждого отдельного экрана и создадим Прямоугольник , который будет соответствовать всем из них:

При повторном просмотре дисплеев мы всегда суммируем ширину и выбираем только одну максимальную высоту, так как экраны будут объединены горизонтально.

Идя дальше, нам нужно сохранить изображение скриншота. Как и в предыдущем примере, мы можем использовать метод ImageIO.write () .

4. Создание скриншота данного компонента графического интерфейса

Мы также можем сделать снимок экрана данного компонента пользовательского интерфейса.

Размеры могут быть легко доступны через getBounds() метод, поскольку каждый компонент знает о своем размере и местоположении.

В этом случае мы не будем использовать API Robot . Вместо этого мы собираемся использовать метод paint() из класса Component , который будет рисовать содержимое непосредственно в BufferedImage :

После получения привязки компонента нам нужно создать BufferedImage. Для этого нам нужны ширина, высота и тип изображения. В этом случае мы используем BufferedImage.TYPE_INT_ARGB , который относится к 8-битному цветному изображению.

Затем мы переходим к вызову метода paint() для заполнения BufferedImage и, как и в предыдущих примерах, сохраняем его в файл с помощью метода ImageIO.write () .

5. Заключение

В этом уроке мы узнали несколько способов, как делать скриншоты с помощью Java.

Как всегда, исходный код со всеми примерами в этом учебнике доступен на GitHub .

Источник

Как программно сделать снимок экрана в Android?

Как снять снимок экрана с выбранной области экрана телефона не с помощью какой-либо программы, а из кода?

Вот код, который позволил сохранить мой скриншот на SD-карте и использоваться позже для любых ваших нужд:

Во-первых, вам нужно добавить правильное разрешение на сохранение файла:

И это код (работает в Activity):

Читайте также:  Галерея для андроид трешбокс

Вот как вы можете открыть недавно созданное изображение:

Если вы хотите использовать это в виде фрагмента, используйте:

On функция takeScreenshot ()

Вызовите этот метод, передав во внешнюю большую часть ViewGroup, что вы хотите сделать снимок экрана:

Примечание: работает только для корневого телефона

Программно вы можете запустить adb shell /system/bin/screencap -p /sdcard/img.png как adb shell /system/bin/screencap -p /sdcard/img.png ниже

Затем прочитайте img.png как Bitmap и используйте по своему усмотрению.

EDIT: помилуй с downvotes. Это было в 2010 году, когда я ответил на вопрос.

Все программы, которые позволяют скриншоты работать только на корневых телефонах.

Ответ Mualig очень хороший, но у меня была та же проблема, что и Ewoks, я не получаю фона. Поэтому иногда бывает достаточно, и иногда я получаю черный текст на черном фоне (в зависимости от темы).

Это решение в значительной степени основано на коде Mualig и коде, который я нашел в Robotium. Я отбрасываю использование кэша рисования, вызывая непосредственно метод draw. До этого я попытаюсь извлечь фоновый рисунок из текущей активности, чтобы сделать его первым.

Для этого метода не требуется никакого разрешения root или большого кодирования .

В командной строке adb с помощью команды внизу вы можете сделать снимок экрана.

Эта команда не требует каких-либо прав на root, так же, как и для Java-кода приложения для Android.

Здесь мы использовали. KEYCODE_SYSRQ его значение равно 120 и используется для экрана запроса системы / печати.

Как сказал CJBS, выходное изображение будет сохранено в / sdcard / Pictures / Screenshots

В качестве ссылки один из способов захвата экрана (а не только активности вашего приложения) заключается в том, чтобы захватить фреймбуфер (устройство / dev / graphics / fb0). Для этого у вас должны быть либо права root, либо ваше приложение должно быть приложением с разрешениями подписи («Разрешение, предоставляемое системой только в том случае, если запрашивающее приложение подписано с тем же сертификатом, что и приложение, объявившее разрешение»), которое Очень маловероятно, если вы не составили свой собственный ПЗУ.

Каждый захват фреймбуфера из нескольких устройств, которые я тестировал, содержал ровно один снимок экрана. Люди сообщили, что он содержит больше, я думаю, это зависит от размера кадра / дисплея.

Я пытался читать фреймбуфер непрерывно, но, похоже, он возвращается для фиксированного количества прочитанных байтов. В моем случае это (3 410 432) байт, что достаточно для хранения кадра отображения 854 * 480 RGBA (3 279 360 байт). Да, фрейм в двоичном формате, выводимый из fb0, является RGBA на моем устройстве. Это, скорее всего, будет зависеть от устройства к устройству. Это будет важно для вас, чтобы расшифровать его =)

В моих разрешениях device / dev / graphics / fb0 так, что только root и пользователи из групповой графики могут читать fb0.

Графика – ограниченная группа, поэтому вы, вероятно, будете иметь доступ только к fb0 с помощью корневого телефона с помощью команды su.

Приложения для Android имеют идентификатор пользователя (uid) = приложение _ ## и идентификатор группы (guid) = приложение _ ## .

В оболочке adb есть uid = shell и guid = shell , которая имеет гораздо больше разрешений, чем приложение. Фактически вы можете проверить эти разрешения на /system/permissions/platform.xml

Читайте также:  Все телефоны sony xperia андроид

Это означает, что вы сможете читать fb0 в оболочке adb без root, но вы не будете читать его в приложении без root.

Кроме того, предоставление разрешений READ_FRAME_BUFFER и / или ACCESS_SURFACE_FLINGER для AndroidManifest.xml ничего не сделает для обычного приложения, потому что они будут работать только для приложений подписи .

Также проверьте эту закрытую резьбу для более подробной информации.

Вы можете попробовать следующую библиотеку: http://code.google.com/p/android-screenshot-library/ Android Screenshot Library (ASL) позволяет программно снимать скриншоты с Android-устройств без необходимости иметь права доступа root. Вместо этого ASL использует собственный сервис, работающий в фоновом режиме, который запускается через Android Debug Bridge (ADB) один раз за загрузку устройства.

Изображения сохраняются во внешней папке хранилища.

Вы можете попытаться сделать что-то подобное,

Получение кеша растрового изображения из макета или представления, сделав что-то наподобие Сначала вы должны setDrawingCacheEnabled в макет (линейное расписание или релятивирование или представление)

Затем вы делаете все, что хотите, с растровым изображением. Либо превратить его в файл изображения, либо отправить urim растрового изображения в другое место.

ДОБАВИТЬ РАЗРЕШЕНИЕ

Для тех, кто хочет захватить GLSurfaceView, метод getDrawingCache или рисования в холст не будет работать.

Вы должны прочитать содержимое фреймбуфера OpenGL после рендеринга фрейма. Здесь есть хороший ответ

Основываясь на ответе @JustinMorris выше и @NiravDangi здесь https://stackoverflow.com/a/8504958/2232148, мы должны взять фон и передний план представления и собрать их следующим образом:

Параметр качества принимает константу Bitmap.Config, обычно либо Bitmap.Config.RGB_565 либо Bitmap.Config.ARGB_8888 .

Я создал простую библиотеку, которая берет скриншот из представления и либо дает вам объект Bitmap, либо сохраняет его прямо по любому пути

Если вы хотите сделать снимок экрана из fragment а затем выполните следующие действия:

Логика для снятия снимков экрана:

Для деятельности вы можете просто использовать View v1 = getWindow().getDecorView().getRootView(); Вместо mView

Наряду с захватом скриншота, если мы хотим воспроизвести тон также. Мы можем использовать следующий код

Просто расширяя ответ таралоки. Вы должны добавить следующие строки, чтобы заставить его работать. Я сделал статичное имя изображения. Убедитесь, что вы используете переменную timestamp taraloca, если вам нужно динамическое имя изображения.

И в файле AndroidManifest.xml следующие записи должны:

Если вы хотите захватить представление или макет, например RelativeLayout или LinearLayout и т. Д., Просто используйте код:

Теперь вы можете сохранить это растровое изображение на устройстве:

Источник

Как программно сделать скриншот на Android?

Как сделать скриншот выбранной области экрана телефона не какой-либо программой, а кодом?

Вот код, который позволил сохранить мой скриншот на SD-карте и использовать позже для любых ваших потребностей:

Во-первых, вам нужно добавить правильное разрешение для сохранения файла:

И это код (работает в Activity):

И вот как вы можете открыть недавно сгенерированное изображение:

Если вы хотите использовать это при просмотре фрагмента, используйте:

на takeScreenshot () функция

Примечание :

Это решение не работает, если ваш диалог содержит вид поверхности. Для получения подробной информации, пожалуйста, проверьте ответ на следующий вопрос:

Вызовите этот метод, передав внешнюю группу ViewGroup, для которой требуется снимок экрана:

Примечание: работает только для рутованного телефона

Программно, вы можете запустить, adb shell /system/bin/screencap -p /sdcard/img.png как показано ниже

тогда читайте img.png как Bitmap и используйте как хотите.

РЕДАКТИРОВАТЬ: помиловать с downvotes. Это было верно в 2010 году, когда я ответил на вопрос.

Все программы, позволяющие делать скриншоты, работают только на рутованных телефонах.

Читайте также:  Код тестирования для андроид

Для этого метода не требуется разрешение root или большое кодирование .

В оболочке adb с помощью приведенной ниже команды вы можете сделать снимок экрана.

Эта команда не требует каких-либо прав root, так что вы также можете выполнить из Java-кода приложения Android.

Здесь мы использовали. KEYCODE_SYSRQ его значение равно 120 и используется для системного запроса / ключа экрана печати.

Как сказал CJBS, выходное изображение будет сохранено в / sdcard / Pictures / Screenshots

Ответ Муалига очень хороший, но у меня была та же проблема, что описывает Эвокс, я не понимаю, как это происходит. Так что иногда это достаточно хорошо, а иногда я получаю черный текст на черном фоне (в зависимости от темы).

Это решение основано на коде Mualig и коде, который я нашел в Robotium. Я отказываюсь от использования кэша рисования, вызывая непосредственно метод рисования. Перед этим я попытаюсь получить фон для рисования из текущей деятельности, чтобы нарисовать его первым.

Добавьте разрешение в манифест

Для поддержки Marshmallow или более поздних версий, пожалуйста, добавьте приведенный ниже код в метод активности onCreate

Для справки: один из способов захвата экрана (а не только активности вашего приложения) — захват кадрового буфера (device / dev / graphics / fb0). Для этого у вас должны быть права суперпользователя или ваше приложение должно быть приложением с разрешениями на подпись («разрешение, которое система предоставляет, только если запрашивающее приложение подписано тем же сертификатом, что и приложение, которое объявило разрешение»), что очень маловероятно, если вы не скомпилировали свой собственный ROM.

Каждый кадр кадрового буфера с пары протестированных мной устройств содержал ровно один скриншот. Люди сообщили, что он содержит больше, я думаю, это зависит от размера кадра / дисплея.

Я пытался читать кадровый буфер непрерывно, но, похоже, он возвращает фиксированное количество прочитанных байтов. В моем случае это (3 410 432) байта, что достаточно для хранения кадра дисплея 854 * 480 RGBA (3 279 360 байтов). Да, кадр в двоичном формате, выведенный из fb0, является RGBA на моем устройстве. Скорее всего, это будет зависеть от устройства к устройству. Это будет важно для вас, чтобы расшифровать его =)

В моем устройстве права доступа / dev / graphics / fb0 такие, что только root и пользователи из групповой графики могут читать fb0.

Графика является ограниченной группой, поэтому вы, вероятно, получите доступ к fb0 только с рутированным телефоном с помощью команды su.

Приложения Android имеют идентификатор пользователя (uid) = app _ ## и идентификатор группы (guid) = app _ ## .

В оболочке adb есть uid = shell и guid = shell , которые имеют гораздо больше прав, чем приложение. Вы можете проверить эти разрешения в /system/permissions/platform.xml

Это означает, что вы сможете читать fb0 в оболочке adb без рута, но вы не будете читать его в приложении без рута.

Кроме того, предоставление разрешений READ_FRAME_BUFFER и / или ACCESS_SURFACE_FLINGER для AndroidManifest.xml ничего не даст для обычного приложения, поскольку они будут работать только для приложений с « подписью ».

Также проверьте эту закрытую тему для более подробной информации.

Источник

Оцените статью