其实手机本来就有这样一个功能,android叫投射屏幕,ios叫AirPlay。android的投射屏幕,只能是整张屏,不能自定义区域;
AirPlay的技术不够成熟,经常找不到设备。有点跑题,主旨是下面要实现和上面提到的类似效果的一种方式,无意吐槽。

同样是工作需要,需要实现这样一种效果。我的思路是截取视图区域,建立Socket,发送字节流。

代码如下:

privateButtonbtn;privateintcount=0;privateTimerbtnTimer=null;privateTimercutTimer=null;privateSocketsocket=null;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn=(Button)findViewById(R.id.main_btn);btn.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){if(btnTimer==null){btnTimer=newTimer();btnTimer.schedule(newTimerTask(){@Overridepublicvoidrun(){handler.sendEmptyMessage(0);}},0,1000/100);projection(btn);}else{cutTimer.cancel();cutTimer=null;btnTimer.cancel();btnTimer=null;if(socket!=null){try{socket.close();}catch(IOExceptione){e.printStackTrace();}finally{socket=null;}}}}});}

一些包装类:

/*/***投影View视图*@paramview*/publicvoidprojection(finalViewview){newThread(){publicvoidrun(){try{cutTimer=newTimer();TimerTasktask=newTimerTask(){@Overridepublicvoidrun(){try{//这里有问题!(应该保持一个socket)服务器端没有想到好的识别文件结尾的方法所以使用了一帧一个连接socket=newSocket("192.168.5.159",5000);sendBitmap(socket,printScreen(view));}catch(Exceptione){e.printStackTrace();}}};//1秒10帧cutTimer.schedule(task,0,1000/10);}catch(Exceptione){e.printStackTrace();}};}.start();}/***截取decorView视图区域的屏幕显示*@paramdecorView*@return*/publicBitmapprintScreen(ViewdecorView){decorView.setDrawingCacheEnabled(true);decorView.buildDrawingCache();//可以不写,getDrawingCache()时会调用该方法returndecorView.getDrawingCache();};/***向服务器发送图片字节流*@paramsocket*@parambitmap*@throwsException*/publicvoidsendBitmap(Socketsocket,Bitmapbitmap)throwsException{ByteArrayOutputStreambitout=newByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG,100,bitout);DataOutputStreamout=newDataOutputStream(socket.getOutputStream());out.write(bitout.toByteArray());out.flush();out.close();}

服务器端应该就是ServerSocket 解析出图片,依然,我不管服务器端,简单写了如下测试代码

publicclassSocketServer{publicstaticvoidmain(String[]args)throwsException{Socketsocket=null;ServerSocketserverSocket=newServerSocket(5000);for(inti=0;;i++){socket=serverSocket.accept();DataInputStreamin=newDataInputStream(socket.getInputStream());//应该显示出去这里做测试生成了文件FileOutputStreamout=newFileOutputStream(newFile("D://cut_"+i+".jpg"));byte[]buf=newbyte[1024];intlen=0;while((len=in.read(buf))!=-1){//如果要使用一个socket的话,应该加入判断解析出每一个文件out.write(buf,0,len);}out.flush();out.close();}}}

大致如此,个人想法,可能有好的解决方案,洗耳恭听。

更多相关文章

  1. 多个Android客户端同步服务器端表中数据架构分析
  2. View视图框架源码分析之一:android是如何创建一个view
  3. 4种Android屏幕自适应解决方案
  4. Android:实现TabWidget选项卡按钮在屏幕下方
  5. Android屏幕亮度调节
  6. android 是否是平板屏幕——至少约720x960 DP的单位
  7. android dialog宽度无法填满屏幕解决方案

随机推荐

  1. u-boot-2010.09-rc2 移植 6410 笔记之一
  2. 隐式启动Activity 报ActivityNotFoundExc
  3. Android中位图缩放
  4. 获取Android 手机屏幕宽度和高度以及获取
  5. android namespace 、样式、主题 (二)
  6. android webview 使用详细介绍
  7. Android Studio导入项目时出现,弹框说SDK
  8. android录制视频流程
  9. android中改变标题栏的背景色
  10. Android如何查找应用中调用的系统资源