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 de Vasconcelos Leal 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