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