android无障碍截屏,[Android] 使用MediaProjection截屏

本文详细介绍了Android5.0及以上版本使用MediaProjection进行屏幕截屏的流程,包括MediaProjectionManager的使用、用户权限获取、虚拟显示(VirtualDisplay)创建以及ImageReader在截屏过程中的作用。通过MediaProjectionManager的createScreenCaptureIntent()启动截屏请求,用户授权后,利用MediaProjection创建VirtualDisplay并结合ImageReader读取屏幕内容,实现截屏功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Background

Android5.0以上提供了MediaProjection,方便截屏录屏等功能。

一个完整的创建MediaProjection到结束的流程如下:

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

// init

startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (RESULT_OK == resultCode && REQUEST_CODE == requestCode) {

sMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);

......

}

}

// end

sMediaProjection.stop();

其中,需要使用startActivityForResult的唯一原因是,捕捉屏幕是需要用户确认权限才可以,这个权限对应的对话框就是由createScreenCaptureIntent创建的,在用户点击允许之后,在onActivityResult得到确认码,才可以拿到MediaProjection对象。

下面详细介绍相关知识点。

About MediaProjection

MediaProjection

授予应用程序捕获屏幕内容或记录系统音频的能力。授予的准确能力取决于MediaProjection的类型

可以通过createScreenCaptureIntent()捕获屏幕会话。它能获取屏幕内容,但无法获取系统音频。

它有4个公有方法:

createVirtualDisplayVirtualDisplay createVirtualDisplay (String name,

int width,

int height,

int dpi,

int flags,

Surface surface,

VirtualDisplay.Callback callback,

Handler handler)

创建一个VirtualDisplay用来捕获屏幕内容。

参数:

name:String 名称,永不为空

width:int

height:int

dpi:int

flags:int DisplayManager定义的flag组合

surface:Surface virtual display的内容应该被渲染的surface,没有的话为空

callback:VirtualDisplay.Callback virtual display状态变化的回调

handler:Handler callback调用的Handler。如果回调在calling thread的主looper被调用,则为空?

registerCallbackvoid registerCallback (MediaProjection.Callback callback,

Handler handler)

注册一个listener接收MediaProjection变化状态的通知。

stopvoid stop ()

停止projection

unregisterCallbackvoid unregisterCallback (MediaProjection.Callback callback)

取消注册MediaProjection的listener

MediaProjectionManager

管理获取到MediaProjection具体类型。

该类必须使用Context.getSystemService(Class)方法,参数用MediaProjectionManager.class或者Context.getSystemService(String)方法,参数用Context.MEDIA_PROJECTION_SERVICE两种方式实例化。

公有方法:

createScreenCaptureIntentIntent createScreenCaptureIntent()

启动screen capture,必须把这个方法返回的Intent传递给startActivityForResult()。这个Activity会提示用户是否允许捕捉屏幕。用户的操作结果需要传递给getMediaProjection。

所以这里的目的就是提示用户,获取允许再抓屏。我用小米系统,这个提示只会弹一次。后面用nexus试试

getMediaProjectionMediaProjec

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值