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

фон

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

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

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

adb shell screenrecord /sdcard/video.mp4 

вы даже можете сделать это из Android Studio себя.

проблема

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

что я нашел

единственное место, которое я нашел, это документация (здесь, в разделе" захват экрана и совместное использование"), говоря мне это:

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

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

пример использования новых API см. В разделе MediaProjectionDemo класс в образце проекта.

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

вопросы

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

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

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

1 ответов


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

я использовал их 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]: шифрование кода для скриншота

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

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);

b. Затем запустите захват экрана на основе намерения или действия -

startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);

остановить Медиа-проекция -

sMediaProjection.stop();

c. Затем преобразовать в изображение -

//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.PNG, 100, fos);
fos.close();

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

  1. запись видео с MediaProjectionManager - сайт

  2. android-ScreenCapture - github согласно замечания разработчика android:)

  3. screenrecorder - github

  4. захват и запись экрана Android с помощью API MediaProjection - сайт


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

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