【Android】手机端的投射

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

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

代码如下:

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 解析出图片,依然,我不管服务器端,简单写了如下测试代码

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();
  }
 }
}

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

你可能感兴趣的:(android,socket,dean,投射屏幕)