Сделать снимок экрана во время записи экрана с помощью MediaProjection API. ⇐ Android
Сделать снимок экрана во время записи экрана с помощью MediaProjection API.
У меня есть класс обслуживания, где я делаю запись экрана. Я хочу сделать снимок экрана в этом классе, но не нашел подходящего способа сделать это. Может ли кто-нибудь предложить способ сделать снимок экрана в классе обслуживания?
Вот объекты mediaProjection и virtualDisplay, инициализируемые во время записи экрана
mMediaProjection = (Objects.requireNonNull( getSystemService( MEDIA_PROJECTION_SERVICE ) ) как MediaProjectionManager).getMediaProjection( мрезультаткоде, mResultData!! ) mVirtualDisplay = mMediaProjection!!.createVirtualDisplay( ЯРЛЫК, мскринвидс, mScreenHeight, мскринденсити, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder!!.поверхность, нулевой, нулевой ) Это мой код для скриншота
var imageReader: ImageReader? = null // Инициализируем по мере необходимости // Вызовите эту функцию, чтобы сделать снимок экрана личное развлечение captureScreenshot() { если (imageReader == null) { // Настраиваем ImageReader для захвата содержимого экрана val windowManager = getSystemService(WINDOW_SERVICE) как WindowManager val метрики = DisplayMetrics() windowManager.defaultDisplay.getMetrics(метрики) val screenDensity = metrics.densityDpi val screenWidth = metrics.widthPixels val screenHeight = metrics.heightPixels imageReader = ImageReader.newInstance(screenWidth, screenHeight, ImageFormat.RGB_565, 1) // Установите OnImageAvailableListener для обработки новых изображений imageReader!!.setOnImageAvailableListener({читатель -> // Обработка данных захваченного изображения val image = reader.acquireLatestImage() если (изображение != ноль) { пытаться { // Здесь ваша логика обработки изображений ProcessImage (изображение) } окончательно { // Всегда закрываем изображение, чтобы избежать утечки ресурсов изображение.закрыть() } } }, Обработчик()) } } личное развлечение ProcessImage(изображение: Изображение) { val planes = image.planes val буфер = плоскости[0].буфер val PixelStride = planes[0].pixelStride val rowStride = planes[0].rowStride val rowPadding = rowStride - PixelStride * image.width // Создаем растровое изображение для хранения снимка экрана val растровое изображение = Bitmap.createBitmap( image.width + rowPadding/pixelStride, изображение.высота, Bitmap.Config.ARGB_8888 ) bitmap.copyPixelsFromBuffer(буфер) // Сохраняем растровое изображение в файл (возможно, вы захотите поступить с этим более подходящим образом) saveBitmapToFile (растровое изображение) } личное развлечение getParentFolder(): String { return "${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)}/${ getString(R.string.app_name) }" } личное развлечение saveBitmapToFile (растровое изображение: растровое изображение) { Log.d("de_save", "saveBitmapToFile: ") пытаться { // Сохраняем растровое изображение в файл (возможно, вы захотите поступить с этим более подходящим образом) вал savePath = getFolder() Log.d("de_save", "saveBitmapToFile: savepath: $savePath") val file = File(savePath, "ScreenShot_${System.currentTimeMillis()}") val fileOutputStream = FileOutputStream(файл) bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream) файлВыходной поток.закрыть() ToastUtils.showToast("Снимок экрана сделан") } catch (e: IOException) { е.printStackTrace() } } личное развлечение getFolder(): String { val location = getParentFolder() + File.separator + «ScreenShot» val file = Файл (местоположение) если (!file.exists()) { файл.mkdirs() } место возврата } При использовании этого кода setOnImageAvailableListener никогда не вызывается.
У меня есть класс обслуживания, где я делаю запись экрана. Я хочу сделать снимок экрана в этом классе, но не нашел подходящего способа сделать это. Может ли кто-нибудь предложить способ сделать снимок экрана в классе обслуживания?
Вот объекты mediaProjection и virtualDisplay, инициализируемые во время записи экрана
mMediaProjection = (Objects.requireNonNull( getSystemService( MEDIA_PROJECTION_SERVICE ) ) как MediaProjectionManager).getMediaProjection( мрезультаткоде, mResultData!! ) mVirtualDisplay = mMediaProjection!!.createVirtualDisplay( ЯРЛЫК, мскринвидс, mScreenHeight, мскринденсити, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder!!.поверхность, нулевой, нулевой ) Это мой код для скриншота
var imageReader: ImageReader? = null // Инициализируем по мере необходимости // Вызовите эту функцию, чтобы сделать снимок экрана личное развлечение captureScreenshot() { если (imageReader == null) { // Настраиваем ImageReader для захвата содержимого экрана val windowManager = getSystemService(WINDOW_SERVICE) как WindowManager val метрики = DisplayMetrics() windowManager.defaultDisplay.getMetrics(метрики) val screenDensity = metrics.densityDpi val screenWidth = metrics.widthPixels val screenHeight = metrics.heightPixels imageReader = ImageReader.newInstance(screenWidth, screenHeight, ImageFormat.RGB_565, 1) // Установите OnImageAvailableListener для обработки новых изображений imageReader!!.setOnImageAvailableListener({читатель -> // Обработка данных захваченного изображения val image = reader.acquireLatestImage() если (изображение != ноль) { пытаться { // Здесь ваша логика обработки изображений ProcessImage (изображение) } окончательно { // Всегда закрываем изображение, чтобы избежать утечки ресурсов изображение.закрыть() } } }, Обработчик()) } } личное развлечение ProcessImage(изображение: Изображение) { val planes = image.planes val буфер = плоскости[0].буфер val PixelStride = planes[0].pixelStride val rowStride = planes[0].rowStride val rowPadding = rowStride - PixelStride * image.width // Создаем растровое изображение для хранения снимка экрана val растровое изображение = Bitmap.createBitmap( image.width + rowPadding/pixelStride, изображение.высота, Bitmap.Config.ARGB_8888 ) bitmap.copyPixelsFromBuffer(буфер) // Сохраняем растровое изображение в файл (возможно, вы захотите поступить с этим более подходящим образом) saveBitmapToFile (растровое изображение) } личное развлечение getParentFolder(): String { return "${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)}/${ getString(R.string.app_name) }" } личное развлечение saveBitmapToFile (растровое изображение: растровое изображение) { Log.d("de_save", "saveBitmapToFile: ") пытаться { // Сохраняем растровое изображение в файл (возможно, вы захотите поступить с этим более подходящим образом) вал savePath = getFolder() Log.d("de_save", "saveBitmapToFile: savepath: $savePath") val file = File(savePath, "ScreenShot_${System.currentTimeMillis()}") val fileOutputStream = FileOutputStream(файл) bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream) файлВыходной поток.закрыть() ToastUtils.showToast("Снимок экрана сделан") } catch (e: IOException) { е.printStackTrace() } } личное развлечение getFolder(): String { val location = getParentFolder() + File.separator + «ScreenShot» val file = Файл (местоположение) если (!file.exists()) { файл.mkdirs() } место возврата } При использовании этого кода setOnImageAvailableListener никогда не вызывается.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Сделайте снимок экрана с помощью ADB и получите его в Java БЕЗ записи файла.
Anonymous » » в форуме JAVA - 0 Ответы
- 51 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Сделайте снимок экрана с помощью ADB и получите его в Java БЕЗ записи файла.
Anonymous » » в форуме Android - 0 Ответы
- 46 Просмотры
-
Последнее сообщение Anonymous
-