Java tutorial
package org.peaklabs.consumer; import android.content.Intent; import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; import android.support.v4.app.NavUtils; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.SearchView; import android.text.InputType; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.Window; import android.view.WindowManager; import android.widget.Toast; 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 Escanea extends ActionBarActivity implements ScanditSDKListener { SearchView searchView; private ScanditSDK mBarcodePicker; private SoundPool soundpool; public static final String sScanditSdkAppKey = "3ALkJg1+EeON5rdicdtqdgSzA8XWxLj5NpuyYLUin1k"; private int idBeep; private boolean loaded = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Initialize and start the bar code recognition. initializeAndStartBarcodeScanning(); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowTitleEnabled(true); actionBar.setTitle(getResources().getString(R.string.scan)); soundpool = new SoundPool(5, AudioManager.STREAM_NOTIFICATION, 0); soundpool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { loaded = true; } }); idBeep = soundpool.load(this, R.raw.beep, 1); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu2, menu); MenuItem searchItem = menu.findItem(R.id.entrada_manual); searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setQueryHint(getResources().getString(R.string.entrada_manual)); searchView.setInputType(InputType.TYPE_CLASS_NUMBER); final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextChange(String newText) { // Do something return true; } @Override public boolean onQueryTextSubmit(String query) { String barcode = searchView.getQuery().toString(); mBarcodePicker.stopScanning(); Intent intent = new Intent(Escanea.this, BuscaProducto.class); intent.putExtra("barcode", barcode); startActivity(intent); finish(); return true; } }; searchView.setOnQueryTextListener(queryTextListener); return super.onCreateOptionsMenu(menu); // true -> el men ya est visible } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: mBarcodePicker.stopScanning(); //Intent intent = NavUtils.getParentActivityIntent(this); //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //NavUtils.navigateUpTo(this,intent); finish(); return true; } return super.onOptionsItemSelected(item); } @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); } } if (loaded) { soundpool.play(idBeep, 1, 1, 1, 0, 1); } mBarcodePicker.stopScanning(); Intent intent = new Intent(this, BuscaProducto.class); intent.putExtra("barcode", cleanedBarcode); startActivity(intent); finish(); } /** * 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(); } }