Android普通截屏(包括状态栏内容)

从 Android 5.0(API 21) 起,开放了截屏录屏的API,使用到的类有MediaProjectionManager、MediaProjection、VirtualDisplay、ImageReader。


普通截屏大致步骤


① 获取屏幕的长宽高以及densityDpi等,并初始化ImageReader的实例[ 注意获取长宽高的时机 ]

    ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);

② 获取MediaProjectionManager的实例

    MediaProjectionManager manager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);

③ 获取截屏的Intent

    Intent intent = manager.createScreenCaptureIntent();

④ 启动截屏页面[ MediaProjectionPermissionActivity ]

    startActivityForResult(intent, 200);

⑤ 在onActivityResult方法中获取MediaProjection实例

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK && requestCode == 200) {
           MediaProjection projection = manager.getMediaProjection(RESULT_OK, data);          
        }
    }
⑥ 获取虚拟显示器VirtualDisplay的实例
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK && requestCode == 200) {
           MediaProjection projection = manager.getMediaProjection(RESULT_OK, data);
           VirtualDisplay display = projection.createVirtualDisplay("ScreenShot",
                    width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                    imageReader.getSurface(), null, null);
        }
    }
⑦ 获取截图,bitmap即为所得 [ 注意获取image的时机,我采用了handler.postDelay的方式 ]
    Image image = imageReader.acquireLatestImage();
    int width = image.getWidth();
    int height = image.getHeight();
    Image.Plane[] planes = image.getPlanes();
    ByteBuffer buffer = planes[0].getBuffer();
    int pixelStride = planes[0].getPixelStride();
    int rowStride = planes[0].getRowStride();
    int rowPadding = rowStride - pixelStride * width;
    Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride,
                            height, Bitmap.Config.ARGB_8888);
    bitmap.copyPixelsFromBuffer(buffer);
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);
    image.close();


完整示例


我要做的工作是,在Activity创建时就截取屏幕,所以在onCreate方法中就需要获取屏幕的一些相关参数,这里我使用了如何合理地获取屏幕的宽高中的第二种方法,采用handler.postDelayed(Runnable r, long delayMillis) 方法。

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.Image;
import android.media.ImageReader;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProj
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值