Skip to content

Xamarin.Amndroid 全局截图

L edited this page Jan 20, 2020 · 4 revisions

全局截图=app外也可以截图,需要授权
关键词:Media Projection API

官方示例Xamarin.Android - ScreenCapture
大致流程是

检查权限
    没有权限就申请
        callback确认权限申请结果,如果通过,则进行截图
    有权限直接截图

报错处理

ImageReader mImageReader = ImageReader.NewInstance(width, height, ImageFormatType.Jpeg, 1);
virtualDisplay = mediaProjection.CreateVirtualDisplay("ScreenCapture",
	width, height, screenDensity,
	(DisplayFlags)VirtualDisplayFlags.AutoMirror, mImageReader.Surface, null, null);
Image image = mImageReader.AcquireLatestImage();

设置截图高宽时报错

RGBA override BLOB format buffer should have height == width

这里是说截图时高宽不一致->要求高宽一致
取高宽中的较大值为截图时的高宽,获得截图内容,就不会报错

var max= ScreenWidth > ScreenHeight ? ScreenWidth : ScreenHeight;
width = max;
height = max;

则此时, 如果是竖屏截图,实际宽<实际高,图片的左右两边会留黑(因为按照高X高的尺寸获得的截图)
如果是横屏截图,实际宽>实际高,图片的上下两边留黑
需要进行裁剪后使用
以1920X1080的手机举例

竖屏

QQ图片20200120133530
橙色框为实际截图内容,为一个1920X1920的图片
蓝色框为有效的截图部分
则X从粉色的点((1920-1080)/2)开始获取图片,获取之后宽度为1080的内容即可
Y则正常从0-1920获取

横屏

QQ图片20200120134209
类似,不过是X正常0-1920
Y从((1920-1080)/2)开始获取图片,获取之后长度为1080的内容

Clone this wiki locally