terça-feira, 10 de maio de 2011

Screenshot de dispositivo Android via app Java

Olá povo,

Todos devem saber que é possível tirar um screenshot da tela de um aparelho Android através da perspectiva DDMS do Eclipse. Uma outra alternativa é executar a aplicação DDMS a partir do diretório tools do Android SDK. Entretanto, hoje no trabalho eu precisei obter um screenshot de um dispositivo Android programaticamente, ou seja, via código, e exibir essa imagem na tela.

Para fazer isso, podemos utilizar as bibliotecas do DDMS que estão no diretório tools/lib do SDK do Android. Para tirar um screenshot da tela do aparelho utilizaremos o arquivo ddmlib.jar. Copie esse arquivo para o seu projeto e adicione-o ao classpath.

A primeira coisa que devemos fazer é criar uma classe que implemente IDeviceChangeListener, e implementar 3 métodos: deviceChanged(IDevice device, int what), deviceConnected(IDevice device) e deviceDisconnected(IDevice device).
No método deviceConnected devemos guardar a referência de IDevice, é com ela que obteremos o screenshot da tela. Mas antes devemos registrar a classe para capturar a imagem da tela que será capturada.

AndroidDebugBridge.init(false);
AndroidDebugBridge.createBridge();
AndroidDebugBridge.addDeviceChangeListener(
instancia_de_IDeviceChangeListener);

No meu caso, estou usando uma tela SWT. Para tirar um screenshot e carregar na tela, utilizei o código abaixo:

RawImage raw;
try {
raw = device.getScreenshot();
PaletteData pal = new PaletteData(
0xFF00, 0xFF0000, 0xFF000000);
ImageData image = new ImageData(
raw.width, raw.height, raw.bpp,
pal, 1, raw.data);

ImageLoader loader = new ImageLoader();
loader.data = new ImageData[] { image };
loader.save("imagem.png", SWT.IMAGE_PNG);

lblImagem.setImage(new Image(
Display.getCurrent(), "imagem.png"));

} catch (TimeoutException e) {
e.printStackTrace();
} catch (AdbCommandRejectedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


O resultado pode ser observado abaixo:


Referência:
http://blog.codetastrophe.com/2008/12/using-androiddebugbridge-api-to-get.html

4br4ç05,
nglauber

2 comentários:

bheeshma disse...

Hi,

Can I use this code to take the screenshots of the device from another application and while it is not connected to computer and i snot rooted?

Nelson Glauber disse...

Hi Bheeshma,

The code above uses the same API used in the ADT plugin for Eclipse. The JAR can be found at Android_SDK_dir/tools/lib.
If you want a screen shot of an application from the yours, I think this is not the best choice. I've worked on a project that take a screenshot of itself, the Android's View class allow it. But If you got it the same behavior from another app, please tell me.

regards,
nglauber