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