xiongzhu 7 年之前
父節點
當前提交
d4bb0e94ec
共有 61 個文件被更改,包括 400 次插入547 次删除
  1. 31 0
      android.js
  2. 5 0
      package-lock.json
  3. 2 1
      package.json
  4. 1 1
      platforms/android/AndroidManifest.xml
  5. 0 5
      platforms/android/CordovaLib/CordovaLib.iml
  6. 2 15
      platforms/android/android.iml
  7. 6 6
      platforms/android/android.json
  8. 2 2
      platforms/android/assets/www/plugins/cordova-plugin-handheld/www/Handheld.js
  9. 1 3
      platforms/android/build.gradle
  10. 10 0
      platforms/android/cordova-plugin-handheld/milk-handheld.gradle
  11. 0 0
      platforms/android/libs/armeabi-v7a/libDeviceAPI.so
  12. 0 0
      platforms/android/libs/armeabi-v7a/libIAL.so
  13. 0 0
      platforms/android/libs/armeabi-v7a/libModuleAPI_Android.so
  14. 0 0
      platforms/android/libs/armeabi-v7a/libSDL.so
  15. 0 0
      platforms/android/libs/armeabi-v7a/libbarcodereader.so
  16. 0 0
      platforms/android/libs/armeabi-v7a/libbarcodereader43.so
  17. 0 0
      platforms/android/libs/armeabi-v7a/libbarcodereader44.so
  18. 0 0
      platforms/android/libs/armeabi-v7a/libbarcodereader44_AndroidM.so
  19. 0 0
      platforms/android/libs/armeabi-v7a/libserial_port.so
  20. 0 0
      platforms/android/libs/armeabi-v7a/libsystem_control.so
  21. 二進制
      platforms/android/libs/bga-qrcode-core.aar
  22. 二進制
      platforms/android/libs/bga-qrcode-zxing.aar
  23. 2 2
      platforms/android/platform_www/plugins/cordova-plugin-handheld/www/Handheld.js
  24. 2 5
      platforms/android/project.properties
  25. 1 1
      platforms/android/release-signing.properties
  26. 1 1
      platforms/android/res/layout/activity_scan.xml
  27. 29 3
      platforms/android/src/com/izouma/handheld/Handheld.java
  28. 22 0
      platforms/android/src/com/izouma/handheld/ReadTagOptions.java
  29. 7 1
      platforms/android/src/com/izouma/handheld/device/Device.java
  30. 2 1
      platforms/android/src/com/izouma/handheld/device/DeviceInvengo.java
  31. 93 12
      platforms/android/src/com/izouma/handheld/device/DeviceSupoin.java
  32. 2 23
      platforms/ios/ios.json
  33. 0 46
      platforms/ios/platform_www/plugins/cordova-plugin-handheld/www/Handheld.js
  34. 0 16
      platforms/ios/奶源追溯.xcodeproj/project.pbxproj
  35. 0 46
      platforms/ios/奶源追溯/Plugins/cordova-plugin-handheld/Handheld.m
  36. 0 20
      platforms/ios/奶源追溯/Plugins/cordova-plugin-handheld/ScanViewController.h
  37. 0 298
      platforms/ios/奶源追溯/Plugins/cordova-plugin-handheld/ScanViewController.m
  38. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/ic_shortcut_flash_off@2x.png
  39. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/ic_shortcut_flash_off@3x.png
  40. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/ic_shortcut_flash_on@2x.png
  41. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/ic_shortcut_flash_on@3x.png
  42. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/line.png
  43. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/line@2x.png
  44. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/pick_bg.png
  45. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/pick_bg@2x.png
  46. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/prev.png
  47. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/prev@2x.png
  48. 二進制
      platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/prev@3x.png
  49. 0 4
      platforms/ios/奶源追溯/config.xml
  50. 0 2
      platforms/ios/奶源追溯/奶源追溯-Info.plist
  51. 13 13
      plugins/cordova-plugin-handheld/plugin.xml
  52. 10 0
      plugins/cordova-plugin-handheld/src/android/handheld.gradle
  53. 29 3
      plugins/cordova-plugin-handheld/src/android/handheld/Handheld.java
  54. 22 0
      plugins/cordova-plugin-handheld/src/android/handheld/ReadTagOptions.java
  55. 7 1
      plugins/cordova-plugin-handheld/src/android/handheld/device/Device.java
  56. 2 1
      plugins/cordova-plugin-handheld/src/android/handheld/device/DeviceInvengo.java
  57. 93 12
      plugins/cordova-plugin-handheld/src/android/handheld/device/DeviceSupoin.java
  58. 二進制
      plugins/cordova-plugin-handheld/src/android/libs/bga-qrcode-core.aar
  59. 二進制
      plugins/cordova-plugin-handheld/src/android/libs/bga-qrcode-zxing.aar
  60. 1 1
      plugins/cordova-plugin-handheld/src/android/res/layout/activity_scan.xml
  61. 2 2
      plugins/cordova-plugin-handheld/www/Handheld.js

+ 31 - 0
android.js

@@ -0,0 +1,31 @@
+var spawn = require('child_process').spawn;
+
+function exec(cmd, args, options) {
+    return new Promise((resolve, reject) => {
+        var s = spawn(cmd, args, options)
+        s.stdout.on('data', function (s) {
+            console.log(s.toString())
+        })
+        s.stderr.on('data', function (s) {
+            console.log(s.toString())
+            reject(s.toString())
+        })
+        s.on('close', code => {
+            resolve()
+        })
+    })
+}
+
+const workDir = '/Users/xiongzhu/Projects/Java/GuangMing/WebSrc/Milk'
+const username = 'xz'
+const password = 'xz'
+
+exec('svn', ['update', '--username', username, '--password', password], { cwd: workDir }).then(() => {
+    return exec('npm', ['run', 'build', 'app'], { cwd: workDir })
+}).then(() => {
+    return exec('cordova', ['clean', 'android'], { cwd: './' })
+}).then(() => {
+    return exec('cordova', ['build', 'android', '--release', '--', '--keystore="./zouma.jks"', '--storePassword=zouma123', '--password=zouma123', '--alias=zouma'], { cwd: './' })
+}).catch(e => {
+    console.log(e)
+})

+ 5 - 0
package-lock.json

@@ -567,6 +567,11 @@
             "resolved": "https://registry.npmjs.org/cordova-plugin-x-toast/-/cordova-plugin-x-toast-2.6.0.tgz",
             "integrity": "sha1-R3i+y2HjbIlRCRoHWFDCje2PVqU="
         },
+        "node-cmd": {
+            "version": "3.0.0",
+            "resolved": "http://registry.npm.taobao.org/node-cmd/download/node-cmd-3.0.0.tgz",
+            "integrity": "sha1-OP/3CkqqT2WdID61eGJzcBjiT28="
+        },
         "semver": {
             "version": "5.5.0",
             "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",

+ 2 - 1
package.json

@@ -20,7 +20,8 @@
         "cordova-plugin-tencent-bg-location": "file:../tencentBgLocation",
         "cordova-plugin-whitelist": "^1.3.3",
         "cordova-plugin-wkwebview-engine": "^1.1.4",
-        "cordova-plugin-x-toast": "^2.6.0"
+        "cordova-plugin-x-toast": "^2.6.0",
+        "node-cmd": "^3.0.0"
     },
     "cordova": {
         "plugins": {

+ 1 - 1
platforms/android/AndroidManifest.xml

@@ -21,7 +21,6 @@
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
@@ -30,6 +29,7 @@
     <uses-feature android:name="android.hardware.camera.autofocus" />
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.FLASHLIGHT" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />

+ 0 - 5
platforms/android/CordovaLib/CordovaLib.iml

@@ -73,17 +73,12 @@
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
       <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
-      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
     </content>
     <orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />

+ 2 - 15
platforms/android/android.iml

@@ -71,13 +71,8 @@
       <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
-      <excludeFolder url="file://$MODULE_DIR$/build/.DS_Store" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/cn.bingoogolapple/bga-qrcodecore/1.1.9/jars" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/cn.bingoogolapple/bga-zxing/1.1.9/jars" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/bga-qrcode-zxing/jars" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/animated-vector-drawable/25.3.1/jars" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/25.3.1/jars" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-compat/25.3.1/jars" />
@@ -90,17 +85,11 @@
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.yanzhenjie.alertdialog/alertdialog/1.0.1/jars" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.yanzhenjie/permission/1.1.2/jars" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
       <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
-      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
     </content>
     <orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
@@ -116,11 +105,10 @@
     <orderEntry type="library" exported="" name="Gradle: __local_jars__:/Users/xiongzhu/Projects/Cordova/Milk/platforms/android/libs/invengo.system.ctrl.jar:unspecified@jar" level="project" />
     <orderEntry type="library" exported="" name="Gradle: __local_jars__:/Users/xiongzhu/Projects/Cordova/Milk/platforms/android/libs/ch.ntb.usb-0.5.9.jar:unspecified@jar" level="project" />
     <orderEntry type="library" exported="" name="Gradle: com.squareup.okio:okio:1.13.0@jar" level="project" />
-    <orderEntry type="library" exported="" name="Gradle: com.google.zxing:core:3.3.0@jar" level="project" />
+    <orderEntry type="library" exported="" name="Gradle: bga-qrcode-zxing:@aar" level="project" />
     <orderEntry type="library" exported="" name="Gradle: com.android.support:animated-vector-drawable-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="Gradle: __local_jars__:/Users/xiongzhu/Projects/Cordova/Milk/platforms/android/libs/UHF_API_JAR.jar:unspecified@jar" level="project" />
     <orderEntry type="library" exported="" name="Gradle: com.android.support:support-compat-25.3.1" level="project" />
-    <orderEntry type="library" exported="" name="Gradle: cn.bingoogolapple:bga-zxing-1.1.9" level="project" />
     <orderEntry type="library" exported="" name="Gradle: com.squareup.retrofit2:converter-gson:2.3.0@jar" level="project" />
     <orderEntry type="library" exported="" name="Gradle: __local_jars__:/Users/xiongzhu/Projects/Cordova/Milk/platforms/android/libs/ModuleAPI_Android_3.0.1.0.jar:unspecified@jar" level="project" />
     <orderEntry type="library" exported="" name="Gradle: __local_jars__:/Users/xiongzhu/Projects/Cordova/Milk/platforms/android/libs/xUtils-2.5.5.jar:unspecified@jar" level="project" />
@@ -134,7 +122,6 @@
     <orderEntry type="library" exported="" name="Gradle: com.google.code.gson:gson:2.8.2@jar" level="project" />
     <orderEntry type="library" exported="" name="Gradle: com.squareup.okhttp3:okhttp:3.8.0@jar" level="project" />
     <orderEntry type="library" exported="" name="Gradle: __local_jars__:/Users/xiongzhu/Projects/Cordova/Milk/platforms/android/libs/classes.jar:unspecified@jar" level="project" />
-    <orderEntry type="library" exported="" name="Gradle: cn.bingoogolapple:bga-qrcodecore-1.1.9" level="project" />
     <orderEntry type="library" exported="" name="Gradle: com.yanzhenjie:permission-1.1.2" level="project" />
     <orderEntry type="library" exported="" name="Gradle: com.android.support:support-vector-drawable-25.3.1" level="project" />
     <orderEntry type="library" exported="" name="Gradle: __local_jars__:/Users/xiongzhu/Projects/Cordova/Milk/platforms/android/libs/cw-deviceapi20171113.jar:unspecified@jar" level="project" />

+ 6 - 6
platforms/android/android.json

@@ -48,7 +48,7 @@
           "/*": [
             {
               "xml": "<uses-permission android:name=\"android.permission.INTERNET\" />",
-              "count": 3
+              "count": 2
             },
             {
               "xml": "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
@@ -56,16 +56,12 @@
             },
             {
               "xml": "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
-              "count": 3
+              "count": 2
             },
             {
               "xml": "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
               "count": 2
             },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
-              "count": 4
-            },
             {
               "xml": "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
               "count": 1
@@ -98,6 +94,10 @@
               "xml": "<uses-permission android:name=\"android.permission.FLASHLIGHT\" />",
               "count": 1
             },
+            {
+              "xml": "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
+              "count": 2
+            },
             {
               "xml": "<uses-permission android:name=\"android.permission.WAKE_LOCK\" />",
               "count": 1

+ 2 - 2
platforms/android/assets/www/plugins/cordova-plugin-handheld/www/Handheld.js

@@ -7,8 +7,8 @@ exports.scanCode = function(success, error) {
 exports.stopScan = function(success, error) {
     exec(success, error, "Handheld", "stopScan", []);
 };
-exports.readTag = function(success, error) {
-    exec(success, error, "Handheld", "readTag", []);
+exports.readTag = function(success, error, options) {
+    exec(success, error, "Handheld", "readTag", [options]);
 };
 exports.stopRead = function(success, error) {
     exec(success, error, "Handheld", "stopRead", []);

+ 1 - 3
platforms/android/build.gradle

@@ -92,6 +92,7 @@ ext {
 }
 
 // PLUGIN GRADLE EXTENSIONS START
+apply from: "cordova-plugin-handheld/milk-handheld.gradle"
 // PLUGIN GRADLE EXTENSIONS END
 
 def hasBuildExtras = file('build-extras.gradle').exists()
@@ -259,9 +260,6 @@ dependencies {
     compile "com.squareup.retrofit2:retrofit:2.3.0"
     compile "com.squareup.retrofit2:converter-gson:2.3.0"
     compile "com.google.code.gson:gson:2.8.2"
-    compile "com.google.zxing:core:3.3.0"
-    compile "cn.bingoogolapple:bga-qrcodecore:1.1.9@aar"
-    compile "cn.bingoogolapple:bga-zxing:1.1.9@aar"
     // SUB-PROJECT DEPENDENCIES END
 }
 

+ 10 - 0
platforms/android/cordova-plugin-handheld/milk-handheld.gradle

@@ -0,0 +1,10 @@
+repositories {    
+    jcenter()
+    flatDir {
+        dirs 'libs'
+    }
+}
+dependencies {
+    compile(name:'bga-qrcode-core', ext:'aar')
+    compile(name:'bga-qrcode-zxing', ext:'aar')
+}

+ 0 - 0
platforms/android/libs/armeabi/libDeviceAPI.so → platforms/android/libs/armeabi-v7a/libDeviceAPI.so


+ 0 - 0
platforms/android/libs/armeabi/libIAL.so → platforms/android/libs/armeabi-v7a/libIAL.so


+ 0 - 0
platforms/android/libs/armeabi/libModuleAPI_Android.so → platforms/android/libs/armeabi-v7a/libModuleAPI_Android.so


+ 0 - 0
platforms/android/libs/armeabi/libSDL.so → platforms/android/libs/armeabi-v7a/libSDL.so


+ 0 - 0
platforms/android/libs/armeabi/libbarcodereader.so → platforms/android/libs/armeabi-v7a/libbarcodereader.so


+ 0 - 0
platforms/android/libs/armeabi/libbarcodereader43.so → platforms/android/libs/armeabi-v7a/libbarcodereader43.so


+ 0 - 0
platforms/android/libs/armeabi/libbarcodereader44.so → platforms/android/libs/armeabi-v7a/libbarcodereader44.so


+ 0 - 0
platforms/android/libs/armeabi/libbarcodereader44_AndroidM.so → platforms/android/libs/armeabi-v7a/libbarcodereader44_AndroidM.so


+ 0 - 0
platforms/android/libs/armeabi/libserial_port.so → platforms/android/libs/armeabi-v7a/libserial_port.so


+ 0 - 0
platforms/android/libs/armeabi/libsystem_control.so → platforms/android/libs/armeabi-v7a/libsystem_control.so


二進制
platforms/android/libs/bga-qrcode-core.aar


二進制
platforms/android/libs/bga-qrcode-zxing.aar


+ 2 - 2
platforms/android/platform_www/plugins/cordova-plugin-handheld/www/Handheld.js

@@ -7,8 +7,8 @@ exports.scanCode = function(success, error) {
 exports.stopScan = function(success, error) {
     exec(success, error, "Handheld", "stopScan", []);
 };
-exports.readTag = function(success, error) {
-    exec(success, error, "Handheld", "readTag", []);
+exports.readTag = function(success, error, options) {
+    exec(success, error, "Handheld", "readTag", [options]);
 };
 exports.stopRead = function(success, error) {
     exec(success, error, "Handheld", "stopRead", []);

+ 2 - 5
platforms/android/project.properties

@@ -16,8 +16,5 @@ cordova.system.library.1=com.android.support:support-v4:24.1.1+
 cordova.system.library.2=com.yanzhenjie:permission:1.1.2
 cordova.system.library.3=com.squareup.retrofit2:retrofit:2.3.0
 cordova.system.library.4=com.squareup.retrofit2:converter-gson:2.3.0
-cordova.system.library.5=com.google.code.gson:gson:2.8.2
-cordova.system.library.6=com.google.zxing:core:3.3.0
-cordova.system.library.7=cn.bingoogolapple:bga-qrcodecore:1.1.9@aar
-cordova.system.library.8=cn.bingoogolapple:bga-zxing:1.1.9@aar
-cordova.system.library.9=com.google.code.gson:gson:2.8.2
+cordova.gradle.include.1=cordova-plugin-handheld/milk-handheld.gradle
+cordova.system.library.5=com.google.code.gson:gson:2.8.2

+ 1 - 1
platforms/android/release-signing.properties

@@ -1,6 +1,6 @@
 # This file is automatically generated.
 # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-key.store=../../zouma.jks
+key.store=../../"./zouma.jks"
 key.alias=zouma
 key.store.password=zouma123
 key.alias.password=zouma123

+ 1 - 1
platforms/android/res/layout/activity_scan.xml

@@ -4,7 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context="cn.x1ongzhu.qrCodeScanner.ScanActivity">
+    tools:context="com.izouma.handheld.ScanActivity">
 
 
     <cn.bingoogolapple.qrcode.zxing.ZXingView

+ 29 - 3
platforms/android/src/com/izouma/handheld/Handheld.java

@@ -15,6 +15,8 @@ import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.util.List;
+
 /**
  * This class echoes a string called from JavaScript.
  */
@@ -50,7 +52,15 @@ public class Handheld extends CordovaPlugin {
             callbackContext.success();
             return true;
         } else if (action.equals("readTag")) {
-            this.readTag(callbackContext);
+            ReadTagOptions options = null;
+            try {
+                JSONObject jsonObject = args.getJSONObject(0);
+                Gson gson = new Gson();
+                options = gson.fromJson(jsonObject.toString(), ReadTagOptions.class);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            this.readTag(callbackContext, options);
             return true;
         } else if (action.equals("stopRead")) {
             device.stopRead();
@@ -79,14 +89,30 @@ public class Handheld extends CordovaPlugin {
         });
     }
 
-    private void readTag(final CallbackContext callbackContext) {
-        device.readTag(new Device.ReadTagListener() {
+    private void readTag(final CallbackContext callbackContext, ReadTagOptions options) {
+        if (options == null) {
+            options = new ReadTagOptions();
+        }
+        device.readTag(options, new Device.ReadTagListener() {
             @Override
             public void onReadData(TagData tagData) {
                 Gson gson = new Gson();
                 try {
                     JSONObject jsonObject = new JSONObject(gson.toJson(tagData));
                     PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, jsonObject);
+                    pluginResult.setKeepCallback(false);
+                    callbackContext.sendPluginResult(pluginResult);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            @Override
+            public void onReadData(List<TagData> list) {
+                Gson gson = new Gson();
+                try {
+                    JSONArray jsonArray = new JSONArray(gson.toJson(list));
+                    PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, jsonArray);
                     pluginResult.setKeepCallback(true);
                     callbackContext.sendPluginResult(pluginResult);
                 } catch (JSONException e) {

+ 22 - 0
platforms/android/src/com/izouma/handheld/ReadTagOptions.java

@@ -0,0 +1,22 @@
+package com.izouma.handheld;
+
+public class ReadTagOptions {
+    private boolean single;
+    private Integer power;
+
+    public boolean isSingle() {
+        return single;
+    }
+
+    public void setSingle(boolean single) {
+        this.single = single;
+    }
+
+    public Integer getPower() {
+        return power;
+    }
+
+    public void setPower(Integer power) {
+        this.power = power;
+    }
+}

+ 7 - 1
platforms/android/src/com/izouma/handheld/device/Device.java

@@ -3,13 +3,17 @@ package com.izouma.handheld.device;
 import android.content.Intent;
 import android.view.KeyEvent;
 
+import com.izouma.handheld.ReadTagOptions;
 import com.izouma.handheld.TagData;
 
+import java.util.List;
+
 /**
  * Created by xiongzhu on 2018/3/20.
  */
 
 public abstract class Device {
+    protected final static String TAG = "Handheld Device";
 
     public void init() {
     }
@@ -20,7 +24,7 @@ public abstract class Device {
     public void stopScan() {
     }
 
-    public void readTag(ReadTagListener listener) {
+    public void readTag(ReadTagOptions options, ReadTagListener listener) {
     }
 
     public void stopRead() {
@@ -44,5 +48,7 @@ public abstract class Device {
 
     public interface ReadTagListener {
         void onReadData(TagData tagData);
+
+        void onReadData(List<TagData> list);
     }
 }

+ 2 - 1
platforms/android/src/com/izouma/handheld/device/DeviceInvengo.java

@@ -11,6 +11,7 @@ import android.util.Log;
 import android.view.KeyEvent;
 import android.widget.Toast;
 
+import com.izouma.handheld.ReadTagOptions;
 import com.izouma.handheld.TagData;
 import com.izouma.handheld.VoiceManager;
 import com.zebra.adc.decoder.Barcode2DWithSoft;
@@ -150,7 +151,7 @@ public class DeviceInvengo extends Device implements Barcode2DWithSoft.ScanCallb
     }
 
     @Override
-    public void readTag(ReadTagListener listener) {
+    public void readTag(ReadTagOptions options, ReadTagListener listener) {
         this.readTagListener = listener;
         new Thread(new Runnable() {
             public void run() {

+ 93 - 12
platforms/android/src/com/izouma/handheld/device/DeviceSupoin.java

@@ -16,14 +16,24 @@ import android.text.TextUtils;
 import android.util.Log;
 import android.widget.Toast;
 
+import com.izouma.handheld.ReadTagOptions;
+import com.izouma.handheld.TagData;
+import com.izouma.handheld.VoiceManager;
 import com.uhf.api.cls.Reader;
 import com.uhf.uhf.Common.Comm;
+import com.uhf.uhf.Common.InventoryBuffer;
 import com.uhf.uhf.UHF1.UHF001;
 import com.uhf.uhf.UHF1.UHF1Application;
 import com.uhf.uhf.UHF1Function.SPconfig;
 import com.uhf.uhf.UHF6.UHF006;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.uhf.uhf.Common.Comm.lsTagList;
+import static com.uhf.uhf.Common.Comm.operateType.nullOperate;
 import static com.uhf.uhf.Common.Comm.soundPool;
+import static com.uhf.uhf.Common.Comm.tag;
 
 /**
  * Created by xiongzhu on 2018/3/20.
@@ -37,8 +47,11 @@ public class DeviceSupoin extends Device {
     private ScanCodeListener  scanCodeListener;
     private ReadTagListener   readTagListener;
     private BroadcastReceiver receiver;
+    private AlertDialog       dialog;
+    private VoiceManager      mVoiceManager;
+    private boolean           singleMode;
+    private int               soundId;
     private boolean handleResult = false;
-    private AlertDialog dialog;
 
     @SuppressLint("HandlerLeak")
     private Handler connectH = new Handler() {
@@ -60,7 +73,7 @@ public class DeviceSupoin extends Device {
                 }
             } catch (Exception e) {
                 e.printStackTrace();
-                Log.e("connectH", e.getMessage().toString());
+                Log.e("connectH", e.getMessage());
             }
         }
     };
@@ -73,17 +86,74 @@ public class DeviceSupoin extends Device {
             try {
                 Comm.tagListSize = Comm.lsTagList.size();
                 Bundle bd = msg.getData();
-
                 int readCount = bd.getInt("readCount");
-                if (readCount > 0)
-                    if (Comm.tagListSize > 0) {
-
+                if (readCount > 0 && Comm.tagListSize > 0) {
+                    List<TagData> list = new ArrayList<TagData>();
+                    for (InventoryBuffer.InventoryTagMap tagMap : lsTagList) {
+                        TagData tagData = new TagData();
+                        tagData.setEpc(tagMap.strEPC);
+                        tagData.setRssi(tagMap.strRSSI);
+                        list.add(tagData);
                     }
-                Log.e("uhfhandler", "readCount : " + String.valueOf(readCount));
+                    readTagListener.onReadData(list);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    };
+
+    @SuppressLint("HandlerLeak")
+    private android.os.Handler tagOpehandler = new android.os.Handler() {
+        @SuppressWarnings({"unchecked", "unused"})
+        @Override
+        public void handleMessage(Message msg) {
+            playBeep();
+            try {
+                Bundle b = msg.getData();
+                switch (Comm.opeT) {
+                    case readOpe:
+                        String strErr = b.getString("Err");
+                        String strEPC = b.getString("readData");
+                        if (!TextUtils.isEmpty(strEPC)) {
+                            TagData tagData = new TagData();
+                            tagData.setEpc(strEPC);
+                            readTagListener.onReadData(tagData);
+                        } else {
+                            Log.e(TAG, "Read Fail: " + strErr);
+                        }
+                        break;
+                    case writeOpe:
+                        boolean isWriteSucceed = b.getBoolean("isWriteSucceed");
+                        if (isWriteSucceed) {
+                            Toast.makeText(context, "Write Succeed", Toast.LENGTH_SHORT).show();
+                            Log.d("UHF", "Write Succeed");
+                        } else {
+                            Toast.makeText(context, "Write Fail", Toast.LENGTH_SHORT).show();
+                        }
+                        break;
+                    case writeepcOpe:
+                        boolean isWriteEPCSucceed = b.getBoolean("isWriteSucceed");
+                        if (isWriteEPCSucceed) {
+                            Toast.makeText(context, "Write Succeed", Toast.LENGTH_SHORT).show();
+                        } else {
+                            Toast.makeText(context, "Write Fail", Toast.LENGTH_SHORT).show();
+                        }
+                        break;
+                    case lockOpe:
+                        boolean isLockSucceed = b.getBoolean("isLockSucceed");
+                        if (isLockSucceed)
+                            Toast.makeText(context, "Lock Succeed", Toast.LENGTH_SHORT).show();
+                        else
+                            Toast.makeText(context, "Lock Fail", Toast.LENGTH_SHORT).show();
+                        break;
+                    default:
+                        break;
+                }
             } catch (Exception e) {
                 e.printStackTrace();
-                Log.e("uhfhandler", e.getMessage().toString());
             }
+            Comm.opeT = nullOperate;
         }
     };
 
@@ -111,7 +181,7 @@ public class DeviceSupoin extends Device {
         filter.addAction(ACTION_ON_OFF);
         filter.addAction(ACTION_SCAN);
         context.registerReceiver(receiver, filter);
-
+        mVoiceManager = VoiceManager.getInstance(context.getApplicationContext());
 
     }
 
@@ -140,9 +210,15 @@ public class DeviceSupoin extends Device {
     }
 
     @Override
-    public void readTag(ReadTagListener listener) {
+    public void readTag(ReadTagOptions options, ReadTagListener listener) {
         this.readTagListener = listener;
-        Comm.startScan();
+        this.singleMode = options.isSingle();
+        if (singleMode) {
+            Comm.opeT = Comm.operateType.readOpe;
+            Comm.readTag(0, 1, "6", "2", 0);
+        } else {
+            Comm.startScan();
+        }
     }
 
     @Override
@@ -157,7 +233,7 @@ public class DeviceSupoin extends Device {
         Comm.app = new UHF1Application();
         Comm.spConfig = new SPconfig(context);
         Comm.soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
-        soundPool.load(context, context.getResources().getIdentifier("success", "raw", context.getPackageName()), 1);
+        soundId = soundPool.load(context, context.getResources().getIdentifier("success", "raw", context.getPackageName()), 1);
         Comm.checkDevice();
         if (!Comm.powerUp()) {
             Comm.powerDown();
@@ -165,6 +241,7 @@ public class DeviceSupoin extends Device {
         if (Comm.powerUp()) {
             Toast.makeText(context, "success", Toast.LENGTH_SHORT).show();
             Comm.connecthandler = connectH;
+            Comm.mRWLHandler = tagOpehandler;
             Comm.Connect();
 
             int[] val = new int[]{-1};
@@ -196,4 +273,8 @@ public class DeviceSupoin extends Device {
         context.unregisterReceiver(receiver);
         stopScan();
     }
+
+    private void playBeep() {
+        soundPool.play(soundId, 1, 1, 1, 0, 1f);
+    }
 }

+ 2 - 23
platforms/ios/ios.json

@@ -13,12 +13,7 @@
               "count": 23
             }
           ],
-          "NSCameraUsageDescription": [
-            {
-              "xml": "<string>需要打开相机来扫码</string>",
-              "count": 1
-            }
-          ],
+          "NSCameraUsageDescription": [],
           "NSLocationWhenInUseUsageDescription": [
             {
               "xml": "<string>我们需要通过您的地理位置信息来获取周边数据</string>",
@@ -71,10 +66,6 @@
             {
               "xml": "<feature name=\"navigationbar\"><param name=\"ios-package\" value=\"navigationbar\" /></feature>",
               "count": 1
-            },
-            {
-              "xml": "<feature name=\"Handheld\"><param name=\"ios-package\" value=\"Handheld\" /><param name=\"onload\" value=\"true\" /></feature>",
-              "count": 1
             }
           ]
         }
@@ -107,9 +98,6 @@
     },
     "cordova-plugin-navigationbar": {
       "PACKAGE_NAME": "com.brightdairy.milk"
-    },
-    "cordova-plugin-handheld": {
-      "PACKAGE_NAME": "com.brightdairy.milk"
     }
   },
   "dependent_plugins": {},
@@ -206,14 +194,6 @@
       "clobbers": [
         "cordova.plugins.navigationbar"
       ]
-    },
-    {
-      "id": "cordova-plugin-handheld.Handheld",
-      "file": "plugins/cordova-plugin-handheld/www/Handheld.js",
-      "pluginId": "cordova-plugin-handheld",
-      "clobbers": [
-        "Handheld"
-      ]
     }
   ],
   "plugin_metadata": {
@@ -224,7 +204,6 @@
     "cordova-plugin-whitelist": "1.3.3",
     "cordova-plugin-wkwebview-engine": "1.1.4",
     "cordova-plugin-x-toast": "2.6.0",
-    "cordova-plugin-navigationbar": "1.0.0",
-    "cordova-plugin-handheld": "1.0.0"
+    "cordova-plugin-navigationbar": "1.0.0"
   }
 }

+ 0 - 46
platforms/ios/platform_www/plugins/cordova-plugin-handheld/www/Handheld.js

@@ -1,46 +0,0 @@
-cordova.define("cordova-plugin-handheld.Handheld", function(require, exports, module) {
-var exec = require("cordova/exec");
-
-exports.scanCode = function(success, error) {
-    exec(success, error, "Handheld", "scanCode", []);
-};
-exports.stopScan = function(success, error) {
-    exec(success, error, "Handheld", "stopScan", []);
-};
-exports.readTag = function(success, error) {
-    exec(success, error, "Handheld", "readTag", []);
-};
-exports.stopRead = function(success, error) {
-    exec(success, error, "Handheld", "stopRead", []);
-};
-exports.getPicture = function(success, error, cameraOptions) {
-    exec(
-        function() {
-            navigator.camera.getPicture(
-                function(res) {
-                    exec(function() {}, function() {}, "Handheld", "resume", []);
-                    try {
-                        success(res);
-                    } catch (e) {}
-                },
-                function(err1) {
-                    exec(function() {}, function() {}, "Handheld", "resume", []);
-                    try {
-                        error(err1);
-                    } catch (e) {}
-                },
-                cameraOptions
-            );
-        },
-        function(err) {
-            try {
-                error(err);
-            } catch (e) {}
-        },
-        "Handheld",
-        "pause",
-        []
-    );
-};
-
-});

+ 0 - 16
platforms/ios/奶源追溯.xcodeproj/project.pbxproj

@@ -37,10 +37,6 @@
 		FA3A41D611EE469D99450276 /* CDVSplashScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CF0DEFBB5FB4252A3B7F12B /* CDVSplashScreen.m */; };
 		5B795C31B09047A8A92F6557 /* navigationbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 71F6777A3D2A46EB886F6920 /* navigationbar.m */; };
 		AFA2344A08964061A0B8492E /* Navigationbar.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 80D5D3653C504FAF8B981A34 /* Navigationbar.bundle */; };
-		6BDAAC5D3CFA4AC2B5BF05B7 /* Handheld.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C518DA6C4214C91B574C680 /* Handheld.m */; };
-		1DD3B4FA3E134742B9F7BED6 /* ScanViewController.h in Resources */ = {isa = PBXBuildFile; fileRef = C9DE2E9007D94C0FB6FACA2D /* ScanViewController.h */; };
-		BCB4444620B245A0B6276603 /* ScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D2C317A45FE4D3590D67900 /* ScanViewController.m */; };
-		9F10512F08104CAE87AF62B7 /* qrCodeScanner.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 091EBAC310B84B33AB5FDCF0 /* qrCodeScanner.bundle */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -135,10 +131,6 @@
 		FBB540D0ED2B4C0D9E3EA6E2 /* Toast.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = Toast.h; path = "cordova-plugin-x-toast/Toast.h"; sourceTree = "<group>"; };
 		71F6777A3D2A46EB886F6920 /* navigationbar.m */ = {isa = PBXFileReference; name = "navigationbar.m"; path = "cordova-plugin-navigationbar/navigationbar.m"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; explicitFileType = undefined; includeInIndex = 0; };
 		80D5D3653C504FAF8B981A34 /* Navigationbar.bundle */ = {isa = PBXFileReference; name = "Navigationbar.bundle"; path = "Navigationbar.bundle"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.plug-in; explicitFileType = undefined; includeInIndex = 0; };
-		0C518DA6C4214C91B574C680 /* Handheld.m */ = {isa = PBXFileReference; name = "Handheld.m"; path = "cordova-plugin-handheld/Handheld.m"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; explicitFileType = undefined; includeInIndex = 0; };
-		C9DE2E9007D94C0FB6FACA2D /* ScanViewController.h */ = {isa = PBXFileReference; name = "ScanViewController.h"; path = "cordova-plugin-handheld/ScanViewController.h"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; explicitFileType = undefined; includeInIndex = 0; };
-		4D2C317A45FE4D3590D67900 /* ScanViewController.m */ = {isa = PBXFileReference; name = "ScanViewController.m"; path = "cordova-plugin-handheld/ScanViewController.m"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; explicitFileType = undefined; includeInIndex = 0; };
-		091EBAC310B84B33AB5FDCF0 /* qrCodeScanner.bundle */ = {isa = PBXFileReference; name = "qrCodeScanner.bundle"; path = "qrCodeScanner.bundle"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.plug-in; explicitFileType = undefined; includeInIndex = 0; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -220,7 +212,6 @@
 				8D1107310486CEB800E47090 /* 奶源追溯-Info.plist */,
 				6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */,
 				80D5D3653C504FAF8B981A34 /* Navigationbar.bundle */,
-				091EBAC310B84B33AB5FDCF0 /* qrCodeScanner.bundle */,
 			);
 			name = Resources;
 			path = "奶源追溯/Resources";
@@ -288,9 +279,6 @@
 				9168D2613FF841898CDC2989 /* Toast+UIView.h */,
 				FBB540D0ED2B4C0D9E3EA6E2 /* Toast.h */,
 				71F6777A3D2A46EB886F6920 /* navigationbar.m */,
-				0C518DA6C4214C91B574C680 /* Handheld.m */,
-				C9DE2E9007D94C0FB6FACA2D /* ScanViewController.h */,
-				4D2C317A45FE4D3590D67900 /* ScanViewController.m */,
 			);
 			name = Plugins;
 			path = "奶源追溯/Plugins";
@@ -390,7 +378,6 @@
 				0207DA581B56EA530066E2B4 /* Images.xcassets in Resources */,
 				6AFF5BF91D6E424B00AB3073 /* CDVLaunchScreen.storyboard in Resources */,
 				AFA2344A08964061A0B8492E /* Navigationbar.bundle in Resources */,
-				9F10512F08104CAE87AF62B7 /* qrCodeScanner.bundle in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -435,9 +422,6 @@
 				0AA60EB40E414EFBB653CBF5 /* Toast+UIView.m in Sources */,
 				369C8EC784A34613956608BD /* Toast.m in Sources */,
 				5B795C31B09047A8A92F6557 /* navigationbar.m in Sources */,
-				6BDAAC5D3CFA4AC2B5BF05B7 /* Handheld.m in Sources */,
-				1DD3B4FA3E134742B9F7BED6 /* ScanViewController.h in Resources */,
-				BCB4444620B245A0B6276603 /* ScanViewController.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 0 - 46
platforms/ios/奶源追溯/Plugins/cordova-plugin-handheld/Handheld.m

@@ -1,46 +0,0 @@
-/********* qrCodeScanner.m Cordova Plugin Implementation *******/
-
-#import <Cordova/CDV.h>
-#import "ScanViewController.h"
-
-@interface Handheld : CDVPlugin<ScanDelegate> {
-  // Member variables go here.
-}
-@property (nonatomic, strong) CDVInvokedUrlCommand* command;
-- (void)coolMethod:(CDVInvokedUrlCommand*)command;
-- (void)scanCode:(CDVInvokedUrlCommand*)command;
-@end
-
-@implementation Handheld
-
-- (void)scanCode:(CDVInvokedUrlCommand*)command{
-    ScanViewController* scanVC = [[ScanViewController alloc] init];
-    scanVC.delegate = self;
-    self.command = command;
-    [self.viewController presentViewController:scanVC animated:YES completion:nil];
-}
-
-- (void)coolMethod:(CDVInvokedUrlCommand*)command
-{
-    
-    CDVPluginResult* pluginResult = nil;
-    NSString* echo = [command.arguments objectAtIndex:0];
-
-    if (echo != nil && [echo length] > 0) {
-        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:echo];
-    } else {
-        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
-    }
-
-    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
-}
-
-- (void)onResult:(NSString *)result {
-    NSLog(@"scan result:%@", result);
-    if (self.command) {
-        CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:result];
-        [self.commandDelegate sendPluginResult:pluginResult callbackId:self.command.callbackId];
-    }
-}
-
-@end

+ 0 - 20
platforms/ios/奶源追溯/Plugins/cordova-plugin-handheld/ScanViewController.h

@@ -1,20 +0,0 @@
-//
-//  ScanViewController.h
-//  qrCodeScanner
-//
-//  Created by 熊竹 on 18/1/23.
-//  Copyright © 2016年 熊竹. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-
-@protocol ScanDelegate <NSObject>
-- (void)onResult:(NSString *)result;
-@end
-
-@interface ScanViewController : UIViewController
-
-@property (nonatomic, weak) id <ScanDelegate> delegate;
-
-@end
-

+ 0 - 298
platforms/ios/奶源追溯/Plugins/cordova-plugin-handheld/ScanViewController.m

@@ -1,298 +0,0 @@
-//
-//  ScanViewController.m
-//  qrCodeScanner
-//
-//  Created by 熊竹 on 18/1/23.
-//  Copyright © 2016年 熊竹. All rights reserved.
-//
-
-#import "ScanViewController.h"
-#import <AVFoundation/AVFoundation.h>
-
-/**
- *  屏幕 高 宽 边界
- */
-#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
-#define SCREEN_WIDTH  [UIScreen mainScreen].bounds.size.width
-#define SCREEN_BOUNDS  [UIScreen mainScreen].bounds
-
-#define TOP (SCREEN_HEIGHT-220)/2
-#define LEFT (SCREEN_WIDTH-220)/2
-
-#define kScanRect CGRectMake(LEFT, TOP, 220, 220)
-
-@interface ScanViewController ()<AVCaptureMetadataOutputObjectsDelegate>{
-    int num;
-    BOOL upOrdown;
-    NSTimer * timer;
-    CAShapeLayer *cropLayer;
-}
-@property (strong,nonatomic)AVCaptureDevice * device;
-@property (strong,nonatomic)AVCaptureDeviceInput * input;
-@property (strong,nonatomic)AVCaptureMetadataOutput * output;
-@property (strong,nonatomic)AVCaptureSession * session;
-@property (strong,nonatomic)AVCaptureVideoPreviewLayer * preview;
-
-@property (nonatomic, strong) UIImageView * line;
-@property (nonatomic, strong) UIButton * btnFlash;
-
-@end
-
-@implementation ScanViewController
-
-- (void)viewDidLoad {
-    [super viewDidLoad];
-    // Do any additional setup after loading the view, typically from a nib.
-    
-    [self configView];
-}
-
--(void)configView{
-    [self.view setBackgroundColor:[UIColor blackColor]];
-    UIImageView * imageView = [[UIImageView alloc]initWithFrame:kScanRect];
-    NSString * bundlePath = [[ NSBundle mainBundle] pathForResource: @ "qrCodeScanner" ofType :@ "bundle"];
-    NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];
-    imageView.image = [UIImage imageNamed:@"pick_bg"
-                                 inBundle:resourceBundle
-            compatibleWithTraitCollection:nil];
-    imageView.image = [imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
-    [_line setTintColor:[self getColor:@"#2face9"]];
-    [self.view addSubview:imageView];
-    
-    upOrdown = NO;
-    num =0;
-    _line = [[UIImageView alloc] initWithFrame:CGRectMake(LEFT, TOP+10, 220, 2)];
-    _line.image = [UIImage imageNamed:@"line.png"
-                             inBundle:resourceBundle
-        compatibleWithTraitCollection:nil];
-    _line.image = [_line.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
-    [_line setTintColor:[self getColor:@"#2face9"]];
-    [self.view addSubview:_line];
-    
-    timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(animation1) userInfo:nil repeats:YES];
-    
-}
-
--(void) toggleFlash:(UIButton*)button{
-    if (self.btnFlash.isSelected) {
-        if ([_device hasTorch]) {
-            [_device lockForConfiguration:nil];
-            [_device setTorchMode: AVCaptureTorchModeOff];
-            [_device unlockForConfiguration];
-            [_btnFlash setSelected:NO];
-        }
-    }else{
-        NSError *error = nil;
-        if ([_device hasTorch]) {
-            BOOL locked = [_device lockForConfiguration:&error];
-            if (locked) {
-                _device.torchMode = AVCaptureTorchModeOn;
-                [_device unlockForConfiguration];
-                [_btnFlash setSelected:YES];
-            }
-        }
-    }
-}
-
--(void)viewWillAppear:(BOOL)animated{
-    
-    [self setCropRect:kScanRect];
-    
-    NSString * bundlePath = [[ NSBundle mainBundle] pathForResource: @ "qrCodeScanner" ofType :@ "bundle"];
-    NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];
-    _btnFlash = [[UIButton alloc] initWithFrame:CGRectMake(([UIScreen mainScreen].bounds.size.width - 72) / 2,
-                                                           ([UIScreen mainScreen].bounds.size.height + 220) / 2 + 50,
-                                                           72, 72)];
-    [_btnFlash setImage:[UIImage imageNamed:@"ic_shortcut_flash_off"
-                                   inBundle:resourceBundle
-              compatibleWithTraitCollection:nil]
-               forState:UIControlStateNormal];
-    [_btnFlash setImage:[UIImage imageNamed:@"ic_shortcut_flash_on"
-                                   inBundle:resourceBundle
-              compatibleWithTraitCollection:nil]
-               forState:UIControlStateSelected];
-    
-    [_btnFlash addTarget:self action:@selector(toggleFlash:) forControlEvents:UIControlEventTouchUpInside];
-    [self.view addSubview:_btnFlash];
-    
-    UIButton* btnBack = [[UIButton alloc] initWithFrame:CGRectMake(10, 30, 42, 42)];
-    [btnBack setImage:[UIImage imageNamed:@"prev" inBundle:resourceBundle compatibleWithTraitCollection:nil] forState:UIControlStateNormal];
-    [btnBack addTarget:self action:@selector(close:) forControlEvents:UIControlEventTouchUpInside];
-    [self.view addSubview:btnBack];
-    
-    [self performSelector:@selector(setupCamera) withObject:nil afterDelay:0];
-    
-}
-
--(void) close:(UIButton*)button{
-    [self dismissViewControllerAnimated:YES completion:nil];
-}
-
--(void)animation1
-{
-    if (upOrdown == NO) {
-        num ++;
-        _line.frame = CGRectMake(LEFT, TOP+10+2*num, 220, 2);
-        if (2*num == 200) {
-            upOrdown = YES;
-        }
-    }
-    else {
-        num --;
-        _line.frame = CGRectMake(LEFT, TOP+10+2*num, 220, 2);
-        if (num == 0) {
-            upOrdown = NO;
-        }
-    }
-    
-}
-
-
-- (void)setCropRect:(CGRect)cropRect{
-    cropLayer = [[CAShapeLayer alloc] init];
-    CGMutablePathRef path = CGPathCreateMutable();
-    CGPathAddRect(path, nil, cropRect);
-    CGPathAddRect(path, nil, self.view.bounds);
-    
-    [cropLayer setFillRule:kCAFillRuleEvenOdd];
-    [cropLayer setPath:path];
-    [cropLayer setFillColor:[UIColor blackColor].CGColor];
-    [cropLayer setOpacity:0.6];
-    
-    
-    [cropLayer setNeedsDisplay];
-    
-    [self.view.layer addSublayer:cropLayer];
-}
-
-- (void)setupCamera
-{
-    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
-    if (device==nil) {
-        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"设备没有摄像头" preferredStyle:UIAlertControllerStyleAlert];
-        [alert addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
-            
-        }]];
-        [self presentViewController:alert animated:YES completion:nil];
-        return;
-    }
-    // Device
-    _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
-    
-    // Input
-    _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
-    
-    // Output
-    _output = [[AVCaptureMetadataOutput alloc]init];
-    [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
-    
-    //设置扫描区域
-    CGFloat top = TOP/SCREEN_HEIGHT;
-    CGFloat left = LEFT/SCREEN_WIDTH;
-    CGFloat width = 220/SCREEN_WIDTH;
-    CGFloat height = 220/SCREEN_HEIGHT;
-    ///top 与 left 互换  width 与 height 互换
-    [_output setRectOfInterest:CGRectMake(top,left, height, width)];
-    
-    
-    // Session
-    _session = [[AVCaptureSession alloc]init];
-    [_session setSessionPreset:AVCaptureSessionPresetHigh];
-    if ([_session canAddInput:self.input])
-    {
-        [_session addInput:self.input];
-    }
-    
-    if ([_session canAddOutput:self.output])
-    {
-        [_session addOutput:self.output];
-    }
-    
-    // 条码类型 AVMetadataObjectTypeQRCode
-    [_output setMetadataObjectTypes:[NSArray arrayWithObjects:AVMetadataObjectTypeQRCode, nil]];
-    
-    // Preview
-    _preview =[AVCaptureVideoPreviewLayer layerWithSession:_session];
-    _preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
-    _preview.frame =self.view.layer.bounds;
-    [self.view.layer insertSublayer:_preview atIndex:0];
-    
-    // Start
-    [_session startRunning];
-}
-
-#pragma mark AVCaptureMetadataOutputObjectsDelegate
-- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
-{
-    NSString *stringValue;
-    
-    if ([metadataObjects count] >0)
-    {
-        //停止扫描
-        [_session stopRunning];
-        [timer setFireDate:[NSDate distantFuture]];
-        
-        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
-        stringValue = metadataObject.stringValue;
-        NSLog(@"扫描结果:%@",stringValue);
-        
-        //        NSArray *arry = metadataObject.corners;
-        //        for (id temp in arry) {
-        //            NSLog(@"%@",temp);
-        //        }
-        //
-        //
-        //        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"扫描结果" message:stringValue preferredStyle:UIAlertControllerStyleAlert];
-        //        [alert addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
-        //            if (_session != nil && timer != nil) {
-        //                [_session startRunning];
-        //                [timer setFireDate:[NSDate date]];
-        //            }
-        //
-        //        }]];
-        //        [self presentViewController:alert animated:YES completion:nil];
-        if(self.delegate){
-            [self.delegate onResult:stringValue];
-        }
-        [self dismissViewControllerAnimated:YES completion:nil];
-        
-    } else {
-        NSLog(@"无扫描信息");
-        return;
-    }
-    
-}
-
-
-- (void)didReceiveMemoryWarning {
-    [super didReceiveMemoryWarning];
-    // Dispose of any resources that can be recreated.
-}
-
-- (UIColor *)getColor:(NSString *)hexColor
-{
-    if ([hexColor hasPrefix:@"#"]) {
-        hexColor = [hexColor substringFromIndex:1];
-    }
-    unsigned int red,green,blue;
-    NSRange range;
-    range.length = 2;
-    range.location = 0;
-    [[NSScanner scannerWithString:[hexColor substringWithRange:range]] scanHexInt:&red];
-    range.location = 2;
-    [[NSScanner scannerWithString:[hexColor substringWithRange:range]] scanHexInt:&green];
-    range.location = 4;
-    [[NSScanner scannerWithString:[hexColor substringWithRange:range]] scanHexInt:&blue];
-    return [UIColor colorWithRed:(float)(red/255.0f) green:(float)(green / 255.0f) blue:(float)(blue / 255.0f) alpha:1.0f];
-}
-
--(UIStatusBarStyle)preferredStatusBarStyle{
-    return UIStatusBarStyleLightContent;
-}
-
--(BOOL)prefersStatusBarHidden{
-    return YES;
-}
-
-@end
-

二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/ic_shortcut_flash_off@2x.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/ic_shortcut_flash_off@3x.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/ic_shortcut_flash_on@2x.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/ic_shortcut_flash_on@3x.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/line.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/line@2x.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/pick_bg.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/pick_bg@2x.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/prev.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/prev@2x.png


二進制
platforms/ios/奶源追溯/Resources/qrCodeScanner.bundle/prev@3x.png


+ 0 - 4
platforms/ios/奶源追溯/config.xml

@@ -39,10 +39,6 @@
     <feature name="navigationbar">
         <param name="ios-package" value="navigationbar" />
     </feature>
-    <feature name="Handheld">
-        <param name="ios-package" value="Handheld" />
-        <param name="onload" value="true" />
-    </feature>
     <name>奶源追溯</name>
     <description>        A sample Apache Cordova application that responds to the deviceready event.    </description>
     <author email="dev@cordova.apache.org" href="http://cordova.io">        Apache Cordova Team    </author>

+ 0 - 2
platforms/ios/奶源追溯/奶源追溯-Info.plist

@@ -63,7 +63,5 @@
     <string>我们需要通过您的地理位置信息来获取周边数据</string>
     <key>NSLocationAlwaysUsageDescription</key>
     <string>我们需要通过您的地理位置信息来获取周边数据</string>
-    <key>NSCameraUsageDescription</key>
-    <string>需要打开相机来扫码</string>
   </dict>
 </plist>

+ 13 - 13
plugins/cordova-plugin-handheld/plugin.xml

@@ -47,16 +47,16 @@
         <source-file src="src/android/res/raw/success.wav" target-dir="res/raw" />
         <source-file src="src/android/res/raw/tag.wav" target-dir="res/raw" />
         <!--  -->
-        <source-file src="src/android/libs/armeabi/libbarcodereader.so" target-dir="libs/armeabi" />
-        <source-file src="src/android/libs/armeabi/libbarcodereader43.so" target-dir="libs/armeabi" />
-        <source-file src="src/android/libs/armeabi/libbarcodereader44_AndroidM.so" target-dir="libs/armeabi" />
-        <source-file src="src/android/libs/armeabi/libbarcodereader44.so" target-dir="libs/armeabi" />
-        <source-file src="src/android/libs/armeabi/libIAL.so" target-dir="libs/armeabi" />
-        <source-file src="src/android/libs/armeabi/libSDL.so" target-dir="libs/armeabi" />
-        <source-file src="src/android/libs/armeabi/libserial_port.so" target-dir="libs/armeabi" />
-        <source-file src="src/android/libs/armeabi/libsystem_control.so" target-dir="libs/armeabi" />
-        <source-file src="src/android/libs/armeabi/libDeviceAPI.so" target-dir="libs/armeabi" />
-        <source-file src="src/android/libs/armeabi/libModuleAPI_Android.so" target-dir="libs/armeabi" />
+        <source-file src="src/android/libs/armeabi/libbarcodereader.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="src/android/libs/armeabi/libbarcodereader43.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="src/android/libs/armeabi/libbarcodereader44_AndroidM.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="src/android/libs/armeabi/libbarcodereader44.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="src/android/libs/armeabi/libIAL.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="src/android/libs/armeabi/libSDL.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="src/android/libs/armeabi/libserial_port.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="src/android/libs/armeabi/libsystem_control.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="src/android/libs/armeabi/libDeviceAPI.so" target-dir="libs/armeabi-v7a" />
+        <source-file src="src/android/libs/armeabi/libModuleAPI_Android.so" target-dir="libs/armeabi-v7a" />
         <!-- <source-file src="src/android/libs/armeabi-v7a/libserial_port.so" target-dir="libs/armeabi-v7a" /><source-file src="src/android/libs/armeabi-v7a/libsystem_control.so" target-dir="libs/armeabi-v7a" /><source-file src="src/android/libs/arm64-v8a/libbarcodereader44.so" target-dir="libs/arm64-v8a" /><source-file src="src/android/libs/arm64-v8a/libIAL.so" target-dir="libs/arm64-v8a" /><source-file src="src/android/libs/arm64-v8a/libSDL.so" target-dir="libs/arm64-v8a" /> -->
         <source-file src="src/android/libs/ch.ntb.usb-0.5.9.jar" target-dir="libs"/>
         <source-file src="src/android/libs/invengo.irp1.jar" target-dir="libs"/>
@@ -71,10 +71,10 @@
         <source-file src="src/android/libs/trinea-android-common.jar" target-dir="libs"/>
         <source-file src="src/android/libs/UHF_API_JAR.jar" target-dir="libs"/>
         <source-file src="src/android/libs/xUtils-2.5.5.jar" target-dir="libs"/>
+        <resource-file src="src/android/libs/bga-qrcode-core.aar" target="libs/bga-qrcode-core.aar"/>
+        <resource-file src="src/android/libs/bga-qrcode-zxing.aar" target="libs/bga-qrcode-zxing.aar"/>
         <!--  -->
-        <framework src="com.google.zxing:core:3.3.0" />
-        <framework src="cn.bingoogolapple:bga-qrcodecore:1.1.9@aar" />
-        <framework src="cn.bingoogolapple:bga-zxing:1.1.9@aar" />
+        <framework src="src/android/handheld.gradle" custom="true" type="gradleReference"/>
         <framework src="com.google.code.gson:gson:2.8.2" />
     </platform>
     <platform name="ios">

+ 10 - 0
plugins/cordova-plugin-handheld/src/android/handheld.gradle

@@ -0,0 +1,10 @@
+repositories {    
+    jcenter()
+    flatDir {
+        dirs 'libs'
+    }
+}
+dependencies {
+    compile(name:'bga-qrcode-core', ext:'aar')
+    compile(name:'bga-qrcode-zxing', ext:'aar')
+}

+ 29 - 3
plugins/cordova-plugin-handheld/src/android/handheld/Handheld.java

@@ -15,6 +15,8 @@ import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.util.List;
+
 /**
  * This class echoes a string called from JavaScript.
  */
@@ -50,7 +52,15 @@ public class Handheld extends CordovaPlugin {
             callbackContext.success();
             return true;
         } else if (action.equals("readTag")) {
-            this.readTag(callbackContext);
+            ReadTagOptions options = null;
+            try {
+                JSONObject jsonObject = args.getJSONObject(0);
+                Gson gson = new Gson();
+                options = gson.fromJson(jsonObject.toString(), ReadTagOptions.class);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            this.readTag(callbackContext, options);
             return true;
         } else if (action.equals("stopRead")) {
             device.stopRead();
@@ -79,14 +89,30 @@ public class Handheld extends CordovaPlugin {
         });
     }
 
-    private void readTag(final CallbackContext callbackContext) {
-        device.readTag(new Device.ReadTagListener() {
+    private void readTag(final CallbackContext callbackContext, ReadTagOptions options) {
+        if (options == null) {
+            options = new ReadTagOptions();
+        }
+        device.readTag(options, new Device.ReadTagListener() {
             @Override
             public void onReadData(TagData tagData) {
                 Gson gson = new Gson();
                 try {
                     JSONObject jsonObject = new JSONObject(gson.toJson(tagData));
                     PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, jsonObject);
+                    pluginResult.setKeepCallback(false);
+                    callbackContext.sendPluginResult(pluginResult);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            @Override
+            public void onReadData(List<TagData> list) {
+                Gson gson = new Gson();
+                try {
+                    JSONArray jsonArray = new JSONArray(gson.toJson(list));
+                    PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, jsonArray);
                     pluginResult.setKeepCallback(true);
                     callbackContext.sendPluginResult(pluginResult);
                 } catch (JSONException e) {

+ 22 - 0
plugins/cordova-plugin-handheld/src/android/handheld/ReadTagOptions.java

@@ -0,0 +1,22 @@
+package com.izouma.handheld;
+
+public class ReadTagOptions {
+    private boolean single;
+    private Integer power;
+
+    public boolean isSingle() {
+        return single;
+    }
+
+    public void setSingle(boolean single) {
+        this.single = single;
+    }
+
+    public Integer getPower() {
+        return power;
+    }
+
+    public void setPower(Integer power) {
+        this.power = power;
+    }
+}

+ 7 - 1
plugins/cordova-plugin-handheld/src/android/handheld/device/Device.java

@@ -3,13 +3,17 @@ package com.izouma.handheld.device;
 import android.content.Intent;
 import android.view.KeyEvent;
 
+import com.izouma.handheld.ReadTagOptions;
 import com.izouma.handheld.TagData;
 
+import java.util.List;
+
 /**
  * Created by xiongzhu on 2018/3/20.
  */
 
 public abstract class Device {
+    protected final static String TAG = "Handheld Device";
 
     public void init() {
     }
@@ -20,7 +24,7 @@ public abstract class Device {
     public void stopScan() {
     }
 
-    public void readTag(ReadTagListener listener) {
+    public void readTag(ReadTagOptions options, ReadTagListener listener) {
     }
 
     public void stopRead() {
@@ -44,5 +48,7 @@ public abstract class Device {
 
     public interface ReadTagListener {
         void onReadData(TagData tagData);
+
+        void onReadData(List<TagData> list);
     }
 }

+ 2 - 1
plugins/cordova-plugin-handheld/src/android/handheld/device/DeviceInvengo.java

@@ -11,6 +11,7 @@ import android.util.Log;
 import android.view.KeyEvent;
 import android.widget.Toast;
 
+import com.izouma.handheld.ReadTagOptions;
 import com.izouma.handheld.TagData;
 import com.izouma.handheld.VoiceManager;
 import com.zebra.adc.decoder.Barcode2DWithSoft;
@@ -150,7 +151,7 @@ public class DeviceInvengo extends Device implements Barcode2DWithSoft.ScanCallb
     }
 
     @Override
-    public void readTag(ReadTagListener listener) {
+    public void readTag(ReadTagOptions options, ReadTagListener listener) {
         this.readTagListener = listener;
         new Thread(new Runnable() {
             public void run() {

+ 93 - 12
plugins/cordova-plugin-handheld/src/android/handheld/device/DeviceSupoin.java

@@ -16,14 +16,24 @@ import android.text.TextUtils;
 import android.util.Log;
 import android.widget.Toast;
 
+import com.izouma.handheld.ReadTagOptions;
+import com.izouma.handheld.TagData;
+import com.izouma.handheld.VoiceManager;
 import com.uhf.api.cls.Reader;
 import com.uhf.uhf.Common.Comm;
+import com.uhf.uhf.Common.InventoryBuffer;
 import com.uhf.uhf.UHF1.UHF001;
 import com.uhf.uhf.UHF1.UHF1Application;
 import com.uhf.uhf.UHF1Function.SPconfig;
 import com.uhf.uhf.UHF6.UHF006;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.uhf.uhf.Common.Comm.lsTagList;
+import static com.uhf.uhf.Common.Comm.operateType.nullOperate;
 import static com.uhf.uhf.Common.Comm.soundPool;
+import static com.uhf.uhf.Common.Comm.tag;
 
 /**
  * Created by xiongzhu on 2018/3/20.
@@ -37,8 +47,11 @@ public class DeviceSupoin extends Device {
     private ScanCodeListener  scanCodeListener;
     private ReadTagListener   readTagListener;
     private BroadcastReceiver receiver;
+    private AlertDialog       dialog;
+    private VoiceManager      mVoiceManager;
+    private boolean           singleMode;
+    private int               soundId;
     private boolean handleResult = false;
-    private AlertDialog dialog;
 
     @SuppressLint("HandlerLeak")
     private Handler connectH = new Handler() {
@@ -60,7 +73,7 @@ public class DeviceSupoin extends Device {
                 }
             } catch (Exception e) {
                 e.printStackTrace();
-                Log.e("connectH", e.getMessage().toString());
+                Log.e("connectH", e.getMessage());
             }
         }
     };
@@ -73,17 +86,74 @@ public class DeviceSupoin extends Device {
             try {
                 Comm.tagListSize = Comm.lsTagList.size();
                 Bundle bd = msg.getData();
-
                 int readCount = bd.getInt("readCount");
-                if (readCount > 0)
-                    if (Comm.tagListSize > 0) {
-
+                if (readCount > 0 && Comm.tagListSize > 0) {
+                    List<TagData> list = new ArrayList<TagData>();
+                    for (InventoryBuffer.InventoryTagMap tagMap : lsTagList) {
+                        TagData tagData = new TagData();
+                        tagData.setEpc(tagMap.strEPC);
+                        tagData.setRssi(tagMap.strRSSI);
+                        list.add(tagData);
                     }
-                Log.e("uhfhandler", "readCount : " + String.valueOf(readCount));
+                    readTagListener.onReadData(list);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    };
+
+    @SuppressLint("HandlerLeak")
+    private android.os.Handler tagOpehandler = new android.os.Handler() {
+        @SuppressWarnings({"unchecked", "unused"})
+        @Override
+        public void handleMessage(Message msg) {
+            playBeep();
+            try {
+                Bundle b = msg.getData();
+                switch (Comm.opeT) {
+                    case readOpe:
+                        String strErr = b.getString("Err");
+                        String strEPC = b.getString("readData");
+                        if (!TextUtils.isEmpty(strEPC)) {
+                            TagData tagData = new TagData();
+                            tagData.setEpc(strEPC);
+                            readTagListener.onReadData(tagData);
+                        } else {
+                            Log.e(TAG, "Read Fail: " + strErr);
+                        }
+                        break;
+                    case writeOpe:
+                        boolean isWriteSucceed = b.getBoolean("isWriteSucceed");
+                        if (isWriteSucceed) {
+                            Toast.makeText(context, "Write Succeed", Toast.LENGTH_SHORT).show();
+                            Log.d("UHF", "Write Succeed");
+                        } else {
+                            Toast.makeText(context, "Write Fail", Toast.LENGTH_SHORT).show();
+                        }
+                        break;
+                    case writeepcOpe:
+                        boolean isWriteEPCSucceed = b.getBoolean("isWriteSucceed");
+                        if (isWriteEPCSucceed) {
+                            Toast.makeText(context, "Write Succeed", Toast.LENGTH_SHORT).show();
+                        } else {
+                            Toast.makeText(context, "Write Fail", Toast.LENGTH_SHORT).show();
+                        }
+                        break;
+                    case lockOpe:
+                        boolean isLockSucceed = b.getBoolean("isLockSucceed");
+                        if (isLockSucceed)
+                            Toast.makeText(context, "Lock Succeed", Toast.LENGTH_SHORT).show();
+                        else
+                            Toast.makeText(context, "Lock Fail", Toast.LENGTH_SHORT).show();
+                        break;
+                    default:
+                        break;
+                }
             } catch (Exception e) {
                 e.printStackTrace();
-                Log.e("uhfhandler", e.getMessage().toString());
             }
+            Comm.opeT = nullOperate;
         }
     };
 
@@ -111,7 +181,7 @@ public class DeviceSupoin extends Device {
         filter.addAction(ACTION_ON_OFF);
         filter.addAction(ACTION_SCAN);
         context.registerReceiver(receiver, filter);
-
+        mVoiceManager = VoiceManager.getInstance(context.getApplicationContext());
 
     }
 
@@ -140,9 +210,15 @@ public class DeviceSupoin extends Device {
     }
 
     @Override
-    public void readTag(ReadTagListener listener) {
+    public void readTag(ReadTagOptions options, ReadTagListener listener) {
         this.readTagListener = listener;
-        Comm.startScan();
+        this.singleMode = options.isSingle();
+        if (singleMode) {
+            Comm.opeT = Comm.operateType.readOpe;
+            Comm.readTag(0, 1, "6", "2", 0);
+        } else {
+            Comm.startScan();
+        }
     }
 
     @Override
@@ -157,7 +233,7 @@ public class DeviceSupoin extends Device {
         Comm.app = new UHF1Application();
         Comm.spConfig = new SPconfig(context);
         Comm.soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
-        soundPool.load(context, context.getResources().getIdentifier("success", "raw", context.getPackageName()), 1);
+        soundId = soundPool.load(context, context.getResources().getIdentifier("success", "raw", context.getPackageName()), 1);
         Comm.checkDevice();
         if (!Comm.powerUp()) {
             Comm.powerDown();
@@ -165,6 +241,7 @@ public class DeviceSupoin extends Device {
         if (Comm.powerUp()) {
             Toast.makeText(context, "success", Toast.LENGTH_SHORT).show();
             Comm.connecthandler = connectH;
+            Comm.mRWLHandler = tagOpehandler;
             Comm.Connect();
 
             int[] val = new int[]{-1};
@@ -196,4 +273,8 @@ public class DeviceSupoin extends Device {
         context.unregisterReceiver(receiver);
         stopScan();
     }
+
+    private void playBeep() {
+        soundPool.play(soundId, 1, 1, 1, 0, 1f);
+    }
 }

二進制
plugins/cordova-plugin-handheld/src/android/libs/bga-qrcode-core.aar


二進制
plugins/cordova-plugin-handheld/src/android/libs/bga-qrcode-zxing.aar


+ 1 - 1
plugins/cordova-plugin-handheld/src/android/res/layout/activity_scan.xml

@@ -4,7 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context="cn.x1ongzhu.qrCodeScanner.ScanActivity">
+    tools:context="com.izouma.handheld.ScanActivity">
 
 
     <cn.bingoogolapple.qrcode.zxing.ZXingView

+ 2 - 2
plugins/cordova-plugin-handheld/www/Handheld.js

@@ -6,8 +6,8 @@ exports.scanCode = function(success, error) {
 exports.stopScan = function(success, error) {
     exec(success, error, "Handheld", "stopScan", []);
 };
-exports.readTag = function(success, error) {
-    exec(success, error, "Handheld", "readTag", []);
+exports.readTag = function(success, error, options) {
+    exec(success, error, "Handheld", "readTag", [options]);
 };
 exports.stopRead = function(success, error) {
     exec(success, error, "Handheld", "stopRead", []);