Android studio сделать скриншот экрана

Скриншот экрана

Здраствуйте, мне нужно зделать програмно скриншот екрана. я нашол статтюhttp://developer.alexanderklim. eenshotapp по етому поводу но там немного не то что мне надо, здесь описано скриншот активного активити а мне нужно сделать скриншот всего екрана. Помогите пожалуста если кто то встречалса з такой проблемой.

Сделать скриншот экрана в Genymotion
Подскажите как можно сделать скриншот экрана с помощью эмулятора Genymotion?

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

Как сделать скриншот экрана без прав Root-а?
как сделать скриншот всего экрана без использования(getRootView()) без рут прав ??

Скриншот окна
Всем привет! Цель, сделать скриншот экрана устройства. В интернете нашел исходник: import.

Ну мне нужно скрин всего экрана.

Вот я и спрашываю, может есть способ это сделать?

Решение

Боооооооооооольшое спасибо. )))) только есть вопрос:
что в этой строке View v1 = mCurrentUrlMask.getRootView();
mCurrentUrlMask где его берут. или как его огласить. Я зделал так private static final View mCurrentUrlMask = null; но я понимаю что это не верно. (((((( Ищо раз спасибо.

Добавлено через 50 минут
Извините но у меня возник ещо вопрос по поводу. )
getWindow().getDecorView().getRootView(); я создаю свой Service, и там соритса на getWindow(). ((( Как зделать чтоби оно работало в сервысе? (тойсть я хочу чтоби скраншот делался в отдельном потоке. )

Uri uri = Uri.fromFile(new File(mPath)); где нужно прописывать??

Добавлено через 1 час 10 минут
все это норм только работает в рамках своего приложения а мне нужен скрин дисплея вообще а как это сделать может ASL попробовать??

Скриншот в фоновом режиме
Цель — создание приложения, работающего в фоне и делающего снимок всего экрана с любой текущей.

Скриншот google map
Дайте пожалуйста пример того, как сделать скриншот карты google (api v2) и установления его в.

Как сделать такую игру(скриншот+)?
В этой игре физика «вид сверху». Нужно двигать блоки(они упираются друг в друга), горизонтальные.

Скриншот гугл карты при нажатии на кнопку
Есть ли возможность написать обработчик для кнопки, который делает скриншот текущей карты вместе с.

Источник

Как программно сделать снимок экрана в 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

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

Читайте также:  Open docx file android

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

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

Источник

Русские Блоги

Скриншот Android и запись экрана

1. Скриншот Android.

Скриншоты Android делятся здесь на три категории:

  • Захватить экран, кроме строки состояния
  • Захват элемента управления или области
  • Используйте MediaProjection, чтобы делать скриншоты

1. Сделайте снимок экрана, кроме строки состояния.

Этот способ заключается в использовании механизма кэша представления для создания кэша изображений представления и сохранения его как растрового изображения.
Основные API-интерфейсы следующие:

  • void setDrawingCacheEnabled(boolean flag) Включите или отключите View Cache. После установки значения false система автоматически уничтожит исходный Cache.
  • void buildDrawingCache() Создать кеш без звонка
  • Bitmap getDrawingCache() Получить изображение из кеша для просмотра
  • void destroyDrawingCache() Уничтожьте тайник. Если вы хотите обновить кэш, вы должны вызвать этот метод, чтобы уничтожить старый кэш перед созданием нового.

2. Перехват контрольной точки или зоны.

Принцип этого метода тот же, что и выше. Он использует кеш-механизм View. Разница в том, что View здесь не является DecorView.
Пример кода:

Другой способ — нарисовать вид на холсте

ListView, ScrollView, WebView, RecyclerView могут использовать этот метод.

3. Используйте MediaProjection

Android поддерживает запись экрана в реальном времени после версии 5.0. Благодаря записи экрана в реальном времени мы можем делать скриншоты.
Общие шаги следующие:

  1. Инициализировать один MediaProjectionManager Объект
  1. Создать и запустить намерение
  1. В действии onActivityResult Метод получения объекта ‘MediaProjection’
  1. Создать объект ImageReader

Класс ImageReader позволяет приложениям напрямую обращаться к данным изображения поверхности рендеринга для создания объекта ImageReader.
Основная операция:

  • getSurface() // Получаем поверхность, которая может быть использована для создания изображения этого ImageReader
  • acquireLatestImage() // Получаем последний образ из очереди ImageReader и отбрасываем старый образ.
  • acquireNextImage() // Получаем следующее изображение из очереди ImageReader
  • getMaxImages() // Максимальное количество изображений
  • getWidth() // Ширина каждого изображения в пикселях.
  • getHeight() // Высота каждого изображения в пикселях.
  • getImageFormat() // Формат изображения
  • close() // Освобождаем все ресурсы, связанные с этим ImageReader. Не забудьте выключить после использования
  • setOnImageAvailableListener(OnImageAvailableListener listener, Handler handler) // Регистрируем прослушиватель, вызываемый, когда новое изображение становится доступным в ImageReader.
  1. Проходят MediaProjection Создайте VirtualDisplay Объект и визуализация содержимого в ImageRaeder из Surface Контроль

Класс VirtualDisplay представляет виртуальный дисплей. Метод createVirtualDisplay () вызывается для визуализации содержимого виртуального дисплея на элементе управления Surface. Когда процесс завершается, виртуальный дисплей будет автоматически освобожден, и все Windows будут принудительно удалены. Когда он больше не используется, вы должны вызвать метод release () для освобождения ресурсов.

  1. Получить изображение через ImageReader для создания растрового изображения

Image — это данные изображения, Plane — это абстрактный внутренний класс Image,
image.getPlanes() Получить пиксельную матрицу изображения, возвращаемое значение — матрица Plane []
plane.getBuffer() Получить данные изображения, getPixelStride() с участием getRowStride() Чтобы получить некоторые промежутки Iamge, размер изображения получается посредством серии преобразований, создается объект Bitmap, а затем данные пикселей копируются из ByteBuffer изображения для создания Bitmap.

2. Запись экрана MediaProjection

Для реализации записи экрана необходимо использовать класс MediaRecoder.
Предыдущие шаги похожи на снимки экрана.

1. Инициализировать один MediaProjectionManager Объект
2. Создайте и запустите намерение
3. Войдите в метод onActivityResult объекта Activity. MediaProjection Объект
4. Инициализируйте MediaRecorder и подготовьтесь к записи.
5. Создайте VirtualDisplay Для записи экрана

Ставить VirtualDisplay Цель рендеринга Surface Установить как MediaRecorder из getSurface , Я могу пройти MediaRecorder Запись содержимого экрана

Источник

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