There are many ways to take a screen shot on Android device. One simple way to capture the screen on Galaxy Nexus is to simultaneously press and hold
Power
and
Volume Down
buttons. The image will be saved in a "Screenshot" directory and accessible via Gallery.
Quite often, however, I need to copy the captured image over to my computer. Usually, I do this with
One method is to use
Not bad, but seems like there's some room for improvement.
Information provided by
Luckily, I wasn't the first person looking into this issue . Apparently, adb shell is performing an EOL (end-of-line) character conversion, from LF (line feed, ' \n ', 0x0A ) to CR+LF (carriage return followed by line feed, ' \r\n ', 0x0D0A ).
If that sounds familiar, that's because I've dealt with this before . Unfortunately, this time we're working with binary data, so using
The solution is to use sed search and replace as follows:
Unfortunately, I found that sed fix while works on Ubuntu doesn't work on OS X. This solution using perl handles binary search and replace better:
Now we have a one-liner that grabs a screen shot from the Android device and stores directly on the computer executing the command. Beautiful.
Quite often, however, I need to copy the captured image over to my computer. Usually, I do this with
adb pull
command, but if I'm going to use CLI to retrieve the file, why don't I take the screen shot with it as well?
One method is to use
screencap
command via
adb shell
like so:
adb shell screencap -p /sdcard/screen.png adb pull /sdcard/screen.png adb shell rm /sdcard/screen.png
Not bad, but seems like there's some room for improvement.
Information provided by
screencap -h
indicates that screen shot can be sent to
stdout
, but running
adb shell screencap -p > screen.png
results in seemingly corrupt file.
Luckily, I wasn't the first person looking into this issue . Apparently, adb shell is performing an EOL (end-of-line) character conversion, from LF (line feed, ' \n ', 0x0A ) to CR+LF (carriage return followed by line feed, ' \r\n ', 0x0D0A ).
If that sounds familiar, that's because I've dealt with this before . Unfortunately, this time we're working with binary data, so using
tr -d '\r'
command to remove all
0x0D
will likely corrupt it by also removing bytes that aren't part of the
0x0D0A
sequence. We want to only remove carriage return characters when they are followed by a line feed.
The solution is to use sed search and replace as follows:
adb shell screencap -p | sed 's/\r$//' > screen.png
Unfortunately, I found that sed fix while works on Ubuntu doesn't work on OS X. This solution using perl handles binary search and replace better:
adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen.png
Now we have a one-liner that grabs a screen shot from the Android device and stores directly on the computer executing the command. Beautiful.
本文详细介绍了如何利用adb shell screencap命令在Android设备上截取屏幕截图,并通过改进sed或perl命令解决EOL字符转换导致的文件损坏问题。最终提供了一个一镜式的命令实现从设备直接保存到计算机。

被折叠的 条评论
为什么被折叠?



