Android PC投屏简单尝试
http://bbs.zecoki.com/data/attachment/common/cf/102311q362klb36li21t72.png代码地址 :https://github.com/deepsadness/MediaProjectionDemo
项目使用说明1.运行Node的Socket服务端
node ./sockt/io-server.js
2.运行Node的网页 node ./sockt/index.js
打开 localhost:3000.就可以看到网页了。
运行App。进入 在MainActivity,点击Start按钮,就可以开始了 进入Activity时,已经回去连接socket
注意:
[*]需要在局域网内运行。App内需要配置好Socket链接的ip. 在SocketIoManager内具体的内容,还是请看一下代码。
代码地址 :https://github.com/deepsadness/MediaProjectionDemo
###效果预览 https://camo.githubusercontent.com/8ff0a3b437956a0a345a674710bb447832645ebc/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313837373139302d346664353766616532386266396230302e6769663f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970
###简单说明:
[*]使用Android MediaProjection Api来完成视频的截图通过WebSocket进行链接。将图片传递给网页
想法来源看到vysor,觉得特别好玩,于是就想着自己能不能试着做一个类似的功能出来。搜索了相关实现。发现网上已经有网友针对vysor做了分析。于是就照着思路,按图索骥,当作对MediaProjection Api的练习,来完成这个小项目
主要思路####1. 获取屏幕的截屏
[*]创建VirtualDisplay Android在Api 21以上为我们已经提供了系统的Api可以进行操作。 主要是这几个类的相互配合MediaProjection和VirtualSurface,还有截图的话,使用ImageReader,三个类配合使用。https://camo.githubusercontent.com/cc3bd87b5aad4d67df7c9efa0ee449c0422fb800/68747470733a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313837373139302d393165353462643034363730636437352e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430
[*]public RxScreenShot createImageReader() {
[*] //注意这里使用RGB565报错提示,只能使用RGBA_8888
[*] mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1000);
[*] mSurfaceFactory = new ImageReaderSurface(mImageReader);
[*] createProject();
[*] return this;
[*] }
[*]
[*] private void createProject() {
[*] mediaProjection.registerCallback(mMediaCallBack, mCallBackHandler);
[*] //通过这种方式来创建这个VirtualDisplay,并将数据传递给ImageReader提供surface
[*] mediaProjection.createVirtualDisplay(TAG + "-display", width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
[*] mSurfaceFactory.getInputSurface(), null, null); }
获取屏幕截图 可以通过ImageReader类。配套Image来获奖获得的数据转成Bitmap
<ol>/*
封装成了Observable对象。
*/
public class ImageReaderAvailableObservable extends Observable {
public static ImageReaderAvailableObservable of(ImageReader imageReader) {
return new ImageReaderAvailableObservable(imageReader, null);
}
public static ImageReaderAvailableObservable of(ImageReader imageReader,Handler handler) {
return new ImageReaderAvailableObservable(imageReader, handler);
}
private final ImageReader imageReader;
private final Handler handler;
private ImageReaderAvailableObservable(ImageReader imageReader, Handler handler) {
this.imageReader = imageReader;
this.handler = handler;
}
@Override
protected void subscribeActual(Observer
页:
[1]