AgoraIO / Basic-Video-Call

Sample app to join/leave a channel, mute/unmute, enable/disable the video, and switch between front/rear cameras.
MIT License
695 stars 1.01k forks source link

Screen Shot in Group video call #339

Open Amitdygon opened 1 year ago

Amitdygon commented 1 year ago

How can i take screen shot of group video call .

I have tried simple bitmap creation but its seem to not working due to surface view show how can i implement this method its used to take screen shot of single surface view but its show erro mGridVideoViewContainer beacuse its a recycler view can any one help me here to take screen shot when multiple user joined in call.

` final Bitmap bitmap = Bitmap.createBitmap(mGridVideoViewContainer.getWidth(), mGridVideoViewContainer.getHeight(), Bitmap.Config.ARGB_8888);

    // Create a handler thread to offload the processing of the image.
    final HandlerThread handlerThread = new HandlerThread("PixelCopier");
    handlerThread.start();
    // Make the request to copy.
    PixelCopy.request((SurfaceView) mGridVideoViewContainer.getRootView(), bitmap, (copyResult) -> {
        if (copyResult == PixelCopy.SUCCESS){
            try {
                AppUtils.INSTANCE.saveImage(this, bitmap, new SimpleDateFormat(FILENAME_FORMAT, Locale.US).format(System.currentTimeMillis()) + ".png");
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        handlerThread.quitSafely();
    }, new Handler(handlerThread.getLooper()));
}`
xgfd3 commented 1 year ago

Maybe, you can try the code below to take screen shot of group video.

Bitmap bitmap = Bitmap.createBitmap(mGridVideoViewContainer.getWidth(), mGridVideoViewContainer.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
HandlerThread takeSnapshopThread = new HandlerThread("TakeSnapshopThread");
takeSnapshopThread.start();
Handler drawHandler = new Handler(takeSnapshopThread.getLooper());
Rect containerRect = new Rect();
mGridVideoViewContainer.getGlobalVisibleRect(containerRect);
for (int i = 0; i < mGridVideoViewContainer.getChildCount(); i++) {
    View childAt = ((ViewGroup)mGridVideoViewContainer.getChildAt(i)).getChildAt(0);
    if(childAt instanceof SurfaceView){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CountDownLatch latch = new CountDownLatch(1);
            Bitmap childBitmap = Bitmap.createBitmap(childAt.getWidth(), childAt.getHeight(), Bitmap.Config.ARGB_8888);
            Rect destRect = new Rect();
            childAt.getGlobalVisibleRect(destRect);
            destRect.left = destRect.left - containerRect.left;
            destRect.top = destRect.top - containerRect.top;
            destRect.right = destRect.left + childAt.getWidth();
            destRect.bottom = destRect.top + childAt.getHeight();
            PixelCopy.request((SurfaceView) childAt, childBitmap, copyResult -> {
                canvas.drawBitmap(childBitmap, null, destRect, paint);
                latch.countDown();
            }, drawHandler);
            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            childBitmap.recycle();
        }
    }
}
takeSnapshopThread.quit();