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

Чтобы программно сделать снимок экрана в Android-приложении, можно использовать API PixelCopy
или API View
, в зависимости от ваших требований и целевого уровня Android API.
1. Использование API View
(Простой способ, но может не сработать для всех случаев)
Если нужно сделать снимок экрана для конкретного View
, можно воспользоваться следующим подходом:
// Функция для создания скриншота конкретного View
fun takeScreenshot(view: View): Bitmap {
// Включаем кэширование содержимого View
view.isDrawingCacheEnabled = true
view.buildDrawingCache()
// Создаем Bitmap на основе содержимого кэша View
val bitmap = Bitmap.createBitmap(view.drawingCache)
// Отключаем кэш после создания скриншота
view.isDrawingCacheEnabled = false
return bitmap
}
Затем можно сохранить или обработать полученный Bitmap
по необходимости.
2. Использование API PixelCopy
(Более мощное решение, требуется Android API 24+)
API PixelCopy
— это более надежный способ для создания скриншотов всего экрана, включая случаи с использованием SurfaceView
или OpenGL.
Пример использования PixelCopy
для создания скриншота всего окна:
// Функция для создания скриншота с помощью PixelCopy (API 24+)
fun takeScreenshot(activity: Activity, callback: (Bitmap?) -> Unit) {
val window = activity.window
val view = window.decorView
// Создаем Bitmap с теми же размерами, что и у View
val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
// Получаем SurfaceView корневого View
val surface = window.decorView.rootView
// Используем PixelCopy для создания скриншота
PixelCopy.request(window, bitmap, { result ->
if (result == PixelCopy.SUCCESS) {
// Скриншот успешно создан, возвращаем Bitmap
callback(bitmap)
} else {
// Обрабатываем ошибку
callback(null)
}
}, Handler(Looper.getMainLooper()))
}
В этом случае нужно передать контекст Activity
и функцию обратного вызова для обработки результата — созданного Bitmap
.
3. Разрешения
Если вы пытаетесь делать снимки экрана за пределами вашего приложения (например, снимаете весь экран), это потребует разрешения WRITE_EXTERNAL_STORAGE
, если вы хотите сохранить скриншот во внешнее хранилище (для Android API ниже 29). Начиная с Android API 29, можно сохранять скриншоты в область хранилища без необходимости запрашивать разрешения на внешнее хранилище.
Для новых версий Android (API 30+) рекомендуется использовать MediaStore
для сохранения изображений, а не записывать их напрямую во внешнее хранилище.