Created
February 17, 2012 17:53
-
-
Save di/1854611 to your computer and use it in GitHub Desktop.
The whole screenshot class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.File; | |
import java.io.IOException; | |
import com.android.ddmlib.AndroidDebugBridge; | |
import com.android.ddmlib.IDevice; | |
import com.android.ddmlib.RawImage; | |
import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener; | |
import java.awt.Dimension; | |
import java.awt.image.BufferedImage; | |
import javax.imageio.ImageIO; | |
public class Screenshot implements IDeviceChangeListener { | |
private static boolean mConnected = false; | |
public static void main(String[] args) { | |
try { | |
// Create the Android Debug Bridge | |
AndroidDebugBridge.init(false); | |
AndroidDebugBridge adb = AndroidDebugBridge.createBridge(); | |
// Add an instance of this class as a device change listener | |
// so we know when a device is connected | |
Screenshot ss = new Screenshot(); | |
AndroidDebugBridge.addDeviceChangeListener(ss); | |
System.out.print("Waiting for device connection...\n"); | |
// wait until something happens | |
synchronized (ss) { | |
ss.wait(); | |
} | |
// Get the list of connected devices | |
IDevice[] devices = adb.getDevices(); | |
if(devices.length > 0) { | |
// Take a screenshot of the first connected device | |
getScreenshots(ss, devices[0]); | |
} | |
System.out.print("Done\n"); | |
} catch (InterruptedException e) { | |
} finally { | |
// Close the Android Debug Bridge | |
AndroidDebugBridge.terminate(); | |
} | |
} | |
private static void getScreenshots(Screenshot ss, IDevice device) { | |
// Get the device's serial #, which we'll use for the directory | |
String thisDevice = device.getSerialNumber(); | |
String dir = String.format("%s", thisDevice); | |
// Set up the directory | |
if (new File(dir).exists()){ | |
System.out.printf("Writing files to an existing directory %s\n", dir); | |
} else if (new File(dir).mkdir() == false) { | |
System.out.printf("Couldn't create directory %s\n", dir); | |
return; | |
} else { | |
System.out.printf("Writing files to directory %s\n", dir); | |
} | |
if (mConnected) { | |
RawImage raw = null; | |
try { | |
raw = device.getScreenshot(); | |
} catch (IOException e) { | |
System.out.printf("Error getting image: %s\n", e.getMessage()); | |
} | |
Boolean landscape = false; | |
BufferedImage image = null; | |
Dimension size = new Dimension(); | |
int width2 = landscape ? raw.height : raw.width; | |
int height2 = landscape ? raw.width : raw.height; | |
if (image == null) { | |
image = new BufferedImage(width2, height2, | |
BufferedImage.TYPE_INT_RGB); | |
size.setSize(image.getWidth(), image.getHeight()); | |
} else { | |
if (image.getHeight() != height2 || image.getWidth() != width2) { | |
image = new BufferedImage(width2, height2, | |
BufferedImage.TYPE_INT_RGB); | |
size.setSize(image.getWidth(), image.getHeight()); | |
} | |
} | |
int index = 0; | |
int indexInc = raw.bpp >> 3; | |
for (int y = 0; y < raw.height; y++) { | |
for (int x = 0; x < raw.width; x++, index += indexInc) { | |
int value = raw.getARGB(index); | |
if (landscape) | |
image.setRGB(y, raw.width - x - 1, value); | |
else | |
image.setRGB(x, y, value); | |
} | |
} | |
String filename = String.format("%s%soutput.png", dir, File.separator); | |
try { | |
ImageIO.write(image, "png", new File(filename)); | |
System.out.printf("Saved picture as %s\n", filename); | |
} catch (IOException e) { | |
System.out.println("Failed to find png writer"); | |
} | |
} | |
} | |
@Override | |
public void deviceConnected(IDevice device) { | |
System.out.printf("Device %s connected\n", device.getSerialNumber()); | |
mConnected = true; | |
synchronized (this) { | |
notify(); | |
} | |
} | |
@Override | |
public void deviceDisconnected(IDevice device) { | |
System.out.printf("Device %s disconnected\n", device.getSerialNumber()); | |
mConnected = false; | |
synchronized (this) { | |
notify(); | |
} | |
} | |
@Override | |
public void deviceChanged(IDevice device, int changeMask) { | |
// don't care | |
} | |
} |
Why is there if (image == null)
statement on line #84? Is not that image
variable always null up to that point?
thank you so much for this. It really helped me out :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
For what reason do you have
size
variable in your source code? It is not used anywhere actually.