数字化教学平台安卓版中“教师锁屏”需求的设计与实现

背景

在课堂中,教师点击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组播。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值