Как сделать скриншот выбранной области экрана телефона не какой-либо программой, а кодом?
android
screenshot
korovaisdead
источник
источник
Ответы:
Вот код, который позволил сохранить мой скриншот на SD-карте и использовать позже для любых ваших потребностей:
Во-первых, вам нужно добавить правильное разрешение для сохранения файла:
И это код (работает в Activity):
И вот как вы можете открыть недавно сгенерированное изображение:
Если вы хотите использовать это при просмотре фрагмента, используйте:
вместо
на takeScreenshot () функция
Примечание :
Это решение не работает, если ваш диалог содержит вид поверхности. Для получения подробной информации, пожалуйста, проверьте ответ на следующий вопрос:
Скриншот Android Take из Surface View показывает черный экран
источник
mCurrentUrlMask
должно быть,View
поскольку это уникальный класс в API Android, который имеетgetRootView()
метод. Вероятно, это вид в пользовательском интерфейсе.View v1 = mCurrentUrlMask.getRootView();
я использовал,View v1 = getWindow().getDecorView().getRootView();
и это работает для меня.Вызовите этот метод, передав внешнюю группу ViewGroup, для которой требуется снимок экрана:
источник
view
getWindow().getDecorView().getRootView()
виде представления приводит к созданию снимка экрана только с приложением, а не с экрана.Примечание: работает только для рутованного телефона
Программно, вы можете запустить,
adb shell /system/bin/screencap -p /sdcard/img.png
как показано нижетогда читайте
img.png
какBitmap
и используйте как хотите.источник
System.err : java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
, мое устройство Android 5.0РЕДАКТИРОВАТЬ: помиловать с downvotes. Это было верно в 2010 году, когда я ответил на вопрос.
Все программы, позволяющие делать скриншоты, работают только на рутованных телефонах.
источник
Для этого метода не требуется разрешение root или большое кодирование .
В оболочке adb с помощью приведенной ниже команды вы можете сделать снимок экрана.
Эта команда не требует каких-либо прав root, так что вы также можете выполнить из Java-кода приложения Android.
Подробнее о KeyEvent кода в Android см http://developer.android.com/reference/android/view/KeyEvent.html
Здесь мы использовали. KEYCODE_SYSRQ его значение равно 120 и используется для системного запроса / ключа экрана печати.
Как сказал CJBS, выходное изображение будет сохранено в / sdcard / Pictures / Screenshots
источник
/sdcard/Pictures/Screenshots
su -c "input keyevent 120"
в порядке !!Ответ Муалига очень хороший, но у меня была та же проблема, что описывает Эвокс, я не понимаю, как это происходит. Так что иногда это достаточно хорошо, а иногда я получаю черный текст на черном фоне (в зависимости от темы).
Это решение основано на коде 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 ничего не даст для обычного приложения, поскольку они будут работать только для приложений с « подписью ».
Также проверьте эту закрытую тему для более подробной информации.
источник
Мое решение:
а также
Изображения сохраняются в папке внешнего хранилища.
источник
view
вы переходитеImageUtils.loadBitmapFromView(this, view)
?Вы можете попробовать следующую библиотеку: http://code.google.com/p/android-screenshot-library/ Библиотека скриншотов Android (ASL) позволяет программно захватывать скриншоты с устройств Android без необходимости иметь права root-доступа. Вместо этого ASL использует собственный сервис, работающий в фоновом режиме, запускаемый через Android Debug Bridge (ADB) один раз за загрузку устройства.
источник
Основываясь на ответе @JustinMorris выше и @NiravDangi здесь https://stackoverflow.com/a/8504958/2232148, мы должны взять фон и передний план представления и собрать их следующим образом:
Параметр качества принимает константу Bitmap.Config, обычно либо либо,
Bitmap.Config.RGB_565
либоBitmap.Config.ARGB_8888
.источник
ДОБАВИТЬ РАЗРЕШЕНИЕ
источник
Вы можете попробовать сделать что-то вроде этого,
Получение кеша растрового изображения из макета или представления, выполнив что-то вроде: Сначала вы должны
setDrawingCacheEnabled
перейти к макету (линейное или относительное расположение, или представление)тогда
Затем вы делаете все, что хотите с растровым изображением. Либо превратив его в файл изображения, либо отправьте URI растрового изображения в другое место.
источник
Для тех, кто хочет захватить GLSurfaceView, метод getDrawingCache или рисование на холст не будет работать.
Вы должны прочитать содержимое кадрового буфера OpenGL после рендеринга кадра. Существует хороший ответ здесь
источник
Я создал простую библиотеку, которая делает снимок экрана с
View
и дает вам растровый объект или сохраняет его по любому желаемому путиhttps://github.com/abdallahalaraby/Blink
источник
Screenshot.takeScreenshot(view, mPath); imageView.setImageBitmap(Screenshot.getBitmapScreenshot(view, mPath));
как получить представление о текущей деятельности. Я не хочу использовать идентификатор XML.takeScreenshotForScreen()
вместо.Короткий путь
источник
Просто расширяю ответ Таралки. Вы должны добавить следующие строки, чтобы это работало. Я сделал имя изображения статичным. Пожалуйста, убедитесь, что вы используете переменную timestamp taraloca, если вам нужно динамическое имя изображения.
А в файле AndroidManifest.xml должны быть следующие записи:
источник
Если вы хотите сделать снимок экрана,
fragment
чем следовать:Переопределить
onCreateView()
:Логика для снятия скриншота:
метод
shareScreenShotM)()
:Метод takeScreenShot ():
Метод savePic ():
Для активности вы можете просто использовать
View v1 = getWindow().getDecorView().getRootView();
вместоmView
источник
В большинстве ответов на этот вопрос используется
Canvas
метод рисования или метод кэширования рисунка. ОднакоView.setDrawingCache()
метод не рекомендуется в API 28 . В настоящее время рекомендуемым API для создания снимков экрана являетсяPixelCopy
класс, доступный из API 24 (но методы, которые принимаютWindow
параметр, доступны из API 26 == Android 8.0 Oreo). Вот пример кода Kotlin для полученияBitmap
:источник
Только для системных приложений!
Примечание. Системным приложениям не нужно запускать «su» для выполнения этой команды.
источник
Представление параметра является корневым объектом макета.
источник
Скриншот для полной прокрутки страницы
Если вы хотите сделать полный снимок экрана (который содержит скроллвью или около того), проверьте эту библиотеку
Все, что вам нужно сделать, это импортировать Gradel и создать объект BigScreenshot
BigScreenshot longScreenshot = new BigScreenshot(this, x, y);
Будет получен обратный вызов с растровым изображением снимков экрана, сделанным при автоматической прокрутке группы представлений экрана и в конце, собранных вместе.
@Override public void getScreenshot(Bitmap bitmap) {}
Которые могут быть сохранены в галерее или их использование необходимо после их
источник
Сделай скриншот вида в андроид.
источник
если вы хотите захватить представление или макет, такой как RelativeLayout или LinearLayout и т. д., просто используйте код:
Теперь вы можете сохранить это растровое изображение на устройстве:
источник