Qr-code

Ae galera, blz?

Estou desenvolvendo uma aplicação para leitura de um qr-code. Estou utilizando a API QR-CODE http://qrcode.sourceforge.jp/

Ela parece ser muito boa. Peguei o exemplo dela e tentei desmembrar pra entender. Por que no exemplo ele pega a imagem direto da camera, mas no sistema vou pegar a foto e salvar, para mais tarde ler.

:shock: O problema que não estou conseguindo captar a idéia do exemplo, será que alguma alma caridosa ( :? rsrsrsrsrs) pode me ajudar a entender?
Pelo menos me dar uma linha de raciocino pra seguir? O que me perdi mesmo foi na classe DisplayCanvas, acho que to vendo esse código a tanto tempo que ficou tudo igual.
:lol:
Valew

Segue exemplo:

package CODE;

import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.control.VideoControl;
import javax.microedition.midlet.MIDlet;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;
import jp.sourceforge.qrcode.exception.DecodingFailedException;
import jp.sourceforge.qrcode.geom.Line;
import jp.sourceforge.qrcode.geom.Point;
import jp.sourceforge.qrcode.util.DebugCanvas;

// Example of QRCodeDecoderMIDletExample QR Code reader application

public class QRCodeDecoderMIDletExample extends MIDlet{
	private CameraCanvas cameraCanvas = null;
	private DisplayCanvas displayCanvas = null;
	private DecodedTextBox decodedTextBox = null;
	public QRCodeDecoderMIDletExample() {}
	
	public void startApp() {
		Displayable current = Display.getDisplay(this).getCurrent();
		if (current == null) {
			cameraCanvas = new CameraCanvas(this);
			displayCanvas = new DisplayCanvas(this);
			decodedTextBox = new DecodedTextBox(this);
			Display.getDisplay(this).setCurrent(cameraCanvas);
			cameraCanvas.start();
		} else {
			if (current == cameraCanvas) {
				cameraCanvas.start();
			}
			Display.getDisplay(this).setCurrent(current);
		}
		
	}
	public void pauseApp() {
		if (Display.getDisplay(this).getCurrent() == cameraCanvas)  {
			cameraCanvas.stop();
		}
	}
	public void destroyApp(boolean b) {
		if (Display.getDisplay(this).getCurrent() == cameraCanvas) {
			cameraCanvas.stop();
		}
	}
	private void exitRequested() {
		destroyApp(false);
		notifyDestroyed();
	}
	void cameraCanvasExit() {
		exitRequested();
	}
	void cameraCanvasCaptured(byte[] pngData) {
		cameraCanvas.stop();
		displayCanvas.setImage(pngData);
		Display.getDisplay(this).setCurrent(displayCanvas);
		Image image = Image.createImage(pngData, 0, pngData.length);
		// TODO Uncomment below for demo on emulator
		try { image = Image.createImage("/qrcode.jpg"); } catch (IOException ioe) {}
		QRCodeDecoder decoder = new QRCodeDecoder();
		QRCodeDecoder.setCanvas(displayCanvas);
		try {
			decodedTextBox.setDecodedString(new String(decoder.decode(new J2MEImage(image))));
		} catch (DecodingFailedException dfe) {
			displayCanvas.println("Decoding failed");
			displayCanvas.println("("+dfe.getMessage()+")");
			displayCanvas.println("--------");
			return;
		}
		displayCanvas.println("--------");
		displayCanvas.addViewDecodedStringCommand();
	}
	void displayCanvasBack() {
		Display.getDisplay(this).setCurrent(cameraCanvas);
		cameraCanvas.start();
	}
	void decodedTextBoxBack() {
		Display.getDisplay(this).setCurrent(displayCanvas);
	}
	void toDecodedTextBox() {
		Display.getDisplay(this).setCurrent(decodedTextBox);
	}
}

class CameraCanvas extends Canvas implements CommandListener {
	private final QRCodeDecoderMIDletExample midlet;
	private final Command exitCommand;
	private Command captureCommand = null;
	private Player player = null;
	private VideoControl videoControl = null;
	
	private boolean active = false;
	
	private String message1 = null;
	private String message2 = null;
	
	
	public CameraCanvas(QRCodeDecoderMIDletExample midlet) {
		this.midlet = midlet;
		exitCommand = new Command("Exit", Command.EXIT, 1);
		addCommand(exitCommand);
		setCommandListener(this);
		try {
			player = Manager.createPlayer("capture://video");
			player.realize();
			videoControl = (VideoControl)player.getControl("VideoControl");
			if (videoControl == null) {
				discardPlayer();
				message1 = "Unsupported:";
				message2 = "Can't get video control";
			} else {
				videoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);
				captureCommand = new Command("Capture", Command.SCREEN, 1);
				addCommand(captureCommand);
				
			}
		} catch (IOException ioe) {
			discardPlayer();
			message1 = "IOException:";
			message2 = ioe.getMessage();
		} catch (MediaException me) {
			discardPlayer();
			message1 = "MediaException:";
			message2 = me.getMessage();
		} catch (SecurityException se) {
			discardPlayer();
			message1 = "SecurityException";
			message2 = se.getMessage();
		}
		
	}
	private void discardPlayer() {
		if (player != null) {
			player.close();
			player = null;
		}
		videoControl = null;
	}
	public void paint(Graphics g) {
		g.setColor(0xFFFFFF);
		g.fillRect(0, 0, getWidth(), getHeight());
		if (message1 != null) {
			g.setColor(0x000000);
			g.drawString(message1, 1, 1, Graphics.TOP | Graphics.LEFT);
			g.drawString(message2, 1, 1 + g.getFont().getHeight(), Graphics.TOP | Graphics.LEFT);
		}
	}
	synchronized void start() {
		if ((player != null) && !active) {
			try {
				player.start();
				videoControl.setVisible(true);
			} catch (MediaException me) {
				message1 = "Media exception:";
				message2 = me.getMessage();
			} catch (SecurityException se) {
				message1 = "SecurityException";
				message2 = se.getMessage();
			}
			active = true;
			
		}
	}
	synchronized void stop() {
		if ((player != null) && active) {
			try {
				videoControl.setVisible(false);
				player.stop();
			} catch (MediaException me) {
				message1 = "MediaException:";
				message2 = me.getMessage();
			}
			active = false;
		}
	}
	public void commandAction(Command c, Displayable d) {
		if (c == exitCommand) {
			midlet.cameraCanvasExit();
		} else if (c == captureCommand) {
			takeSnapshot();
		}
	}
	public void keyPressed(int keyCode) {
		if (getGameAction(keyCode) == FIRE) {
			takeSnapshot();
		}
	}
	private void takeSnapshot() {
		if (player != null) {
			try {
				byte[] pngImage = videoControl.getSnapshot(null);
				midlet.cameraCanvasCaptured(pngImage);
			} catch (MediaException me) {
				message1 = "MediaException;";
				message2 = me.getMessage();
			}
				
		}
	}
}

class DisplayCanvas extends Canvas implements CommandListener, DebugCanvas {
	private final QRCodeDecoderMIDletExample midlet;
	private Image image = null;
	private Command viewDecodedStringCommand = null;
	private String[] log = null;
	private int numCols;
	private int numRows;
	Font logFont = null;
	DisplayCanvas(QRCodeDecoderMIDletExample midlet) {
		this.midlet = midlet;
		addCommand(new Command("Camera", Command.BACK, 1));
		setCommandListener(this);
		logFont = Font.getDefaultFont();
		numRows = this.getHeight() / logFont.getHeight();
		numCols = this.getWidth() / logFont.charWidth('_');
		log = new String[numRows];
	}
	public void paint(Graphics g) {
		g.setColor(0xFFFFFF);
		g.fillRect(0, 0, getWidth(), getHeight());
		if (image != null) {
			g.drawImage(image, getWidth()/2, getHeight()/2, Graphics.VCENTER | Graphics.HCENTER);
		}
		g.setColor(0x000000);
		for (int i = 0; i < log.length; i++) {
			if (log[i] != null) {
				g.drawString(log[i], 0, i*logFont.getHeight(), Graphics.TOP|Graphics.LEFT);
				
			}
		}
	}
	void setImage(byte[] pngImage) {
		image = Image.createImage(pngImage, 0, pngImage.length);
	}
	void addViewDecodedStringCommand() {
		if (viewDecodedStringCommand == null) {
			viewDecodedStringCommand = new Command("Result", Command.SCREEN, 1);
			addCommand(viewDecodedStringCommand);
		}
	}
	public void commandAction(Command c, Displayable d) {
		if (c == viewDecodedStringCommand) {
			midlet.toDecodedTextBox();
		} else {
			midlet.displayCanvasBack();
		}
	}
	public void drawCross(Point point, int color) {
		Image bufImage = Image.createImage(image.getWidth(), image.getHeight());
		Graphics g = bufImage.getGraphics();
		g.drawImage(image, 0, 0, 0);
		g.setColor(color);
		g.drawLine(point.getX()-5, point.getY(), point.getX()+5, point.getY());
		g.drawLine(point.getX(), point.getY()-5, point.getX(), point.getY()+5);
		image = bufImage;
		repaint();	
	}
	public void drawLine(Line line, int color) {
		Image bufImage = Image.createImage(image.getWidth(), image.getHeight());
		Graphics g = bufImage.getGraphics();
		g.drawImage(image, 0, 0, 0);
		g.setColor(color);
		g.drawLine(line.getP1().getX(), line.getP1().getY(), 
				line.getP2().getX(), line.getP2().getY());
		image = bufImage;
		repaint();
	}
	public void drawLines(Line[] lines, int color) {
		Image bufImage = Image.createImage(image.getWidth(), image.getHeight());
		Graphics g = bufImage.getGraphics();
		g.drawImage(image, 0, 0, 0);
		g.setColor(color);
		
		for (int i = 0; i < lines.length - 1; i++) {
			g.drawLine(lines[i].getP1().getX(), lines[i].getP1().getY(), 
					lines[i].getP2().getX(), lines[i].getP2().getY());
		}
		image = bufImage;
		repaint();
	}
	public void drawMatrix(boolean[][] matrix) {
		Image bufImage = Image.createImage(image.getWidth(), image.getHeight());
		Graphics g = bufImage.getGraphics();
		g.setColor(0xCCCCCC);
		for (int y = 0; y < matrix[0].length; y++) {
			for (int x = 0; x < matrix.length; x++) {
				if (matrix[x][y] == true)
					g.drawLine(x, y, x+1, y);
			}
		}
		image = bufImage;
		repaint();
	}
	public void drawPoint(Point point, int color) {
/*		Image bufImage = Image.createImage(image.getWidth(), image.getHeight());
		Graphics g = bufImage.getGraphics();
		g.drawImage(image, 0, 0, 0);
		g.setColor(color);
		g.drawLine(point.getX(), point.getY(),
				point.getX()+1, point.getY());
		image = bufImage;
		repaint();*/
	}
	public void drawPoints(Point[] points, int color) {		
		Image bufImage = Image.createImage(image.getWidth(), image.getHeight());
		Graphics g = bufImage.getGraphics();
		g.drawImage(image, 0, 0, 0);
		g.setColor(color);
		for (int i = 0; i < points.length - 1; i++) {
			g.drawLine(points[i].getX(), points[i].getY(),
					points[i].getX()+1, points[i].getY());
		}
		image = bufImage;
		repaint();
	}
	public void drawPolygon(Point[] points, int color) {
		Image bufImage = Image.createImage(image.getWidth(), image.getHeight());
		Graphics g = bufImage.getGraphics();
		g.drawImage(image, 0, 0, 0);
		g.setColor(color);
		int i = 0;
		for (; i < points.length - 1; i++) {
			g.drawLine(points[i].getX(), points[i].getY(), points[i+1].getX(), points[i+1].getY());
		}
		g.drawLine(points[i].getX(), points[i].getY(), points[0].getX(), points[0].getY());
		image = bufImage;
		repaint();		
	}
	public void println(String message) {
		System.out.println(message);
		int numParts = message.length() / numCols;
		if (message.length() % numCols > 0) {
			numParts += 1;
		}
		String[] lineStrings = new String[numParts];
		int offset = 0;
		for (int i = 0; i < numParts - 1; i++) {
			lineStrings[i] = message.substring(offset, offset+numCols);
			offset += numCols;
		}
		lineStrings[numParts - 1] = message.substring(offset);
		int numLoggedLine = 0;
		if (log[log.length - numParts] == null) {
			for (int i = 0; i < log.length; i++) {
				if (log[i] == null) {
					log[i] = lineStrings[numLoggedLine];
					numLoggedLine += 1;
					if (numLoggedLine == lineStrings.length)
						break;
				}
			}
		} else {
			int i;
			for (i = 0; i < log.length - numParts; i++) {
				log[i] = log[i+numParts];
			}
			
			for (int start = i; i < log.length; i++) {
				log[i] = lineStrings[i - start];
			}
				
		}
		repaint();
	}
}

class DecodedTextBox extends TextBox implements CommandListener {
	QRCodeDecoderMIDletExample midlet;
	public DecodedTextBox(QRCodeDecoderMIDletExample midlet) {
		super("Decoded String", "", 2048, TextField.ANY);
		this.midlet = midlet;
		addCommand(new Command("Back", Command.BACK, 1));
		setCommandListener(this);
	}
	public void setDecodedString(String decodedString) {
		this.setString(decodedString);
	}
	public void commandAction(Command c, Displayable d) {
		midlet.decodedTextBoxBack();
	}
}

class J2MEImage implements QRCodeImage {
	Image image;
	int[] intImage;
	public J2MEImage(Image image) {
		this.image = image;
		intImage = new int[image.getWidth()*image.getHeight()];
		image.getRGB(this.intImage, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight());
	}
	public int getHeight() {
		return image.getHeight();
	}
	public int getWidth() {
		return image.getWidth();
	}
	public int getPixel(int x, int y) {
		return intImage[x + y*image.getWidth()];
	}
}