- Android — Как сделать снимок экрана программно
- 5 ответов
- Android Take Screenshot Programmatically | ScrollView
- 1. Android Take Screenshot Programmatically And Share
- 1. Runtime Permissions
- 2. Layout And Java Code
- 3. Screenshot of Particular Layout
- 2. Android Take Scrollview Screenshot | Whole/Full/Long Activity Page
- Output Video
- 1. All Required Permissions
- 2. Setting up the scrollview
- Saving the image
- 3. Previewing the screenshot
- 10 thoughts on “Android Take Screenshot Programmatically | ScrollView”
- Как программно сделать снимок экрана в Android?
Android — Как сделать снимок экрана программно
Мне нужно программно делать скриншоты Android-устройства или эмулятора, когда мое приложение установлено и работает в фоновом режиме каждые 200 миллисекунд, и сохранять изображения на моем компьютере. Я реализовал эту процедуру, используя приведенный ниже код, и работает только тогда, когда мое приложение находится на переднем плане. Я хочу делать снимки экрана, когда мое приложение также работает в фоновом режиме. Ниже мой код:
Как я могу программно реализовать функциональность кнопок «Обновить» и «Сохранить» в Screencapture в Devices -> DDMS ? Могу ли я этого добиться?
5 ответов
Если ваш телефон рутирован, попробуйте это
Затем прочтите img.png как растровое изображение и преобразуйте его в jpg следующим образом
У вас нет доступа к экрану, если ваше приложение находится в фоновом режиме, если вы не рутированы, приведенный выше код может наиболее эффективно сделать снимок экрана любого экрана, даже если вы находитесь в фоновом режиме.
ОБНОВЛЕНИЕ
У Google есть библиотека, с помощью которой вы можете делать снимки экрана без рутирования, я пробовал это, но я уверен, что он съест память как можно скорее.
Добавьте этот метод к событию нажатия кнопки или к событию, выбранному в пункте меню параметров, и снимок экрана будет сохранен в папке загрузки, потому что в переменной folder я указал путь загрузки, вы можете изменить путь к папке. В файле манифеста добавьте разрешение для записи
Вы можете рассмотреть возможность смешивания MediaProjection и AccessibilityService. Первый с легкостью делает снимок экрана, второй работает все время «над» всеми приложениями.
Учебное пособие по запуску AccessibilityService в CODELABS
Полный исходный код вышеуказанного экзамена ЗДЕСЬ
В ЭТОМ ответе вы можете найти довольно полезный фрагмент кода для Activity . Не забудьте установить правильный полностью прозрачный Theme :
Затем повторяйте startActivity в своем AccessibilityService так часто, как вам нужно, или даже лучше — используйте LocalBroadcastManager , чтобы сообщить Service , что Activity сделал снимок экрана и закончил (так что Service может снова запустить это Activity )
Я сделал нечто подобное (только для внутреннего использования) + скриншоты были проанализированы с помощью OCR, чтобы получить от них текст. Типичный синтаксический анализ, когда не ваше приложение каким-то образом защищает от функций AccesibilityService (этот тип Service предназначен для помощи людям с ограниченными возможностями, например, при чтении текста, обычно имеют доступ к TextView )
Для создания снимка экрана в фоновом режиме (например, ADB) требуется groups = 1003 (графика) . В противном случае вы можете получить только снимок экрана вашего собственного процесса. Таким образом, вы можете сделать это либо только на рутированном устройстве, либо с помощью собственной программы ADB.
И если вы хотите сделать это в java-коде, вам нужно получить доступ к скрытому API класса Surface:
Эти два должны быть в порядке с момента выпуска ICS, для раннего выпуска, такого как GB, вы можете проверить собственный код cpp.
Однако в некоторых устройствах Android реализация мультимедийной системы, холста и т. Д. Не очень хорошая, поэтому в этом случае вы не можете захватывать воспроизведение видео или любой контент, отображаемый на поверхности.
Источник
Android Take Screenshot Programmatically | ScrollView
Android take screenshot programmatically and share with whatsapp, gmail, facebook etc. platforms.
In this tutorial, we will also take the screenshot of particular layout.
1. Android Take Screenshot Programmatically And Share
We will take the screenshot of imageview and textview in this Android take screenshot example. You can also take screenshot of other layout like linearlayout, relativelayout, edittext etc. with the source code of this example.
You will also learn how to save the captured screenshot in the internal storage in the JPEG format.
I will teach you to capture screenshot on button click with android studio.
1. Runtime Permissions
We are going to save the screenshot in the internal storage of the android device.
For this purpose, we need following two permissions.
I have set the target sdk version as 22 but if you want to target greater version than 22, you need to ask for the runtime permissions.
2. Layout And Java Code
In your activity_main.xml file, add following code
I have taken one imageview and three buttons in the above layout file.
Above file will generate the below output
Captured screenshot will be previewed in this Imageview (PINK BACKGROUND). One button (TAKE SCREENSHOT) will take the screenshot on it’s click event.
Share button will enable the user to share the screenshot with different apps like whatsapp, gmail, facebook etc.
Now copy and paste below source code into the MainActivity.java file
As you have seen in the above image, Take Screenshot button will capture screenshot with below code
Above method will also save the screenshot in the internal storage.
After saving the image, we will preview it in the imageview.
See the below image which shows the output generated when the screenshot is captured successfully.
User will click the share button to share the screenshot.
Following method will do this task for us.
I have just called above method on the button click.
Share Intent is used to share the image. Intent will use the URI of the image to share it with various apps.
You will get following screen when this method is executed by the system
As you can see that system will allow user to choose from various apps to share the screenshot
If user choose gmail here, then it will open the gmail app and will attach our screenshot
Similarly, you can share with other apps like whatspp, facebook, instagram etc.
Android take screenshot tutorial will also guide you to capture specific layout including imageview.
Now, when the user clicks on the third button (SS of particular layout), compiler will open new activity.
3. Screenshot of Particular Layout
Create one new activity and give it a name “ParticularLayoutActivity“.
In your activity_particular_layout.xml file, add following code
In this file, I have taken an Imageview, which will preview the screenshot same as in the previous scenario.
Write the below source code into ParticularLayoutActivity.java file
In this activity we will take the screenshots of two different and particular layouts – Imageview and Textview.
Consider below image
As you can see in the above image, we have one image of car and one textview with green background.
There are two buttons above both views.
You can download the image of the car by
[sociallocker]Click here to download car image[/sociallocker]
Following method will take the screenshot of both the views.
This method will also save the screenshot in the internal storage.
Below code will take the screenshot of Car Image.
In the takeSS() method, we need to pass the layout of which we want to capture the screenshot as a parameter.
Here, I have passed the imageview.
Below method will take the screenshot of textview.
Below output is generated when the user takes the screenshot of the car image.
Following image shows the screenshot of the textview.
So it was all the handy information about android take screenshot tutorial.
2. Android Take Scrollview Screenshot | Whole/Full/Long Activity Page
Android Take Scrollview Screenshot Tutorial with Example is your today’s guide.
When the screen size is limited but information on the single screen in large, we will simply use scrollview. But when you want to take the screenshot of the whole screen, some problems arise.
It is easy to take the screenshot of current screen but it is little tough when the screen have the scrollview with it.
With the simple and usual techniques, system will not capture the whole scrollview.
In this example, we will capture the whole scrollview programmatically even if it is double or more longer than the screen of the android device.
Normally, the pages having information about the person or school or organisation have more height than the average android device screen size. You must use scrollview in this scenarios.
In these cases, this tutorial will help you a lot and will save your time and efforts.
Output Video
After completion of all above code stuff, you should get output like following video
1. All Required Permissions
In this tutorial, you need to ask for required permissions.
Below are these permissions
I have set the target sdk version as 22, so no need for runtime permission here.
2. Setting up the scrollview
Update your activity_main.xml file with below source code
I have taken scrollview with six child views in it.
On the button click, system will capture the screenshot of the scrollview.
I have set three different images in above code. Download them by clicking below link.
[sociallocker] Download Required Images [/sociallocker]
Add following code into the MainActivity.java file
Consider the below code
This is the code for the button click.
When the user will click the button, system will capture the screenshot of the scrollview.
A method named getBitmapFromView() will be executed here. We need to provide scrollview, it’s height and it’s length in the parameters of the getBitmapFromView() method.
Below is the code for getBitmapFromView() method.
It will create the bitmap from the view object of the scrollview, scrollview’s height and length.
getBitmapFromView() method will return the bitmap of the scrollview.
This bitmap can be used easily to store the image in the internal storage.
Saving the image
Following method will save the screenshot of the scrollview using the bitmap.
The bitmap returned by the getBitmapFromView() method will be passed as the parameter of the saveBitmap() method.
After saving the screenshot successfully, compiler will run the below coding lines.
This will simply open an activity which will preview the generated screenshot in an imageview.
For this, we need to create a new activity.
3. Previewing the screenshot
Make a new activity and give it a name “PreviewActivity”.
Add below code in activity_preview.xml
Write below code in PreviewActivity.java file
There is one imageview in this activity. This image will show us the screenshot of the whole scrollview.
Screenshot is set into the imageview by below line
I have declared a bitmap called bitScroll as public static in the Main Activity.
So we can use it in any other activity of our app. Here, I have used that public bitScroll variable to set the image in preview activity.
All the words for android take scrollview screenshot tutorial with example are written completely.
10 thoughts on “Android Take Screenshot Programmatically | ScrollView”
Is there any issue with android versions when running this code, This thing not working for me
This code working fine, but how to take screenshot of current view but view the result in another activity, let’s says i wanna screenshot my mainActivity then the screenshot goes to resultActivity with the mainActivity picture within
You can make a public bitmap variable. Then in your result activity use this public bitmap in imageview.
Thank you, i don’t know how to translate your advice to codes, but i do searches for that and finally found the working solution as i want.
how to take screen shot with status bar
Nice tutorial and it works like charm.
FileNotFoundException: /storage/emulated/0/Thu Sep 05 12:17:24 GMT+05:30 2019.jpeg (Permission denied)
this is my exception pls help
you get the solution?
My app crash when i click share button.
It shows this exception in logcat
android.os.FileUriExposedException: file:///storage/emulated/0/Wed%20Oct%2009%2000%3A49%3A53%20GMT%2B05%3A00%202019.jpeg exposed beyond app through ClipData.Item.getUri()
Can someone help to resolve this issue?
Nice tutorial and it works fine’
Can I Take Screenshot Programmatically Using GridView ?
Источник
Как программно сделать снимок экрана в 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 и т. Д., Просто используйте код:
Теперь вы можете сохранить это растровое изображение на устройстве:
Источник