web-dev-qa-db-ja.com

Android API?

バックグラウンド

Androidは、KitKatとLollipopで画面を動画でキャプチャするための新しいAPIを取得しました。 ADBツールを使用するか、コード(Lollipopから開始)を使用して実行できます。

新しいAPIがリリースされて以来、この機能を使用する多くのアプリが登場し、画面を記録できるようになり、Microsoftは独自のGoogle-Now-On-tap競合アプリを作成しました。

ADBを使用すると、次を使用できます。

_adb Shell screenrecord /sdcard/video.mp4 
_

Android Studio自体からもできます。

問題

APIを使用してコードを実行する方法についてのチュートリアルや説明が見つかりません。

私が見つけたもの

私が見つけた唯一の場所はドキュメントです( here 、「スクリーンキャプチャと共有」の下)、これを教えて:

Android 5.0では、新しいAndroid.media.projection APIを使用して、画面キャプチャ機能と画面共有機能をアプリに追加できます。この機能は、たとえば、ビデオ会議アプリで画面共有を有効にする場合に便利です。

新しいcreateVirtualDisplay()メソッドを使用すると、アプリでメイン画面(デフォルトのディスプレイ)のコンテンツをSurfaceオブジェクトにキャプチャし、Surfaceオブジェクトにネットワーク経由で送信できます。このAPIでは、安全でない画面コンテンツのみをキャプチャでき、システムオーディオはキャプチャできません。画面キャプチャを開始するには、アプリは最初にcreateScreenCaptureIntent()メソッドで取得したインテントを使用して画面キャプチャダイアログを起動して、ユーザーの許可を要求する必要があります。

新しいAPIの使用方法の例については、サンプルプロジェクトのMediaProjectionDemoクラスを参照してください。

つまり、「MediaProjectionDemo」のサンプルが見つかりません。代わりに、「スクリーンキャプチャ」サンプルを見つけましたが、それがどのように動作するのか理解できません。ファイル。サンプルは非常にバグが多いようです。

質問

新しいAPIを使用してこれらのアクションを実行するにはどうすればよいですか:

  1. オプションでオーディオ(マイク/スピーカー/両方)を含む録音を開始します。
  2. 記録停止
  3. ビデオの代わりにスクリーンショットを撮ります。

また、どのようにカスタマイズしますか(解像度、要求されたfps、色、時間...)?

37

最初のステップと、Ken Whiteが正しく提案し、既にカバーしているかもしれないものは、公式に提供されている サンプルコード です。

以前に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();
   }
  }
 }

コードがお役に立てば幸いです。これは original link で、この実装(ビデオ録画)の派生元であるコードを参照しています。


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

Media Projection APIの(完全なコード)の実装がいくつかあります。開発に役立つ他のリンク-

  1. MediaProjectionManagerによるビデオ録画 -ウェブサイト

  2. Android-ScreenCapture -github Android開発者の観察:)

  3. screenrecorder -github

  4. キャプチャと記録Android MediaProjection APIを使用した画面 -ウェブサイト


それが役立つことを願っています:)ハッピーコーディングとスクリーンレコーディング!

PS:あなたが話しているMicrosoftアプリを教えてください。私はそれを使用していません。試してみたい:)

61
bozzmob