Cosc 5/4730 Blackberry and Andriod QR codes What is QR code? • A QR code (abbreviated from Quick Response code) is a type of matrix barcode (or two-dimensional code) first designed for the automotive industry. • More recently, the system has become popular outside of the industry due to its fast readability and large storage capacity compared to traditional UPC barcodes. • The code consists of black modules arranged in a square pattern on a white background. • The information encoded can be made up of four standardized kinds ("modes") of data (numeric, alphanumeric, byte/binary, Kanji), or by supported extensions virtually any kind of data From Wikipedia, http://en.wikipedia.org/wiki/QR_code Anatomy of a QR code QR app’s • The Main api for QR codes comes from the ZXing (“Zebra Crossing”). • Which is part of google.com code • http://code.google.com/p/zxing/ • Blackberry supports the APIs directly in the com.google.zxing, since API 6.0.0 • Android does not have any built-in API (for it’s own code…). Instead you need to install the barcode Scanner apk (in the market and on the zxing website) – Version 3.72 (as of Jan 25, 2012) Creating QR codes • You can use XYing website to create QR code • http://zxing.appspot.com/generator/ QR code BLACKBERRY QR codes • Uses the com.google.zxing packages. – Allows you to create QR very quickly and easily. – You can also scan for QR codes • Uses the camera and viewfinder, so some what complex if you don’t already under the camera calls. Creating/displaying the QR code. • First delcare a QRCode variable QRCode qrCode = new QRCode(); • This encodes the text with a low level (%7) of error correction Encoder.encode(barcodeTextField.getText(), ErrorCorrectionLevel.L, qrCode); • Where barcodeTextField is a the text to encode in the QRcode • From there we get the actual data matrix and convert it into a bitmap ByteMatrix barcode = qrCode.getMatrix(); Bitmap bitmap = BarcodeBitmap.createBitmap(barcode, BARCODE_WIDTH); – Where BARCODE_WIDTH is a constant 300. • Now display the barcode in a bitmapField barcodeField.setBitmap(bitmap); Scanning a QR code. • Requires use of the camera. – So if you’ll need to back to get camera lecture for a lot of the information about what is going on with the viewfinder. – We create a BarcodeScanner and BarcodeDecoder • The decoder is feed to the scanner as well as “hints” • We provide this information to the viewfinder as well to find the QR code automatically. – IE the camera will focus, etc and “take the picture”. Coding it up. • First we create a hashtable to hold all of the hints that we can give the API about how we want to scan a barcode to improve speed and accuracy. Hashtable hints = new Hashtable(); • The first thing going in is a list of formats. We could look for more than one at a time, but it's much slower. Vector formats = new Vector(); formats.addElement(BarcodeFormat.QR_CODE); – This is where we would add other formats to look for. hints.put(DecodeHintType.POSSIBLE_FORMATS, formats); • We will also use the "TRY_HARDER" flag to make sure we get an accurate scan hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); • We create a new decoder using those hints BarcodeDecoder decoder = new BarcodeDecoder(hints); Coding it up. (2) • Finally we can create the actual scanner with a decoder and a listener that will handle the data stored in the barcode. We put that in our view screen to handle the display. scanner = new BarcodeScanner(decoder, new MyBarcodeDecoderListener() ); barcodeScreen = new MyBarcodeScannerViewScreen(scanner); • Once we get here, all the barcode scanning infrastructure should be set up, so all we have to do is start the scan and display the viewfinder scanner.startScan(); theApp.pushScreen(barcodeScreen); //the viewfinder screen BarcodeDecoderListener • The listener is call when a the QR code has been decoded with the text string. class MyBarcodeDecoderListener implements BarcodeDecoderListener { public void barcodeDecoded(final String rawText) { //close the viewfinder //and decide what to do with the rawText //like launch a browser if it’s an http://… } } You can use BB qrDemo code • Which is located here: • The res/img has a demo barcode img file for the simulator QR code ANDROID First • You will need to install the BarcodeScannerX.apk into the simulator – And download it first of course. – Adb.exe install BarcodeScanner3.72.apk – We’ll use intents to call it. • It should noted, you can also import their code and then it looks a lot like the Blackberry code. – We are not covering this Encoding. • Create the intent and call the activity. • So for a simple one, text encoding. Intent intent = new Intent( "com.google.zxing.client.android.ENCODE"); intent.putExtra("ENCODE_TYPE", “TEXT_TYPE”); intent.putExtra("ENCODE_DATA", “http://www.cs.uwyo.edu); startActivity(intent); • The encoded QR will show on the screen. Scanning • Again, create an intent, but we’ll need a result. Intent intent = new Intent( "com.google.zxing.client.android.SCAN"); intent.putExtra("com.google.zxing.client.android.SCAN. SCAN_MODE", "QR_CODE_MODE"); startActivityForResult(intent, 0); Scanning (2) • Add the onActivityResult method if (requestCode == 0) { //code used to call Scanner. if (resultCode == RESULT_OK) { String contents = intent.getStringExtra("SCAN_RESULT"); String format = intent.getStringExtra( "SCAN_RESULT_FORMAT"); // Handle successful scan } else if (resultCode == RESULT_CANCELED) { // Handle cancel } } All well and good, EXCEPT • What happens if the BarcodeScanner app is not installed? – FORCE CLOSE! • But there is code to handle it. – xying has two java class you can add to your project. • IntentIntegrator.java and IntentResult.java IntentIntegrator • It checks to make sure the app is installed. – If not, then it asks the user to get it from the Market. • Now you code doesn’t force close. Create with the Integrator • We call the integrator code, we included in the project IntentIntegrator integrator = new IntentIntegrator( qrDemoActivity.this); • Where qrDemoActivity is the name of your activity. integrator.shareText(“http://www.cs.uwyo.edu” ); • Again shows the qrCode or an error message if there is a problem with the text. Scan with the Integrator • Same idea as creating, but again we need a result IntentIntegrator integrator = new IntentIntegrator(qrDemoActivity.this); – Where qrDemoActivity is the name of your activity. integrator.initiateScan( IntentIntegrator.QR_CODE_TYPES); • And wait for the result in onActivityResult Scan with the Integrator (2) • In the onActivityResult method //code to handle the intentintegrator, then IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (scanResult != null) { // handle scan result String contents = scanResult.getContents(); if (contents != null) { logthis("[II] Scan result is "+ scanResult.toString()); } else { logthis("[II] Scan failed or canceled"); } } //handle the other result codes as needed. You can use Android qrDemo code • Which is located here: refrences • http://zxing.appspot.com/generator • http://code.google.com/p/zxing/ • http://supportforums.blackberry.com/t5/JavaDevelopment/How-to-use-the-Barcode-API/tap/574569 • http://devblog.blackberry.com/2010/10/barcode -api/ • http://stackoverflow.com/questions/9795501/ho w-do-i-use-zxings-qr-barcode-scanner-withintentintegrator-and-intentresult Q&A