package com.scan.demo;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.DialogInterface.OnClickListener;
import android.device.scanner.configuration.Constants;
import android.device.scanner.configuration.PropertyID;
import android.device.scanner.configuration.Symbology;
import android.device.scanner.configuration.Triggering;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.device.ScanManager;
import android.preference.CheckBoxPreference;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.util.HashMap;
import java.util.Map;
/**
* ScanManagerDemo
*
* @author shenpidong
* @effect Introduce the use of android.device.ScanManager
* @date 2020-03-06
* @description , Steps to use ScanManager:
* 1.Obtain an instance of BarCodeReader with ScanManager scan = new ScanManager().
* 2.Call openScanner to power on the barcode reader.
* 3.After that, the default output mode is TextBox Mode that send barcode data to the focused text box. User can check the output mode using getOutputMode and set the output mode using switchOutputMode.
* 4.Then, the default trigger mode is manually trigger signal. User can check the trigger mode using getTriggerMode and set the trigger mode using setTriggerMode.
* 5.If necessary, check the current settings using getParameterInts or set the scanner configuration properties PropertyID using setParameterInts.
* 6.To begin a decode session, call startDecode. If the configured PropertyID.WEDGE_KEYBOARD_ENABLE is 0, your registered broadcast receiver will be called when a successful decode occurs.
* 7.If the output mode is intent mode, the captured data is sent as an implicit Intent. An application interestes in the scan data should register an action as android.intent.ACTION_DECODE_DATA broadcast listerner.
* 8.To get a still image through an Android intent. Register the "scanner_capture_image_result" broadcast reception image, trigger the scan to listen to the result output and send the "action.scanner_capture_image" broadcast request to the scan service to output the image.
* 9.Call stopDecode to end the decode session.
* 10.Call closeScanner to power off the barcode reader.
* 11.Can set parameters before closing the scan service.
*/
public class ScanManagerDemo extends AppCompatActivity {
private static final String TAG = "ScanManagerDemo";
private static final boolean DEBUG = true;
private static final String ACTION_DECODE = ScanManager.ACTION_DECODE; // default action
private static final String ACTION_DECODE_IMAGE_REQUEST = "action.scanner_capture_image";
private static final String ACTION_CAPTURE_IMAGE = "scanner_capture_image_result";
private static final String BARCODE_STRING_TAG = ScanManager.BARCODE_STRING_TAG;
private static final String BARCODE_TYPE_TAG = ScanManager.BARCODE_TYPE_TAG;
private static final String BARCODE_LENGTH_TAG = ScanManager.BARCODE_LENGTH_TAG;
private static final String DECODE_DATA_TAG = ScanManager.DECODE_DATA_TAG;
private static final String DECODE_ENABLE = "decode_enable";
private static final String DECODE_TRIGGER_MODE = "decode_trigger_mode";
private static final String DECODE_TRIGGER_MODE_HOST = "HOST";
private static final String DECODE_TRIGGER_MODE_CONTINUOUS = "CONTINUOUS";
private static final String DECODE_TRIGGER_MODE_PAUSE = "PAUSE";
private static String DECODE_TRIGGER_MODE_CURRENT = DECODE_TRIGGER_MODE_HOST;
private static final int DECODE_OUTPUT_MODE_INTENT = 0;
private static final int DECODE_OUTPUT_MODE_FOCUS = 1;
private static int DECODE_OUTPUT_MODE_CURRENT = DECODE_OUTPUT_MODE_FOCUS;
private static final String DECODE_OUTPUT_MODE = "decode_output_mode";
private static final String DECODE_CAPTURE_IMAGE_KEY = "bitmapBytes";
private static final String DECODE_CAPTURE_IMAGE_SHOW = "scan_capture_image";
private EditText showScanResult = null;
private Button mScan = null;
private LinearLayout mHome = null;
private FrameLayout mFlagment = null;
private MenuItem settings = null;
private ImageView mScanImage = null;
private ScanManager mScanManager = null;
private static boolean mScanEnable = true;
private static boolean mScanSettingsView = false;
private static boolean mScanCaptureImageShow = false;
private static boolean mScanBarcodeSettingsMenuBarcodeList = false;
private static boolean mScanBarcodeSettingsMenuBarcode = false;
private FrameLayout mScanSettingsMenuBarcodeList = null;
private FrameLayout mScanSettingsMenuBarcode = null;
private ScanSettingsBarcode mScanSettingsBarcode = null;
private SettingsBarcodeList mSettingsBarcodeList = null;
;
private static Map<String, BarcodeHolder> mBarcodeMap = new HashMap<String, BarcodeHolder>();
private static final int MSG_SHOW_SCAN_RESULT = 1;
private static final int MSG_SHOW_SCAN_IMAGE = 2;
private ScanSettingsFragment mScanSettingsFragment = new ScanSettingsFragment();
private static final int[] SCAN_KEYCODE = {520, 521, 522, 523};
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
LogI("onReceive , action:" + action);
// Get Scan Image . Make sure to make a request before getting a scanned image
if (ACTION_CAPTURE_IMAGE.equals(action)) {
byte[] imagedata = intent.getByteArrayExtra(DECODE_CAPTURE_IMAGE_KEY);
if (imagedata != null && imagedata.length > 0) {
Bitmap bitmap = BitmapFactory.decodeByteArray(imagedata, 0, imagedata.length);
Message msg = mHandler.obtainMessage(MSG_SHOW_SCAN_IMAGE);
msg.obj = bitmap;
mHandler.sendMessage(msg);
} else {
LogI("onReceive , ignore imagedata:" + imagedata);
}
} else {
// Get scan results, including string and byte data etc.
byte[] barcode = intent.getByteArrayExtra(DECODE_DATA_TAG);
int barcodeLen = intent.getIntExtra(BARCODE_LENGTH_TAG, 0);
byte temp = intent.getByteExtra(BARCODE_TYPE_TAG, (byte) 0);
String barcodeStr = intent.getStringExtra(BARCODE_STRING_TAG);
if (mScanCaptureImageShow) {
// Request images of this scan
context.sendBroadcast(new Intent(ACTION_DECODE_IMAGE_REQUEST));