开发者

screenshots with monkeyrunner on Android

I'm using this following script to take screenshots:

def snap():
    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
    print "Waiting for device.."
    device = MonkeyRunner.waitForConnection()
    print "Device found.."
    result = device.takeSnapshot()
    print "Clicked.."
    now = datetime.datetime.now()
    file = "C:\\Workspace\\"+now.strftime("%d%m%Y-%H%M%S")+".png"
    result.writeToFile(file,'png')
    print file

I've put this in a while loop and it works fine for one screenshot. But after that one screensh开发者_开发知识库ot, the output hangs like this infintely:

C:\Program Files\Android\android-sdk\tools>monkeyrunner C:\Workspace\snap.py
Click (y/n)?y
User said: y
Calling function..
Waiting for device..
Device found..
Clicked..
C:\Workspace\19042011-155124.png
Click (y/n)?y
User said: y
Calling function..
Waiting for device..

How do I keep the code from blocking up and keep taking screenshots? Is this a device-memory issue?


Move device = MonkeyRunner.waitForConnection() out of the loop and keep the connection with your device open.


To force disconnection you may kill the process. Not elegant but there's no way of closing the connection from monkeyrunner.

...
pid = int(filter(lambda p: len(p) == 9 and p[8] == 'com.android.commands.monkey', map(lambda l: l.split(), device.shell('ps').splitlines()))[0][1])
print "killing %s" % pid
device.shell("kill %d" % pid)
device = None
...


I would rather use adb pull command from shell in monkeyrunner script like this

 
os.system('adb pull /dev/graphics/fb0 image')
subprocess.call('ffmpeg -vframes 1 -vcodec rawvideo -loglevel quiet -f  rawvideo -pix_fmt rgba -s 480x854 -i image -f image2 -vcodec png image.png')

Note: It uses ffmpeg to convert raw data to png file. FFMPEG should be in path
This was done because often takesnapshot() API runs exception.
480x854 is the device resolution, change it according to your device.
By this method I am able to take series of snapshots.

If you are hell bent on device.takesnapshot() try adding time.sleep() in between, it may help.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜