Java tutorial
package com.mirasense.demos; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; import android.R.string; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; import android.widget.Toast; import android.content.Intent; import org.json.JSONException; import org.json.JSONObject; import com.mirasense.scanditsdk.ScanditSDKAutoAdjustingBarcodePicker; import com.mirasense.scanditsdk.interfaces.ScanditSDK; import com.mirasense.scanditsdk.interfaces.ScanditSDKListener; /** * Simple Activity illustrating how to embed the Scandit SDK. * * Important information for the developer with respect to Android 2.1 support! * * Android 2.1 differs from subsequent versions of Android OS in that it * does not offer a camera preview mode in portrait mode (landscape only). * Android 2.2+ offers both - a camera preview in landscape mode and in portrait * mode. There are certain devices that run Android 2.2+ but do not properly * implement the methods needed for a portrait camera view. * * To address this difference between the Android versions, the Scandit SDK * offers the following approaches and the developer needs to choose his * preferred option: * * If you are showing the scanner on the full screen in a new Activity: * * - Instantiate the ScanditSDKAutoAdjustingBarcodePicker which will choose * whether to use the new or legacy picker. * * If you want to show the picker inside a view hierarchy/cropped/scaled you * have to make the distinction between the different pickers yourself. Fore * devices that don't support the new picker the following options exist: * * - a scan view in landscape mode scanning only(!) that is fully * customizable by the developer - ScanditSDKBarcodePicker.class * * - our own custom scan view with portrait mode scanning that offers only * limited customization options (show/hide title & tool bars, * but no additional Android UI elements) - LegacyPortraitScanditSDKBarcodePicker.class * * For devices that do support the new picker the following options exist: * * - a scan view with portrait mode scanning that is fully customizable * by the developer (RECOMMENDED) - ScanditSDKBarcodePicker.class * * - any of the options listed under Android 2.1 * * We recommend that developers choose the scan view in portrait mode on Android 2.2. * It has the native Android look&feel and provides full customization. We provide our * own custom scan view (LegacyPortraitScanditSDKBarcodePicker.class) in Android 2.1 * to provide backwards compatibility with Android 2.1. * * To integrate the Scandit SDK, carry out the following three steps: * * 1. Create a BarcodePicker object that manages camera access and * bar code scanning: * * e.g. * ScanditSDKBarcodePicker barcodePicker = new ScanditSDKBarcodePicker(this, * R.raw.class, "your app key", true, ScanditSDKBarcodePicker.LOCATION_PROVIDED_BY_SCANDIT_SDK); * * 2. Add it to the activity: * my_activity.setContentView(barcodePicker); * * 3. Implement the ScanditSDKListener interface (didCancel, didScanBarcode, * didManualSearch) and register with the ScanditSDKOverlayView to receive * callbacks: * barcodePicker.getOverlayView().addListener(this); * * * If you want to use the custom scan view for scanning in portrait mode in * Android 2.1, instantiate the LegacyPortraitScanditSDKBarcodePicker * class (as shown in the example below). There is utility method available * to determine whenever the default portrait scan view is not available * ScanditSDKBarcodePicker.canRunPortraitPicker(). * * * * Copyright 2010 Mirasense AG * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied * See the License for the specific language governing premissions and * limitations under the License. */ public class ScanditSDKSampleBarcodeActivity extends Activity implements ScanditSDKListener { // The main object for recognizing a displaying barcodes. private ScanditSDK mBarcodePicker; // Enter your Scandit SDK App key here. // Your Scandit SDK App key is available via your Scandit SDK web account. public static final String sScanditSdkAppKey = "yf4/yP2JEeKV+6b0D6tgABfon7j+/LuJFmyxUheCNT4"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Initialize and start the bar code recognition. initializeAndStartBarcodeScanning(); } @Override protected void onPause() { // When the activity is in the background immediately stop the // scanning to save resources and free the camera. mBarcodePicker.stopScanning(); super.onPause(); } @Override protected void onResume() { // Once the activity is in the foreground again, restart scanning. mBarcodePicker.startScanning(); super.onResume(); } /** * Initializes and starts the bar code scanning. */ public void initializeAndStartBarcodeScanning() { // Switch to full screen. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); // We instantiate the automatically adjusting barcode picker that will // choose the correct picker to instantiate. Be aware that this picker // should only be instantiated if the picker is shown full screen as the // legacy picker will rotate the orientation and not properly work in // non-fullscreen. ScanditSDKAutoAdjustingBarcodePicker picker = new ScanditSDKAutoAdjustingBarcodePicker(this, sScanditSdkAppKey, ScanditSDKAutoAdjustingBarcodePicker.CAMERA_FACING_BACK); // Add both views to activity, with the scan GUI on top. setContentView(picker); mBarcodePicker = picker; // Register listener, in order to be notified about relevant events // (e.g. a successfully scanned bar code). mBarcodePicker.getOverlayView().addListener(this); // show search bar in scan user interface mBarcodePicker.getOverlayView().showSearchBar(true); // In the old version, the title and tool bar can be hidden as follows: //mBarcodePicker.getOverlayView().showTitleBar(false); //mBarcodePicker.getOverlayView().showToolBar(false); // To activate recognition of 2d codes mBarcodePicker.setQrEnabled(true); mBarcodePicker.setDataMatrixEnabled(true); } /** * Called when a barcode has been decoded successfully. * * @param barcode Scanned barcode content. * @param symbology Scanned barcode symbology. */ public void didScanBarcode(String barcode, String symbology) { // Remove non-relevant characters that might be displayed as rectangles // on some devices. Be aware that you normally do not need to do this. // Only special GS1 code formats contain such characters. String cleanedBarcode = ""; for (int i = 0; i < barcode.length(); i++) { if (barcode.charAt(i) > 30) { cleanedBarcode += barcode.charAt(i); } } //Toast.makeText(this, symbology + ": " + cleanedBarcode, 10000).show(); String url = "http://www.upcdatabase.org/api/json/4479274fffb01ad4c237b03c37ca1253/" + cleanedBarcode; System.out.println(url); JSONObject json = null; try { json = readJsonFromUrl(url); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(json.toString()); try { String request = json.get("description").toString(); System.out.println(request); if (request.isEmpty()) { request = json.get("itemname").toString(); System.out.println(request); } System.out.println(request); request = request.replaceAll(" ", "_"); System.out.println(request); url = "http://flyeronfire.com/ottawa/deals/" + request; System.out.println(url); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Example code that would typically be used in a real-world app using // the Scandit SDK. /* // Access the image in which the bar code has been recognized. byte[] imageDataNV21Encoded = barcodePicker.getCameraPreviewImageOfFirstBarcodeRecognition(); int imageWidth = barcodePicker.getCameraPreviewImageWidth(); int imageHeight = barcodePicker.getCameraPreviewImageHeight(); // Stop recognition to save resources. mBarcodePicker.stopScanning(); */ } /** * Called when the user entered a bar code manually. * * @param entry The information entered by the user. */ public void didManualSearch(String entry) { // Example code that would typically be used in a real-world app using // the Scandit SDK. Toast.makeText(this, "User entered: " + entry, 10000).show(); } @Override public void didCancel() { mBarcodePicker.stopScanning(); finish(); } @Override public void onBackPressed() { mBarcodePicker.stopScanning(); finish(); } private static String readAll(Reader rd) throws IOException { StringBuilder sb = new StringBuilder(); int cp; while ((cp = rd.read()) != -1) { sb.append((char) cp); } return sb.toString(); } public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { InputStream is = new URL(url).openStream(); try { BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); String jsonText = readAll(rd); JSONObject json = new JSONObject(jsonText); return json; } finally { is.close(); } } }