【Android】手機端的投射

其實手機原本就有這樣一個功能,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

相關文章
相關標籤/搜索