【Android】手机端的投射
生活随笔
收集整理的這篇文章主要介紹了
【Android】手机端的投射
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
其實手機本來就有這樣一個功能,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; @Overrideprotected?void?onCreate(Bundle?savedInstanceState)?{super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn?=?(Button)?findViewById(R.id.main_btn);btn.setOnClickListener(new?View.OnClickListener()?{@Overridepublic?void?onClick(View?v)?{if(btnTimer==null){btnTimer?=?new?Timer();btnTimer.schedule(new?TimerTask()?{@Overridepublic?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()?{@Overridepublic?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();}} }大致如此,個人想法,可能有好的解決方案,洗耳恭聽。
轉載于:https://my.oschina.net/u/1422723/blog/395853
總結
以上是生活随笔為你收集整理的【Android】手机端的投射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MIS开发迭代1
- 下一篇: Android中垃圾回收日志信息