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 android_commands
15 from pylib
import screenshot
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
.old_interface
.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
,
32 megabits_per_second
=options
.bitrate
,
34 rotate
=options
.rotate
)
37 _PrintMessage('Recording. Press Enter to stop...', eol
='')
41 host_file
= recorder
.Pull()
42 _PrintMessage('Video written to %s' % os
.path
.abspath(host_file
))
47 parser
= optparse
.OptionParser(description
=__doc__
,
48 usage
='screenshot.py [options] [filename]')
49 parser
.add_option('-d', '--device', metavar
='ANDROID_DEVICE', help='Serial '
50 'number of Android device to use.', default
=None)
51 parser
.add_option('-f', '--file', help='Save result to file instead of '
52 'generating a timestamped file name.', metavar
='FILE')
53 parser
.add_option('-v', '--verbose', help='Verbose logging.',
55 video_options
= optparse
.OptionGroup(parser
, 'Video capture')
56 video_options
.add_option('--video', help='Enable video capturing. Requires '
57 'Android KitKat or later', action
='store_true')
58 video_options
.add_option('-b', '--bitrate', help='Bitrate in megabits/s, '
59 'from 0.1 to 100 mbps, %default mbps by default.',
60 default
=4, type='float')
61 video_options
.add_option('-r', '--rotate', help='Rotate video by 90 degrees.',
62 default
=False, action
='store_true')
63 video_options
.add_option('-s', '--size', metavar
='WIDTHxHEIGHT',
64 help='Frame size to use instead of the device '
65 'screen size.', default
=None)
66 parser
.add_option_group(video_options
)
68 (options
, args
) = parser
.parse_args()
71 logging
.getLogger().setLevel(logging
.DEBUG
)
73 if not options
.device
and len(android_commands
.GetAttachedDevices()) > 1:
74 parser
.error('Multiple devices are attached. '
75 'Please specify device serial number with --device.')
78 parser
.error('Too many positional arguments.')
79 host_file
= args
[0] if args
else options
.file
80 device
= device_utils
.DeviceUtils(options
.device
)
83 _CaptureVideo(device
, host_file
, options
)
85 _CaptureScreenshot(device
, host_file
)
89 if __name__
== '__main__':