其实手机原本就有这样一个功能,android叫投射屏幕,ios叫AirPlay。android的投射屏幕,只能是整张屏,不能自定义区域;
AirPlay的技术不够成熟,常常找不到设备。有点跑题,主旨是下面要实现和上面提到的相似效果的一种方式,无心吐槽。java
一样是工做须要,须要实现这样一种效果。个人思路是截取视图区域,创建Socket,发送字节流。android
代码以下:ios
private Button btn; private int count = 0; private Timer btnTimer = null; private Timer cutTimer = null; private Socket socket = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.main_btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(btnTimer==null){ btnTimer = new Timer(); btnTimer.schedule(new TimerTask() { @Override public void run() { handler.sendEmptyMessage(0); } }, 0,1000/100); projection(btn); }else { cutTimer.cancel(); cutTimer = null; btnTimer.cancel(); btnTimer =null; if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); }finally{ socket = null; } } } } }); }
一些包装类:服务器
/* /** * 投影View视图 * @param view */ public void projection(final View view){ new Thread() { public void run() { try { cutTimer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { try { //这里有问题!(应该保持一个socket)服务器端 没有想到好的识别文件结尾的方法 因此使用了一帧一个链接 socket = new Socket("192.168.5.159", 5000); sendBitmap(socket,printScreen(view)); } catch (Exception e) { e.printStackTrace(); } } }; //1秒10帧 cutTimer.schedule(task, 0, 1000/10); } catch (Exception e) { e.printStackTrace(); } }; }.start(); } /** * 截取decorView视图区域的屏幕显示 * @param decorView * @return */ public Bitmap printScreen(View decorView) { decorView.setDrawingCacheEnabled(true); decorView.buildDrawingCache();//能够不写,getDrawingCache()时会调用该方法 return decorView.getDrawingCache(); }; /** * 向服务器发送图片字节流 * @param socket * @param bitmap * @throws Exception */ public void sendBitmap(Socket socket,Bitmap bitmap) throws Exception { ByteArrayOutputStream bitout = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bitout); DataOutputStream out = new DataOutputStream(socket.getOutputStream()); out.write(bitout.toByteArray()); out.flush(); out.close(); }
服务器端应该就是ServerSocket 解析出图片,依然,我无论服务器端,简单写了以下测试代码socket
public class SocketServer { public static void main(String[] args) throws Exception { Socket socket = null; ServerSocket serverSocket = new ServerSocket(5000); for (int i = 0;; i++) { socket = serverSocket.accept(); DataInputStream in = new DataInputStream(socket.getInputStream()); //应该显示出去 这里作测试生成了文件 FileOutputStream out = new FileOutputStream(new File("D://cut_" + i + ".jpg")); byte[] buf = new byte[1024]; int len = 0; while ((len = in.read(buf)) != -1) { //若是要使用一个socket的话,应该加入判断 解析出每个文件 out.write(buf, 0, len); } out.flush(); out.close(); } } }
大体如此,我的想法,可能有好的解决方案,洗耳恭听。ide