Java tutorial
package ch.hackzurich.migrozept; import java.net.URL; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.Toast; import ch.hackzurich.migrozept.util.APIWorker; 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 { public static String EXTRA_MESSAGE; // The main object for recognizing a displaying barcodes. private ScanditSDK mBarcodePicker; private Button mButton = null; // 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 = "--place your Scandit SDK key here --"; /* TODO: get API Key out of AndroidManifest (doesn't work yet, somehow) Context _context = getApplicationContext(); ApplicationInfo ai = _context.getPackageManager().getApplicationInfo(_context.getPackageName(),PackageManager.GET_META_DATA); ai.metaData.get("sCanditSdkAppKey"); */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // We keep the screen on while the scanner is running. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 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; mBarcodePicker.getOverlayView().setBeepEnabled(false); // Register listener, in order to be notified about relevant events // (e.g. a successfully scanned bar code). mBarcodePicker.getOverlayView().addListener(this); // Set all settings according to the settings activity. Normally there will be no settings // activity for the picker and you just hardcode the setting your app needs. SettingsActivity.setSettingsForPicker(this, mBarcodePicker); } /** * 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); } } Log.i("custom", "Send Barcode to API " + cleanedBarcode); String url = "http://hackzurich14.herokuapp.com/api/" + cleanedBarcode + "?recipes=1"; try { new APIWorker(this).execute(new URL(url)); } catch (Exception e) { //showAlert("Exception",e.toString()); showToast("API Worker call Exception"); } mButton = new Button(this); mButton.setTextColor(Color.WHITE); mButton.setTextSize(30); mButton.setGravity(Gravity.CENTER); mButton.setBackgroundColor(0xFF000000); mButton.setText("Scanned " + symbology + " code:\n\n" + cleanedBarcode + "\n"); ((RelativeLayout) mBarcodePicker).addView(mButton, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); mBarcodePicker.pauseScanning(); // TODO: go to recipe overview mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mBarcodePicker.resumeScanning(); ((RelativeLayout) mBarcodePicker).removeView(mButton); mButton = null; } }); mButton.requestFocus(); // 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 result) { // Example code that would typically be used in a real-world app using // the Scandit SDK. // Stop recognition to save resources. mBarcodePicker.stopScanning(); Intent intent = new Intent(this, RecipeListActivity.class); intent.putExtra(EXTRA_MESSAGE, result); startActivity(intent); //Toast.makeText(this, "User entered: " + entry, Toast.LENGTH_LONG).show(); } public void didCancel() { mBarcodePicker.stopScanning(); finish(); } @Override public void onBackPressed() { mBarcodePicker.stopScanning(); finish(); } /* Notifications / Alerts */ public void showToast(String txt) { Context context = getApplicationContext(); CharSequence text = txt; int duration = 10; Toast toast = Toast.makeText(context, text, duration); toast.show(); } }