Maybe 发表于 2018-5-8 10:22:20

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]
查看完整版本: Android PC投屏简单尝试