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 pylib
import screenshot
15 from pylib
.device
import device_errors
16 from pylib
.device
import device_utils
18 def _PrintMessage(heading
, eol
='\n'):
19 sys
.stdout
.write('%s%s' % (heading
, eol
))
23 def _CaptureScreenshot(device
, host_file
):
24 host_file
= device
.TakeScreenshot(host_file
)
25 _PrintMessage('Screenshot written to %s' % os
.path
.abspath(host_file
))
28 def _CaptureVideo(device
, host_file
, options
):
29 size
= tuple(map(int, options
.size
.split('x'))) if options
.size
else None
30 recorder
= screenshot
.VideoRecorder(device
,
31 megabits_per_second
=options
.bitrate
,
33 rotate
=options
.rotate
)
36 _PrintMessage('Recording. Press Enter to stop...', eol
='')
40 host_file
= recorder
.Pull(host_file
)
41 _PrintMessage('Video written to %s' % os
.path
.abspath(host_file
))
46 parser
= optparse
.OptionParser(description
=__doc__
,
47 usage
='screenshot.py [options] [filename]')
48 parser
.add_option('-d', '--device', metavar
='ANDROID_DEVICE', help='Serial '
49 'number of Android device to use.', default
=None)
50 parser
.add_option('-f', '--file', help='Save result to file instead of '
51 'generating a timestamped file name.', metavar
='FILE')
52 parser
.add_option('-v', '--verbose', help='Verbose logging.',
54 video_options
= optparse
.OptionGroup(parser
, 'Video capture')
55 video_options
.add_option('--video', help='Enable video capturing. Requires '
56 'Android KitKat or later', action
='store_true')
57 video_options
.add_option('-b', '--bitrate', help='Bitrate in megabits/s, '
58 'from 0.1 to 100 mbps, %default mbps by default.',
59 default
=4, type='float')
60 video_options
.add_option('-r', '--rotate', help='Rotate video by 90 degrees.',
61 default
=False, action
='store_true')
62 video_options
.add_option('-s', '--size', metavar
='WIDTHxHEIGHT',
63 help='Frame size to use instead of the device '
64 'screen size.', default
=None)
65 parser
.add_option_group(video_options
)
67 (options
, args
) = parser
.parse_args()
70 parser
.error('Too many positional arguments.')
71 host_file
= args
[0] if args
else options
.file
74 logging
.getLogger().setLevel(logging
.DEBUG
)
76 devices
= device_utils
.DeviceUtils
.HealthyDevices()
78 device
= next((d
for d
in devices
if d
== options
.device
), None)
80 raise device_errors
.DeviceUnreachableError(options
.device
)
83 parser
.error('Multiple devices are attached. '
84 'Please specify device serial number with --device.')
85 elif len(devices
) == 1:
88 raise device_errors
.NoDevicesError()
91 _CaptureVideo(device
, host_file
, options
)
93 _CaptureScreenshot(device
, host_file
)
97 if __name__
== '__main__':