diff --git a/.idea/encodings.xml b/.idea/encodings.xml index f50231d..21b26fd 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -7,8 +7,6 @@ - - diff --git a/app/build.gradle b/app/build.gradle index 0ac67eb..ea68322 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,6 +61,7 @@ android { }*/ } dependencies { + compileOnly 'com.symbol:emdk:+' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.2.1' implementation 'com.google.code.gson:gson:2.6.2' diff --git a/app/libs/DataCollection.jar b/app/libs/DataCollection.jar new file mode 100644 index 0000000..1f01b16 Binary files /dev/null and b/app/libs/DataCollection.jar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fd6646d..f4fff2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + + @@ -38,6 +40,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/chaoran/business/activity/MainActivity.java b/app/src/main/java/chaoran/business/activity/MainActivity.java index f5c9091..e80f7c8 100644 --- a/app/src/main/java/chaoran/business/activity/MainActivity.java +++ b/app/src/main/java/chaoran/business/activity/MainActivity.java @@ -35,6 +35,8 @@ import chaoran.business.engine.impl.NetworkSettingEngine; import chaoran.business.engine.SettingEngine; import chaoran.business.engine.impl.TekVoiceEngine; import chaoran.business.engine.VoiceEngine; +import chaoran.business.service.ScanServiceEDA50P; +import chaoran.business.service.ScanServiceZEBRA; import chaoran.business.utils.LocalAddressUtil; import chaoran.business.utils.StatusBarUtil; @@ -54,7 +56,6 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ private ProgressBar progressBar; private ActionBar actionBar; - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -72,7 +73,7 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ BrandEnum brand = BrandEnum.code(Build.MANUFACTURER); Toast.makeText(this, Build.MANUFACTURER, Toast.LENGTH_LONG).show(); Log.i("brand===",brand.toString()); - /* switch (brand) { + switch (brand) { case UROBO: adapter = new UroBoAdapter(this, this); break; @@ -88,7 +89,7 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ } if (null != adapter) { adapter.start(); - }*/ + } } @SuppressLint("JavascriptInterface") private void initView() { @@ -195,7 +196,7 @@ public class MainActivity extends AppCompatActivity implements ResultListener{ } @Override protected void onDestroy() { -// adapter.stop(); + adapter.stop(); super.onDestroy(); if (diPlayer != null) { diPlayer.stop(); diff --git a/app/src/main/java/chaoran/business/adapter/HoneywellAdapter.java b/app/src/main/java/chaoran/business/adapter/HoneywellAdapter.java new file mode 100644 index 0000000..45195f4 --- /dev/null +++ b/app/src/main/java/chaoran/business/adapter/HoneywellAdapter.java @@ -0,0 +1,76 @@ +package chaoran.business.adapter; + + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Build; + +import chaoran.business.activity.MainActivity; +import chaoran.business.activity.ResultListener; +import chaoran.business.service.ScanServiceEDA50P; +import chaoran.business.service.ScanServiceZEBRA; +import chaoran.business.strategy.Strategy; + + +public class HoneywellAdapter implements Adapter { + private Context context; + private Strategy strategy; + private ResultListener resultListener; + private Intent intent = null; + + public HoneywellAdapter(Context context, ResultListener resultListener) { + this.context = context; + this.resultListener = resultListener; + strategy = new Receiver(); + } + + @Override + public void start() { + strategy.executeStrategy(resultListener); + openContinueScan(); + } + + @Override + public void stop() { + strategy.exclusiveStrategy(); + } + + public class Receiver extends BroadcastReceiver implements Strategy { + + @Override + public void onReceive(Context context, Intent intent) { + resultListener.result(intent.getStringExtra("data")); + } + + @Override + public void executeStrategy(ResultListener resultListener) { + IntentFilter filter = new IntentFilter(); + filter.addAction("com.honeywell.scan.broadcast"); + context.registerReceiver(this, filter); + } + + @Override + public void exclusiveStrategy() { + context.unregisterReceiver(this); + } + } + public void openContinueScan(){ + if("eda50p".equals(Build.MODEL.toLowerCase())){ + intent = new Intent(context, ScanServiceEDA50P.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.getApplicationContext().startForegroundService(intent); + }else { + context.getApplicationContext().startService(intent); + } + }else if("tc26".equals(Build.MODEL.toLowerCase())){ + intent = new Intent(context, ScanServiceZEBRA.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.getApplicationContext().startForegroundService(intent); + }else { + context.getApplicationContext().startService(intent); + } + } + } +} diff --git a/app/src/main/java/chaoran/business/service/ScanServiceEDA50P.java b/app/src/main/java/chaoran/business/service/ScanServiceEDA50P.java new file mode 100644 index 0000000..c0daeb3 --- /dev/null +++ b/app/src/main/java/chaoran/business/service/ScanServiceEDA50P.java @@ -0,0 +1,258 @@ +package chaoran.business.service; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.IBinder; +import android.util.Log; + +import com.honeywell.aidc.AidcManager; +import com.honeywell.aidc.BarcodeDeviceConnectionEvent; +import com.honeywell.aidc.BarcodeFailureEvent; +import com.honeywell.aidc.BarcodeReadEvent; +import com.honeywell.aidc.BarcodeReader; +import com.honeywell.aidc.BarcodeReaderInfo; +import com.honeywell.aidc.ScannerNotClaimedException; +import com.honeywell.aidc.ScannerUnavailableException; +import com.honeywell.aidc.TriggerStateChangeEvent; +import com.honeywell.aidc.UnsupportedPropertyException; + +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + + +public class ScanServiceEDA50P extends Service + implements BarcodeReader.BarcodeListener, BarcodeReader.TriggerListener, AidcManager.BarcodeDeviceListener{ + private final String TAG = "TestScanService"; + + private NotificationManager notificationManager; + private String notificationId = "channelId"; + private String notificationName = "channelName"; + + private String _Suffix = "\n"; + + + private AidcManager mAidcManager; + private BarcodeReader mBarcodeReader; + private BarcodeReader mInternalScannerReader; + private boolean mKeyPressed = false; + private boolean isContinue = true; + + //必须要实现的方法 + @Override + public IBinder onBind(Intent intent) { + // Log.i(TAG, "onBind方法被调用!"); + return null; + } + + //Service被创建时调用 + @Override + public void onCreate() { + // Log.i(TAG, "onCreate方法被调用!"); + super.onCreate(); + super.onCreate(); + notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + NotificationChannel channel = null; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { //适配8.0service + channel = new NotificationChannel(notificationId, notificationName, NotificationManager.IMPORTANCE_HIGH); + notificationManager.createNotificationChannel(channel); + Notification notification = new Notification.Builder(getApplicationContext(), notificationId).build(); + //startForeground(1,getNotification()); + startForeground(1, notification); + } + + AidcManager.create(this, new MyCreatedCallback()); + } + + //Service被启动时调用 + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.i(TAG, "onStartCommand方法被调用!"); + return super.onStartCommand(intent, flags, startId); + } + + //Service被关闭之前回调 + @Override + public void onDestroy() { + Log.i(TAG, "onDestory方法被调用!"); + super.onDestroy(); + + if (this.mInternalScannerReader != null) { + this.mInternalScannerReader.removeBarcodeListener(this); + this.mInternalScannerReader.removeTriggerListener(this); + this.mInternalScannerReader.close(); + this.mInternalScannerReader = null; + Log.d(TAG, "Close internal scanner"); + } + if (this.mAidcManager != null) { + this.mAidcManager.removeBarcodeDeviceListener(this); + this.mAidcManager.close(); + } + + } + class MyCreatedCallback implements AidcManager.CreatedCallback { + MyCreatedCallback() { + } + + @Override + public void onCreated(AidcManager aidcManager) { + Log.d(TAG, "MyCreatedCallback onCreate !!!"); + mAidcManager = aidcManager; + mAidcManager.addBarcodeDeviceListener(ScanServiceEDA50P.this); + initAllBarcodeReaderAndSetDefault(); + } + } + void initAllBarcodeReaderAndSetDefault() { + List readerList = mAidcManager.listBarcodeDevices(); + Log.d(TAG, "initAllBarcodeReaderAndSetDefault readerList = "+readerList); + mInternalScannerReader = null; + for (BarcodeReaderInfo reader : readerList) { + if ("dcs.scanner.imager".equals(reader.getName())) { + mInternalScannerReader = initBarcodeReader(mInternalScannerReader, reader.getName()); + } + } + Log.d(TAG, "initAllBarcodeReaderAndSetDefault mInternalScannerReader = "+mInternalScannerReader); + + if (mInternalScannerReader != null) { + mBarcodeReader = mInternalScannerReader; + } + else { + Log.d(TAG, "No reader find"); + } + if (mBarcodeReader != null) { + try { + mBarcodeReader.addBarcodeListener(this); + mBarcodeReader.addTriggerListener(this); + } + catch (Throwable e2) { + e2.printStackTrace(); + } + try { + mBarcodeReader.setProperty(BarcodeReader.PROPERTY_NOTIFICATION_GOOD_READ_ENABLED, true); + mBarcodeReader.setProperty(BarcodeReader.PROPERTY_EAN_13_CHECK_DIGIT_TRANSMIT_ENABLED, true); + + } catch (UnsupportedPropertyException e) { + e.printStackTrace(); + } + + } + } + + BarcodeReader initBarcodeReader(BarcodeReader mReader, String mReaderName) { + if (mReader == null) { + try { + if (mReaderName == null) { + mReader = mAidcManager.createBarcodeReader(); + } else { + mReader = mAidcManager.createBarcodeReader(mReaderName); + } + } + catch (Exception e) { + Log.e(TAG, "error", e); + } + try { + mReader.claim(); + Log.d(TAG, "Call DCS interface claim() " + mReaderName); + } catch (ScannerUnavailableException e) { + e.printStackTrace(); + } + try { + mReader.setProperty(BarcodeReader.PROPERTY_TRIGGER_CONTROL_MODE, BarcodeReader.TRIGGER_CONTROL_MODE_CLIENT_CONTROL); + mReader.setProperty(BarcodeReader.PROPERTY_DATA_PROCESSOR_LAUNCH_EZ_CONFIG, false); + mReader.setProperty(BarcodeReader.PROPERTY_TRIGGER_AUTO_MODE_TIMEOUT, 300); + + } catch (UnsupportedPropertyException e2) { + e2.printStackTrace(); + } + } + return mReader; + } + + public void onBarcodeDeviceConnectionEvent(BarcodeDeviceConnectionEvent event) { + Log.d(TAG, event.getBarcodeReaderInfo() + " Connection status: " + event.getConnectionStatus()); + } + + public void onBarcodeEvent(final BarcodeReadEvent event) { + String barcodeDate = new String(event.getBarcodeData().getBytes(event.getCharset())); + Intent intent2 = new Intent("com.pda.scan.result"); + intent2.putExtra("data",barcodeDate); + sendBroadcast(intent2); + if(isContinue) { + executorService.execute(new MyThread(mBarcodeReader)); + } + } + ExecutorService executorService = Executors.newSingleThreadExecutor(); + class MyThread implements Runnable{ + private BarcodeReader mBarcodeReader; + public MyThread(BarcodeReader mBarcodeReader){ + this.mBarcodeReader = mBarcodeReader; + } + @Override + public void run() { + { + try { + Thread.sleep(1000); + mBarcodeReader.decode(true); + } catch (ScannerNotClaimedException e) { + Log.e(TAG, "catch ScannerNotClaimedException",e); + e.printStackTrace(); + } catch (ScannerUnavailableException e2) { + Log.e(TAG, "catch ScannerUnavailableException",e2); + e2.printStackTrace(); + } catch (Exception e3) { + e3.printStackTrace(); + } + + } + } + } + public void onFailureEvent(final BarcodeFailureEvent event) { + //Log.d(TAG, "Enter onFailureEvent ===> " + event.getTimestamp()); + if(isContinue) { + try { + Thread.sleep(200); + } catch (Exception ex) { + ex.printStackTrace(); + } + // doScan(true); + } + } + + public void onTriggerEvent(TriggerStateChangeEvent event) { + if (event.getState()) { + if (!mKeyPressed) { + mKeyPressed = true; + doScan(true); + }else{ + mKeyPressed = false; + doScan(false); + } + } else { + //mKeyPressed = false; + // doScan(false); + } + // Log.d(TAG, "OnTriggerEvent status: " + event.getState()); + } + void doScan(boolean do_scan) { + try { + if (do_scan) { + // Log.d(TAG, "Start a new Scan!"); + } else { + // Log.d(TAG, "Cancel last Scan!"); + } + mBarcodeReader.decode(do_scan); + } catch (ScannerNotClaimedException e) { + Log.e(TAG, "catch ScannerNotClaimedException",e); + e.printStackTrace(); + } catch (ScannerUnavailableException e2) { + Log.e(TAG, "catch ScannerUnavailableException",e2); + e2.printStackTrace(); + } catch (Exception e3) { + e3.printStackTrace(); + } + } +} diff --git a/app/src/main/java/chaoran/business/service/ScanServiceZEBRA.java b/app/src/main/java/chaoran/business/service/ScanServiceZEBRA.java new file mode 100644 index 0000000..ecf4058 --- /dev/null +++ b/app/src/main/java/chaoran/business/service/ScanServiceZEBRA.java @@ -0,0 +1,333 @@ +package chaoran.business.service; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.IBinder; +import android.util.Log; + +import com.symbol.emdk.EMDKManager; +import com.symbol.emdk.EMDKResults; +import com.symbol.emdk.barcode.BarcodeManager; +import com.symbol.emdk.barcode.ScanDataCollection; +import com.symbol.emdk.barcode.Scanner; +import com.symbol.emdk.barcode.ScannerConfig; +import com.symbol.emdk.barcode.ScannerException; +import com.symbol.emdk.barcode.ScannerResults; +import com.symbol.emdk.barcode.StatusData; + +import java.util.ArrayList; + +public class ScanServiceZEBRA extends Service implements EMDKManager.EMDKListener, Scanner.DataListener, Scanner.StatusListener { + private final String TAG = "ScanService"; + + private NotificationManager notificationManager; + private String notificationId = "ScanServiceId"; + private String notificationName = "ScanServiceName"; + + private EMDKManager emdkManager = null; + private BarcodeManager barcodeManager = null; + private Scanner scanner = null; + + private String statusString = ""; + + private boolean bSoftTriggerSelected = true; + + @Override + public IBinder onBind(Intent intent) { + Log.i(TAG, "onBind方法被调用!"); + return null; + } + + //Service被创建时调用 + @Override + public void onCreate() { + Log.i(TAG, "onCreate方法被调用!"); + super.onCreate(); + notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + NotificationChannel channel = null; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { //适配8.0service + channel = new NotificationChannel(notificationId, notificationName, NotificationManager.IMPORTANCE_HIGH); + notificationManager.createNotificationChannel(channel); + Notification notification = new Notification.Builder(getApplicationContext(), notificationId).build(); + //startForeground(1,getNotification()); + startForeground(1, notification); + } + EMDKResults results = EMDKManager.getEMDKManager(getApplicationContext(), this); + final IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction("com.pda.scan.trigger"); + registerReceiver(myCodeReceiver, intentFilter); + } + private MyCodeReceiver myCodeReceiver = new MyCodeReceiver(); + + public class MyCodeReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + int keyCode = intent.getIntExtra("data",0); + if(keyCode == 103 || keyCode == 10036){ + if(bSoftTriggerSelected){ + bSoftTriggerSelected = false; + }else{ + bSoftTriggerSelected = true; + cancelRead(); + } + } + } + } + /* private Notification getNotification() { + Notification.Builder builder = new Notification.Builder(this) + .setContentTitle("连续扫描服务") + .setContentText("正在运行"); + builder.setChannelId(notificationId); + Notification notification = builder.build(); + return notification; + }*/ + + //Service被启动时调用 + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.i(TAG, "onStartCommand方法被调用!"); + + //setconfig(); + initScanner(); + return super.onStartCommand(intent, flags, startId); + } + public void setconfig(){ + Intent i = new Intent(); + i.setAction("com.symbol.datawedge.api.ACTION"); + i.putExtra("com.symbol.datawedge.api.SET_DEFAULT_PROFILE", "myProfile"); + sendBroadcast(i); + } + @Override + public void onOpened(EMDKManager emdkManager) { + updateStatus("EMDK open success!"); + this.emdkManager = emdkManager; + // Acquire the barcode manager resources + initBarcodeManager(); + // Enumerate scanner devices + // enumerateScannerDevices(); + initScanner(); + } + + @Override + public void onClosed() { + // Release all the resources + if (emdkManager != null) { + emdkManager.release(); + emdkManager = null; + } + updateStatus("EMDK closed unexpectedly! Please close and restart the application."); + } + + @Override + public void onDestroy() { + super.onDestroy(); + // Release all the resources + if (emdkManager != null) { + emdkManager.release(); + emdkManager = null; + } + + } + + @Override + public void onData(ScanDataCollection scanDataCollection) { + if ((scanDataCollection != null) && (scanDataCollection.getResult() == ScannerResults.SUCCESS)) { + ArrayList scanData = scanDataCollection.getScanData(); + for (ScanDataCollection.ScanData data : scanData) { + updateData(data.getData()); + } + } + } + + @Override + public void onStatus(StatusData statusData) { + StatusData.ScannerStates state = statusData.getState(); + switch (state) { + case IDLE: + statusString = statusData.getFriendlyName() + " is enabled and idle..."; + updateStatus(statusString); + // set trigger type + if(bSoftTriggerSelected) { + scanner.triggerType = Scanner.TriggerType.SOFT_ALWAYS; + setDecoders(); + } else { + scanner.triggerType = Scanner.TriggerType.HARD; + cancelRead(); + } + // submit read + if (!scanner.isReadPending()) { + try { + Thread.sleep(1000); + Log.i("jqtest:", "scan"); + scanner.read(); + } catch (Exception e) { + e.printStackTrace(); + updateStatus(e.getMessage()); + try { + deInitScanner(); + Thread.sleep(200); + }catch (Exception e1){ + e1.printStackTrace(); + } + initScanner(); + } + } + break; + case WAITING: + statusString = "Scanner is waiting for trigger press..."; + updateStatus(statusString); + break; + case SCANNING: + statusString = "Scanning..."; + updateStatus(statusString); + break; + case DISABLED: + statusString = statusData.getFriendlyName() + " is disabled."; + updateStatus(statusString); + break; + case ERROR: + statusString = "An error has occurred."; + updateStatus(statusString); + break; + default: + break; + } + } + + + private void initScanner() { + if (scanner == null) { + if (barcodeManager != null) { + scanner = barcodeManager.getDevice(BarcodeManager.DeviceIdentifier.DEFAULT); + } else { + updateStatus("Failed to get the specified scanner device! Please close and restart the application."); + return; + } + if (scanner != null) { + scanner.addDataListener(this); + scanner.addStatusListener(this); + try { + scanner.enable(); + } catch (ScannerException e) { + updateStatus(e.getMessage()); + deInitScanner(); + } + } else { + updateStatus("Failed to initialize the scanner device."); + } + } + } + + private void deInitScanner() { + if (scanner != null) { + try { + scanner.disable(); + } catch (Exception e) { + updateStatus(e.getMessage()); + } + + try { + scanner.removeDataListener(this); + scanner.removeStatusListener(this); + } catch (Exception e) { + updateStatus(e.getMessage()); + } + + try { + scanner.release(); + } catch (Exception e) { + updateStatus(e.getMessage()); + } + scanner = null; + } + } + + private void initBarcodeManager() { + barcodeManager = (BarcodeManager) emdkManager.getInstance(EMDKManager.FEATURE_TYPE.BARCODE); + + } + + private void deInitBarcodeManager() { + if (emdkManager != null) { + emdkManager.release(EMDKManager.FEATURE_TYPE.BARCODE); + } + } + + +/* private void enumerateScannerDevices() { + if (barcodeManager != null) { + List deviceList = barcodeManager.getSupportedDevicesInfo(); + if ((deviceList != null) && (deviceList.size() != 0)) { + Iterator it = deviceList.iterator(); + while (it.hasNext()) { + ScannerInfo scnInfo = it.next(); + if (scnInfo.isDefaultScanner()) { + scannerInfo = scnInfo; + Log.i("scannerInfo", scannerInfo.getFriendlyName()); + break; + } + } + } + } + }*/ + + private void setDecoders() { + if (scanner != null) { + try { + ScannerConfig config = scanner.getConfig(); + // Set EAN8 + config.decoderParams.ean8.enabled = true; + // Set EAN13 + config.decoderParams.ean13.enabled = true; + // Set Code39 + config.decoderParams.code39.enabled = true; + //Set Code128 + config.decoderParams.code128.enabled = true; +// config.readerParams.readerSpecific.imagerSpecific.aimType = ScannerConfig.AimType.PRESENTATION; + scanner.setConfig(config); + } catch (ScannerException e) { + } + } + } + + private void cancelRead() { + if (scanner != null) { + if (scanner.isReadPending()) { + try { + scanner.cancelRead(); + } catch (ScannerException e) { + updateStatus(e.getMessage()); + } + } + } + } + + private void updateStatus(final String status) { + //Log.i("status",status); +// runOnUiThread(new Runnable() { +// @Override +// public void run() { +// textViewStatus.setText("" + status); +// } +// }); + } + + private void updateData(final String result) { + new Thread() { + @Override + public void run() { + super.run(); + Intent intent2 = new Intent("com.pda.scan.result"); + intent2.putExtra("data", result); + sendBroadcast(intent2); + Log.i(TAG, result); + } + }.start(); + } +} diff --git a/build.gradle b/build.gradle index c8d7712..53524a2 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath "com.android.tools.build:gradle:4.1.0" + classpath 'com.android.tools.build:gradle:4.1.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files