Создание Скриншотов С Помощью 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
Это означает, что вы сможете читать 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 ничего не даст для обычного приложения, поскольку они будут работать только для приложений с « подписью ».
Также проверьте эту закрытую тему для более подробной информации.
Источник