摘要:代碼獲取設(shè)備列表信息獲取設(shè)備列表信息超時(shí)獲取所有已連接設(shè)備根據(jù)獲取單個(gè)當(dāng)前設(shè)備不存在序號(hào)為的設(shè)備請(qǐng)檢查連接獲取當(dāng)前屏幕圖像的字節(jié)數(shù)據(jù)保存圖像字節(jié)數(shù)據(jù)保存當(dāng)前屏幕對(duì)象將當(dāng)前屏幕圖像數(shù)據(jù)保存為圖片橫屏尺寸處理發(fā)生異常為空
需求部分代碼思路來(lái)源于互聯(lián)網(wǎng)
之前一直在尋找一種完美的移動(dòng)設(shè)備屏幕流回傳方案,這種嘗試一旦成功即可運(yùn)用于多種平臺(tái),比如云端測(cè)試Portal中對(duì)機(jī)器設(shè)備屏幕的實(shí)時(shí)監(jiān)控,再輔以html5強(qiáng)大的特性,可以直接在web上模擬手機(jī)操作,達(dá)到"遠(yuǎn)程監(jiān)控"的目的,本demo的部分思路來(lái)源于互聯(lián)網(wǎng),我嘗試用jython全部重寫了一遍,這種方式實(shí)現(xiàn)起來(lái)雖然比較"土鱉",但是效果基本可以符合需求,下面是效果圖和代碼清單。
代碼#!/usr/bin/env python # -*- coding:utf-8 -*- # Android_ScreenSream by Archer # Based on Jython,ddmlib #import jar import sys,os sys.path.append(r"C:ddmlib.jar") sys.path.append(r"C:guava17.jar") sys.path.append(r"C: t.jar") from threading import Thread #import lib from java.awt.image import * from java.io import * from javax.imageio import * from com.android.ddmlib import * from time import sleep class AndroidScreenStream(object): def __init__(self): super(AndroidScreenStream,self).__init__() self.devices=[] self.currentdevice=None self.rawimgdata=None self.rawscreen=None def wait_device_lists(self,bridge): """獲取設(shè)備列表信息""" count=0 while(bridge.hasInitialDeviceList()==False): try: sleep(0.5) count+=1 except: pass if(count>60): print "獲取設(shè)備列表信息超時(shí)!" break def get_devices(self): """獲取所有已連接設(shè)備""" AndroidDebugBridge.init(False) mybridge=AndroidDebugBridge.createBridge() self.wait_device_lists(mybridge) #get self.devices.append(mybridge.getDevices()) return self def get_device_by_index(self,index): """根據(jù)index獲取單個(gè)當(dāng)前設(shè)備""" AndroidDebugBridge.init(False) mybridge=AndroidDebugBridge.createBridge() self.wait_device_lists(mybridge) #get try: self.currentdevice=mybridge.getDevices()[index] return self except IndexError: print "不存在序號(hào)為"+str(index)+"的設(shè)備,請(qǐng)檢查USB連接!" sys.exit() def get_current_screen_imgbyes(self): """獲取當(dāng)前屏幕圖像的字節(jié)數(shù)據(jù)""" self.rawimgdata=self.currentdevice.getScreenshot().data #保存圖像字節(jié)數(shù)據(jù) return self def get_current_rawscreen(self): """保存當(dāng)前屏幕screen對(duì)象""" self.rawscreen=self.currentdevice.getScreenshot() return self def save_screen_img(self,path=os.path.join(os.getcwd(),"current_frame.jpeg"),islandscape=False): """將當(dāng)前屏幕圖像數(shù)據(jù)保存為圖片""" if self.rawscreen is not None: landscape=islandscape #橫屏尺寸處理 imgwidth=self.rawscreen.height if landscape else self.rawscreen.width imgheight=self.rawscreen.width if landscape else self.rawscreen.height image=BufferedImage(imgwidth,imgheight,BufferedImage.TYPE_INT_RGB) if image.getHeight()!=imgheight or image.getWidth()!=imgwidth: image=BufferedImage(imgwidth,imgheight,BufferedImage.TYPE_INT_RGB) index=0 indexInc=self.rawscreen.bpp>>3 for y in range(self.rawscreen.height): for x in range(self.rawscreen.width): value=self.rawscreen.getARGB(index) if landscape: image.setRGB(y,self.rawscreen.width-x-1,value) else: image.setRGB(x,y,value) index+=indexInc try: ImageIO.write(image,"JPEG",File(path)) except IOError: print "發(fā)生異常!" sys.exit() else: print "rawscreen為空!" sys.exit() if __name__=="__main__": ASS=AndroidScreenStream() ShotDevice=ASS.get_device_by_index(0) while True: ShotDevice.get_current_rawscreen().save_screen_img()Github
Android_Screen_Stream
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37413.html
摘要:通過(guò)安裝的會(huì)提示移除自帶的版本,除非你忽略這個(gè),但同時(shí)又會(huì)帶來(lái)一系列的安裝問(wèn)題,由于的某些默認(rèn)會(huì)加載,故經(jīng)常導(dǎo)致的不能啟動(dòng)問(wèn)題可以嘗試用一句話解決。查看出錯(cuò)信息首先通過(guò)安裝接著直接,這個(gè)時(shí)候就可以成功了,順利啟動(dòng)。 通過(guò)brew安裝的python會(huì)提示移除mac os自帶的python版本,除非你忽略這個(gè)warning,但同時(shí)又會(huì)帶來(lái)一系列package的安裝問(wèn)題,由于xcode...
摘要:首先是直接通過(guò)調(diào)用代碼。先寫個(gè)代碼文件,它位于盤中,其完整代碼如下該代碼接受兩個(gè)命令行參數(shù),然后輸出一個(gè)乘法算式。 ??對(duì)于一個(gè)數(shù)據(jù)分析方面的工作者來(lái)說(shuō),最熟悉的語(yǔ)言無(wú)疑就是Python了。對(duì)于軟件開(kāi)發(fā)者而言,Java又是極其重要的工具。那么,一個(gè)很自然的問(wèn)題就是,我們能夠在Java中調(diào)用Python代碼嗎???想要在Java中調(diào)用Python代碼,有以下兩個(gè)辦法: 直接通過(guò)Runt...
摘要:首先是直接通過(guò)調(diào)用代碼。先寫個(gè)代碼文件,它位于盤中,其完整代碼如下該代碼接受兩個(gè)命令行參數(shù),然后輸出一個(gè)乘法算式。 ??對(duì)于一個(gè)數(shù)據(jù)分析方面的工作者來(lái)說(shuō),最熟悉的語(yǔ)言無(wú)疑就是Python了。對(duì)于軟件開(kāi)發(fā)者而言,Java又是極其重要的工具。那么,一個(gè)很自然的問(wèn)題就是,我們能夠在Java中調(diào)用Python代碼嗎???想要在Java中調(diào)用Python代碼,有以下兩個(gè)辦法: 直接通過(guò)Runt...
摘要:寫東西快但是生態(tài)廣比如大數(shù)據(jù)雖然好但是利用不到的整個(gè)的生態(tài)的代碼雖然也好但是畢竟有些庫(kù)需要自己寫的多雖然也很簡(jiǎn)單但是查文檔也很麻煩那么問(wèn)題來(lái)了最簡(jiǎn)單的的方式就是直接把打包那么問(wèn)題又來(lái)了打包成挺麻煩的官方文檔看不懂答案有了寫了個(gè)包搞這個(gè)事情 py 寫東西快 但是java 生態(tài)廣 比如大數(shù)據(jù) py 雖然好 但是利用不到j(luò)ava的整個(gè)的生態(tài)的代碼 scala 雖然也好但是畢竟 有些庫(kù) ...
摘要:寫東西快但是生態(tài)廣比如大數(shù)據(jù)雖然好但是利用不到的整個(gè)的生態(tài)的代碼雖然也好但是畢竟有些庫(kù)需要自己寫的多雖然也很簡(jiǎn)單但是查文檔也很麻煩那么問(wèn)題來(lái)了最簡(jiǎn)單的的方式就是直接把打包那么問(wèn)題又來(lái)了打包成挺麻煩的官方文檔看不懂答案有了寫了個(gè)包搞這個(gè)事情 py 寫東西快 但是java 生態(tài)廣 比如大數(shù)據(jù) py 雖然好 但是利用不到j(luò)ava的整個(gè)的生態(tài)的代碼 scala 雖然也好但是畢竟 有些庫(kù) ...
閱讀 3322·2023-04-25 19:42
閱讀 1346·2021-11-23 10:11
閱讀 2290·2021-11-16 11:51
閱讀 1603·2019-08-30 15:54
閱讀 2050·2019-08-29 18:44
閱讀 1628·2019-08-23 18:24
閱讀 502·2019-08-23 17:52
閱讀 1780·2019-08-23 15:33