Как записывать экран и делать скриншоты, используя Android API?

Задний план

Android получил новый API на Kitkat и Lollipop, чтобы захватить видео. Вы можете сделать это либо с помощью инструмента ADB, либо с помощью кода (начиная с Lollipop).

С тех пор, как появился новый API, появилось много приложений, которые используют эту функцию, позволяя записывать экран, а Microsoft даже сделала свое приложение для Google-Now-On-Tap.

Используя ADB, вы можете использовать:

adb shell screenrecord /sdcard/video.mp4 

Вы даже можете сделать это из самой Android-студии.

Проблема

Я не могу найти учебник или объяснение о том, как это сделать, используя API, что означает код.

Что я нашел

Единственное место, которое я нашел, это документация ( здесь , под «Захват экрана и совместное использование»), сказав мне следующее:

Android 5.0 позволяет добавлять возможности захвата экрана и совместного использования экрана в ваше приложение с помощью новых API-интерфейсов android.media.projection. Эта функциональность полезна, например, если вы хотите включить совместное использование экрана в приложении для видеоконференций.

Новый createVirtualDisplay() позволяет вашему приложению захватывать содержимое основного экрана (дисплей по умолчанию) в объект Surface, который ваше приложение затем может отправлять по сети. API только позволяет захватывать небезопасный контент экрана, а не системный звук. Чтобы начать захват экрана, ваше приложение должно сначала запросить разрешение пользователя, запустив диалоговое окно захвата экрана, используя Intent, полученный с помощью createScreenCaptureIntent() .

Пример использования новых API-интерфейсов см. В классе MediaProjectionDemo в примере проекта.

Дело в том, что я не могу найти образец «MediaProjectionDemo». Вместо этого я нашел образец «Screen Capture», но я не понимаю, как он работает, поскольку, когда я его запускал, все, что я видел, это мигающий экран, и я не думаю, что он сохраняет видео файл. Образец кажется очень глючным.

Вопросы

Как выполнить эти действия с помощью нового API:

  1. Начать запись, опционально включая аудио (микрофон / динамик / оба).
  2. Прекратить запись
  3. Сделайте снимок экрана вместо видео.

Также, как его настроить (разрешение, запрошенные fps, цвета, время …)?

Solutions Collecting From Web of "Как записывать экран и делать скриншоты, используя Android API?"

Первый шаг и тот, который Кэйт Уайт порекомендовал, и который вы, возможно, уже рассмотрели, – это примерный код, предоставленный официально.

Раньше я использовал их API. Я согласен, что скриншот довольно прямолинейный. Но экранная запись также находится в аналогичных строках.

Я отвечу на ваши вопросы в 3-х разделах и завершаю ссылку. 🙂


1. Запустите видеозапись

 private void startScreenRecord(final Intent intent) { if (DEBUG) Log.v(TAG, "startScreenRecord:sMuxer=" + sMuxer); synchronized(sSync) { if (sMuxer == null) { final int resultCode = intent.getIntExtra(EXTRA_RESULT_CODE, 0); // get MediaProjection final MediaProjection projection = mMediaProjectionManager.getMediaProjection(resultCode, intent); if (projection != null) { final DisplayMetrics metrics = getResources().getDisplayMetrics(); final int density = metrics.densityDpi; if (DEBUG) Log.v(TAG, "startRecording:"); try { sMuxer = new MediaMuxerWrapper(".mp4"); // if you record audio only, ".m4a" is also OK. if (true) { // for screen capturing new MediaScreenEncoder(sMuxer, mMediaEncoderListener, projection, metrics.widthPixels, metrics.heightPixels, density); } if (true) { // for audio capturing new MediaAudioEncoder(sMuxer, mMediaEncoderListener); } sMuxer.prepare(); sMuxer.startRecording(); } catch (final IOException e) { Log.e(TAG, "startScreenRecord:", e); } } } } } 

2. Остановите видеозапись

  private void stopScreenRecord() { if (DEBUG) Log.v(TAG, "stopScreenRecord:sMuxer=" + sMuxer); synchronized(sSync) { if (sMuxer != null) { sMuxer.stopRecording(); sMuxer = null; // you should not wait here } } } 

2.5. Пауза и возобновление видеозаписи

  private void pauseScreenRecord() { synchronized(sSync) { if (sMuxer != null) { sMuxer.pauseRecording(); } } } private void resumeScreenRecord() { synchronized(sSync) { if (sMuxer != null) { sMuxer.resumeRecording(); } } } 

Надеюсь, код поможет. Вот исходная ссылка на код, на который я ссылался, и из которого также получена эта реализация (видеозапись).


3. Сделайте снимок экрана вместо видео

Я думаю, что по умолчанию его легко зафиксировать в растровом формате. Вы все еще можете использовать пример MediaProjectionDemo для захвата снимка экрана.

[EDIT]: шифрование кода для снимка экрана

а. Создание виртуального дисплея в зависимости от ширины и высоты устройства

 mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2); mVirtualDisplay = sMediaProjection.createVirtualDisplay(SCREENCAP_NAME, mWidth, mHeight, mDensity, VIRTUAL_DISPLAY_FLAGS, mImageReader.getSurface(), null, mHandler); mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), mHandler); 

б. Затем запустите Screen Capture на основе намерения или действия,

 startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE); 

Стоп Медиа проекция-

 sMediaProjection.stop(); 

с. Затем конвертируйте в изображение-

 //Process the media capture image = mImageReader.acquireLatestImage(); Image.Plane[] planes = image.getPlanes(); ByteBuffer buffer = planes[0].getBuffer(); int pixelStride = planes[0].getPixelStride(); int rowStride = planes[0].getRowStride(); int rowPadding = rowStride - pixelStride * mWidth; //Create bitmap bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888); bitmap.copyPixelsFromBuffer(buffer); //Write Bitmap to file in some path on the phone fos = new FileOutputStream(STORE_DIRECTORY + "/myscreen_" + IMAGES_PRODUCED + ".png"); bitmap.compress(CompressFormat.JPEG, 100, fos); 

Существует несколько реализаций (полный код) Media Projection API . Некоторые другие ссылки, которые могут помочь вам в разработке,

  1. Запись видео с MediaProjectionManager – веб-сайт

  2. Android-ScreenCapture – github по наблюдениям разработчиков Android

  3. Screenrecorder – github

  4. Захват и запись экрана Android с использованием API MediaProjection – веб-сайт


Надеюсь, это поможет 🙂 Счастливое кодирование и запись на экране!

PS: Можете ли вы рассказать мне приложение Microsoft, о котором вы говорите? Я не использовал его. Хотелось бы попробовать 🙂