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