美文网首页
android MediaProjection 截屏

android MediaProjection 截屏

作者: lesliefang | 来源:发表于2020-08-18 18:51 被阅读0次

MediaProjection 既可以截屏也可以录屏

发起截屏请求

MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
Intent intent = mediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(intent, 333);

onActivityResult 里面处理

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 333 && data != null) {
        MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(Activity.RESULT_OK, data);
        DisplayMetrics outMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
        final int screenWidth = outMetrics.widthPixels;
        final int screenHeight = outMetrics.heightPixels;
        ImageReader imageReader = ImageReader.newInstance(
                screenWidth,
                screenHeight,
                PixelFormat.RGBA_8888, 1);
        VirtualDisplay virtualDisplay = mediaProjection.createVirtualDisplay("screen-mirror",
                screenWidth,
                screenHeight,
                outMetrics.densityDpi,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                imageReader.getSurface(), null, null);
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Image image = imageReader.acquireLatestImage();
                if (image == null) {
                    return;
                }
                Image.Plane[] planes = image.getPlanes();
                ByteBuffer buffer = planes[0].getBuffer();
                int pixelStride = planes[0].getPixelStride();
                int rowStride = planes[0].getRowStride();
                int rowPadding = rowStride - pixelStride * screenWidth;

                Bitmap bitmap = Bitmap.createBitmap(screenWidth + rowPadding / pixelStride,
                        screenHeight, Bitmap.Config.ARGB_8888);
                bitmap.copyPixelsFromBuffer(buffer);
                String fileName = null;
                try {
                    Date currentDate = new Date();
                    SimpleDateFormat date = new SimpleDateFormat("yyyyMMddhhmmss");
                    File dir = getExternalFilesDir(null);
                    fileName = dir.getAbsolutePath() + "/" + date.format(currentDate) + ".png";
                    FileOutputStream fos = new FileOutputStream(fileName);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                image.close();
                mediaProjection.stop();
                virtualDisplay.release();

                // 使用截图 bitmap
            }
        }, 500);
    }
}

为什么延迟调用 acquireLatestImage ??? 因为截屏需要时间,立马去获取可能获取不到。

用 imageReader.setOnImageAvailableListener() 设置回调也是可以的,但我测试时每次都回调 2 次,所以为了简单就延时获取了。

相关文章

  • android MediaProjection 截屏

    MediaProjection 既可以截屏也可以录屏 发起截屏请求 onActivityResult 里面处理 为...

  • Android 5.0以下截图Dialog

    在5.0之后Google开放了截屏录屏的API,使用比较方便 相关类 MediaProjection:可以用来捕获...

  • android 截屏实现

    Android 截屏分为四种:View 截屏、WebView 截屏、系统截屏 和 adb 截屏 1、View 截屏...

  • 基于MediaProjection实现Android移动手机截屏

    Android软件应用经常要求实现截屏和录屏的功能,那么如何实现Android软件截屏和录屏功能呢?本文将介绍基于...

  • Android 截屏方式整理

    Android 实现截屏方式整理 可能的需求: 截自己的屏 截所有的屏 带导航栏截屏 不带导航栏截屏 截屏并编辑选...

  • Android录屏简介

    0x00 如何获取MediaProjection实例 Android 5.0及以上版本提供录屏接口MediaPro...

  • 安卓截图笔记

    Android截屏 Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后...

  • Android截屏方案

    Android截屏 Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后...

  • Android截屏

    1、android 5.0开始加入了MediaProjection,通过MediaProjection我们可以快速...

  • ScreenShotUtils--Android实现截屏并保存在

    添加权限(AndroidManifest.xml文件里) 实现截屏(Java代码) 转自Android实现截屏并保...

网友评论

      本文标题:android MediaProjection 截屏

      本文链接:https://www.haomeiwen.com/subject/ceikjktx.html