背景
在课堂中,教师点击PAD上的锁屏按钮后,其屏幕图像要同步传送到所有学生PAD上,教师PAD屏幕有任何变化,所有学生都要实时看到。同时,学生不能操作PAD,不能退出,只能被动观看,一直到教师解锁。
一、如何获取Android设备屏幕的图像
因为flash的问题,Android版本要在4.2.2以下,因此不能使用Android 5.0的录屏功能。考虑过的方案如下:
方案1:使用View.getDrawingCache()方法。
缺陷:不能获取flash的显示内容,不能获取视频播放窗口的内容。否决。
方案2: 获取root权限之后,访问底层显示设备framebuffer.
缺陷: 和硬件设备关联性极大,无法统一处理,比如有些设备是/dev/graphics/fb0,但三星的却是一堆/dev/graphics/fb0, /dev/graphics/fb1, /dev/graphics/fb2, … /dev/graphics/fb11,每个fbx只是一部份屏幕,还需要拼起来。否决。
方案3: 获取root权限之后,使用系统命令screencap来捕获屏幕
screencap作为系统提供的工具,在各种硬件平台上都可以获得一副完整的屏幕拷贝。问题是screencap使用方式一般以文件形式输出到sdcard,性能太低,如何解决性能问题?
方法是使用linux的管道,程序直接从stdout读取screencap的输出,没有写文件读文件这个过程。核心代码如下:
Process proc = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(proc.getOutputStream());
os.writeBytes("screencap\n");//
os.flush();
InputStream scrData = proc.getInputStream();
最后采用此方案。
二、如何传输屏幕数据到所有学生PAD
使用UDP广播,避免一份数据在网络上发送多次。
三、如何禁止学生对PAD操作
理论上是无法禁止的,但可以采用下面的变通方式:
学生PAD在接收数据包的过程中,每收到一次数据就进行下面的操作:
Intent = new Intent(context, LockActivity.class);
Intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
ActivityManager am = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE);
am.moveTaskToFront(LockActivity.getTaskId(), 0);
效果是虽然学生可以按HOME键退出,但5s之后程序会自动弹出,再次显示锁屏图片。
四、理想的解决方案
流媒体、直播。
IP组播。