3 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
7 """Takes a screenshot or a screen video capture from an Android device."""
14 from devil
.android
import device_blacklist
15 from devil
.android
import device_errors
16 from devil
.android
import device_utils
17 from pylib
import screenshot
19 def _PrintMessage(heading
, eol
='\n'):
20 sys
.stdout
.write('%s%s' % (heading
, eol
))
24 def _CaptureScreenshot(device
, host_file
):
25 host_file
= device
.TakeScreenshot(host_file
)
26 _PrintMessage('Screenshot written to %s' % os
.path
.abspath(host_file
))
29 def _CaptureVideo(device
, host_file
, options
):
30 size
= (tuple(int(i
) for i
in options
.size
.split('x')) if options
.size
32 recorder
= screenshot
.VideoRecorder(device
,
33 megabits_per_second
=options
.bitrate
,
35 rotate
=options
.rotate
)
38 _PrintMessage('Recording. Press Enter to stop...', eol
='')
42 host_file
= recorder
.Pull(host_file
)
43 _PrintMessage('Video written to %s' % os
.path
.abspath(host_file
))
48 parser
= optparse
.OptionParser(description
=__doc__
,
49 usage
='screenshot.py [options] [filename]')
50 parser
.add_option('-d', '--device', metavar
='ANDROID_DEVICE', help='Serial '
51 'number of Android device to use.', default
=None)
52 parser
.add_option('--blacklist-file', help='Device blacklist JSON file.')
53 parser
.add_option('-f', '--file', help='Save result to file instead of '
54 'generating a timestamped file name.', metavar
='FILE')
55 parser
.add_option('-v', '--verbose', help='Verbose logging.',
57 video_options
= optparse
.OptionGroup(parser
, 'Video capture')
58 video_options
.add_option('--video', help='Enable video capturing. Requires '
59 'Android KitKat or later', action
='store_true')
60 video_options
.add_option('-b', '--bitrate', help='Bitrate in megabits/s, '
61 'from 0.1 to 100 mbps, %default mbps by default.',
62 default
=4, type='float')
63 video_options
.add_option('-r', '--rotate', help='Rotate video by 90 degrees.',
64 default
=False, action
='store_true')
65 video_options
.add_option('-s', '--size', metavar
='WIDTHxHEIGHT',
66 help='Frame size to use instead of the device '
67 'screen size.', default
=None)
68 parser
.add_option_group(video_options
)
70 (options
, args
) = parser
.parse_args()
73 parser
.error('Too many positional arguments.')
74 host_file
= args
[0] if args
else options
.file
77 logging
.getLogger().setLevel(logging
.DEBUG
)
79 blacklist
= (device_blacklist
.Blacklist(options
.blacklist_file
)
80 if options
.blacklist_file
83 devices
= device_utils
.DeviceUtils
.HealthyDevices(blacklist
)
85 device
= next((d
for d
in devices
if d
== options
.device
), None)
87 raise device_errors
.DeviceUnreachableError(options
.device
)
90 parser
.error('Multiple devices are attached. '
91 'Please specify device serial number with --device.')
92 elif len(devices
) == 1:
95 raise device_errors
.NoDevicesError()
98 _CaptureVideo(device
, host_file
, options
)
100 _CaptureScreenshot(device
, host_file
)
104 if __name__
== '__main__':