Ver Fonte

Merge pull request #26 from liyihz2008/master

上传移动端源代码
o2oa há 7 anos atrás
pai
commit
8525e5f418
100 ficheiros alterados com 8511 adições e 0 exclusões
  1. 61 0
      o2android/.gitignore
  2. 4 0
      o2android/README.md
  3. 9 0
      o2android/app/.gitignore
  4. 2 0
      o2android/app/.settings/org.eclipse.buildship.core.prefs
  5. BIN
      o2android/app/assets/OpenSans-Light.ttf
  6. BIN
      o2android/app/assets/OpenSans-Regular.ttf
  7. BIN
      o2android/app/assets/bd_etts_common_speech_as_mand_eng_high_am_v3.0.0_20170516.dat
  8. BIN
      o2android/app/assets/bd_etts_common_speech_f7_mand_eng_high_am-mix_v3.0.0_20170512.dat
  9. BIN
      o2android/app/assets/bd_etts_common_speech_m15_mand_eng_high_am-mix_v3.0.0_20170505.dat
  10. BIN
      o2android/app/assets/bd_etts_common_speech_yyjw_mand_eng_high_am-mix_v3.0.0_20170512.dat
  11. BIN
      o2android/app/assets/bd_etts_text.dat
  12. BIN
      o2android/app/assets/fonts/fontawesome-webfont.ttf
  13. BIN
      o2android/app/assets/goodgoodstudy.zip
  14. 83 0
      o2android/app/assets/html/huawei.html
  15. 78 0
      o2android/app/assets/html/xiaomi.html
  16. BIN
      o2android/app/assets/j_qinqin.png
  17. 27 0
      o2android/app/assets/kaomoji
  18. 4070 0
      o2android/app/assets/province_data.xml
  19. 8 0
      o2android/app/assets/server.json
  20. 319 0
      o2android/app/build.gradle
  21. BIN
      o2android/app/debug.keystore
  22. BIN
      o2android/app/libs/BaiduLBS_Android.jar
  23. BIN
      o2android/app/libs/MGFaceppSDK-0.5.2.aar
  24. BIN
      o2android/app/libs/MGLicenseManagerSDK-0.3.1.aar
  25. BIN
      o2android/app/libs/android-logging-log4j-1.0.3.jar
  26. BIN
      o2android/app/libs/armeabi-v7a/libBDSpeechDecoder_V1.so
  27. BIN
      o2android/app/libs/armeabi-v7a/libBaiduMapSDK_base_v4_3_0.so
  28. BIN
      o2android/app/libs/armeabi-v7a/libBaiduMapSDK_map_v4_3_0.so
  29. BIN
      o2android/app/libs/armeabi-v7a/libBaiduSpeechSDK.so
  30. BIN
      o2android/app/libs/armeabi-v7a/libbdEASRAndroid.so
  31. BIN
      o2android/app/libs/armeabi-v7a/libbdSpilWakeup.so
  32. BIN
      o2android/app/libs/armeabi-v7a/libbd_easr_s1_merge_normal_20151216.dat.so
  33. BIN
      o2android/app/libs/armeabi-v7a/libbd_etts.so
  34. BIN
      o2android/app/libs/armeabi-v7a/libbdtts.so
  35. BIN
      o2android/app/libs/armeabi-v7a/libgnustl_shared.so
  36. BIN
      o2android/app/libs/armeabi-v7a/libjcore119.so
  37. BIN
      o2android/app/libs/armeabi-v7a/liblbs.so
  38. BIN
      o2android/app/libs/armeabi-v7a/liblocSDK7a.so
  39. BIN
      o2android/app/libs/armeabi-v7a/libvad.dnn.so
  40. BIN
      o2android/app/libs/armeabi/libBDSpeechDecoder_V1.so
  41. BIN
      o2android/app/libs/armeabi/libBaiduMapSDK_base_v4_3_0.so
  42. BIN
      o2android/app/libs/armeabi/libBaiduMapSDK_map_v4_3_0.so
  43. BIN
      o2android/app/libs/armeabi/libBaiduSpeechSDK.so
  44. BIN
      o2android/app/libs/armeabi/libbdEASRAndroid.so
  45. BIN
      o2android/app/libs/armeabi/libbdSpilWakeup.so
  46. BIN
      o2android/app/libs/armeabi/libbd_easr_s1_merge_normal_20151216.dat.so
  47. BIN
      o2android/app/libs/armeabi/libbd_etts.so
  48. BIN
      o2android/app/libs/armeabi/libbdtts.so
  49. BIN
      o2android/app/libs/armeabi/libgnustl_shared.so
  50. BIN
      o2android/app/libs/armeabi/libjcore119.so
  51. BIN
      o2android/app/libs/armeabi/liblbs.so
  52. BIN
      o2android/app/libs/armeabi/liblocSDK7a.so
  53. BIN
      o2android/app/libs/armeabi/libvad.dnn.so
  54. BIN
      o2android/app/libs/bdasr_V3_20180320_9066860.jar
  55. BIN
      o2android/app/libs/com.baidu.tts_2.3.1.20170808_e39ea89.jar
  56. BIN
      o2android/app/libs/gson-2.2.1.jar
  57. BIN
      o2android/app/libs/log4j-1.2.17.jar
  58. BIN
      o2android/app/libs/material-calendarview-fancy-1.1.aar
  59. BIN
      o2android/app/libs/o2_auth_sdk.jar
  60. BIN
      o2android/app/libs/pgyer_sdk_2.2.2.jar
  61. BIN
      o2android/app/libs/picasso-2.5.2.jar
  62. BIN
      o2android/app/libs/pinyin4j-2.5.0.jar
  63. BIN
      o2android/app/libs/tbs_sdk_thirdapp_v3.2.0.1104_43200.jar
  64. BIN
      o2android/app/libs/universal-image-loader-1.9.5.jar
  65. BIN
      o2android/app/libs/zxing.jar
  66. 1 0
      o2android/app/multidex_keep_file.pro
  67. 560 0
      o2android/app/proguard-rules.pro
  68. 26 0
      o2android/app/src/androidTest/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/ApplicationTest.java
  69. 507 0
      o2android/app/src/main/AndroidManifest.xml
  70. 79 0
      o2android/app/src/main/java/com/baidu/android/tts/InitConfig.java
  71. 13 0
      o2android/app/src/main/java/com/baidu/android/tts/MainHandlerConstant.java
  72. 103 0
      o2android/app/src/main/java/com/baidu/android/tts/MessageListener.java
  73. 200 0
      o2android/app/src/main/java/com/baidu/android/tts/MySyntherizer.java
  74. 103 0
      o2android/app/src/main/java/com/baidu/android/tts/OfflineResource.java
  75. 69 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/control/ErrorTranslation.java
  76. 115 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/control/MyRecognizer.java
  77. 144 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/ChainRecogListener.java
  78. 131 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/CommonRecogParams.java
  79. 61 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/IRecogListener.java
  80. 23 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/IStatus.java
  81. 158 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/MessageStatusRecogListener.java
  82. 114 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/RecogEventAdapter.java
  83. 134 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/RecogResult.java
  84. 101 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/StatusRecogListener.java
  85. 37 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/all/AllRecogParams.java
  86. 72 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/inputstream/FileAudioInputStream.java
  87. 67 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/inputstream/InFileStream.java
  88. 95 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/inputstream/MyMicrophoneInputStream.java
  89. 53 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/nlu/NluRecogParams.java
  90. 59 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/offline/OfflineRecogParams.java
  91. 34 0
      o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/online/OnlineRecogParams.java
  92. 364 0
      o2android/app/src/main/java/com/bigkoo/convenientbanner/ConvenientBanner.java
  93. 49 0
      o2android/app/src/main/java/com/bigkoo/convenientbanner/ViewPagerScroller.java
  94. 107 0
      o2android/app/src/main/java/com/bigkoo/convenientbanner/adapter/CBPageAdapter.java
  95. 10 0
      o2android/app/src/main/java/com/bigkoo/convenientbanner/holder/CBViewHolderCreator.java
  96. 14 0
      o2android/app/src/main/java/com/bigkoo/convenientbanner/holder/Holder.java
  97. 45 0
      o2android/app/src/main/java/com/bigkoo/convenientbanner/listener/CBPageChangeListener.java
  98. 8 0
      o2android/app/src/main/java/com/bigkoo/convenientbanner/listener/OnItemClickListener.java
  99. 26 0
      o2android/app/src/main/java/com/bigkoo/convenientbanner/transformer/ScaleYTransformer.java
  100. 168 0
      o2android/app/src/main/java/com/bigkoo/convenientbanner/view/CBLoopViewPager.java

+ 61 - 0
o2android/.gitignore

@@ -0,0 +1,61 @@
+/PushSDK/build/
+.DS_Store
+/captures
+.svn/
+
+reports/
+
+# Built application files
+*.apk
+*.ap_
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+out/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# Intellij
+*.iml
+.idea/
+
+# VsCode
+.vscode/
+
+# Keystore files
+*.jks
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+
+# Google Services (e.g. APIs or Firebase)
+google-services.json
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json

+ 4 - 0
o2android/README.md

@@ -0,0 +1,4 @@
+#O2办公平台(O2OA)
+
+[O2办公平台(O2OA)](https://www.pgyer.com/ZhiHe_android)是一个可以自定义的私有化高效云工作平台,私有安全,创意无限
+

+ 9 - 0
o2android/app/.gitignore

@@ -0,0 +1,9 @@
+/build
+
+# VsCode
+.vscode/
+
+# RELEASE
+O2PLATFORM/
+huawei/
+xiaomi/

+ 2 - 0
o2android/app/.settings/org.eclipse.buildship.core.prefs

@@ -0,0 +1,2 @@
+connection.project.dir=
+eclipse.preferences.version=1

BIN
o2android/app/assets/OpenSans-Light.ttf


BIN
o2android/app/assets/OpenSans-Regular.ttf


BIN
o2android/app/assets/bd_etts_common_speech_as_mand_eng_high_am_v3.0.0_20170516.dat


BIN
o2android/app/assets/bd_etts_common_speech_f7_mand_eng_high_am-mix_v3.0.0_20170512.dat


BIN
o2android/app/assets/bd_etts_common_speech_m15_mand_eng_high_am-mix_v3.0.0_20170505.dat


BIN
o2android/app/assets/bd_etts_common_speech_yyjw_mand_eng_high_am-mix_v3.0.0_20170512.dat


BIN
o2android/app/assets/bd_etts_text.dat


BIN
o2android/app/assets/fonts/fontawesome-webfont.ttf


BIN
o2android/app/assets/goodgoodstudy.zip


+ 83 - 0
o2android/app/assets/html/huawei.html

@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>O2-帮助</title>
+    <style type="text/css">
+        body {
+            padding: 10px;
+        }
+    </style>
+    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
+    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
+          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
+    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
+    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"
+            integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
+            crossorigin="anonymous"></script>
+
+</head>
+<body>
+<div class="panel panel-default">
+    <div class="panel-heading">
+        <h3 class="panel-title"> 华为消息提醒设置说明 </h3>
+    </div>
+    <div class="panel-body">
+        <p class="p1">
+            华为手机需要开启O2自动启动、关闭锁屏清理应用和开启O2通知,主要是解决使用O2无法及时收到新的消息通知(需要重新打开O2才能收到新的消息提醒)。
+        </p>
+        <p>
+            <span style="color: rgb(255, 0, 0);">PS:如果你能接收消息通知,请忽略</span>
+            <br><br>
+            <strong>导致原因:</strong>
+            <br>
+            因为华为手机系统在黑屏待机后自动清理后台运行的软件,这样影响了我们正常接收新的消息,需要将O2设置为非清理应用。
+        </p>
+        <p class="p1">
+            <strong>如何设置:</strong>
+        </p>
+        <p class="p1">
+            <span class="s1">1.</span>关闭锁屏清理应用
+        </p>
+        <p class="p3">
+            <span class="s2">操作步骤:</span>
+            <span class="s3">设置-电池-锁屏清理应用,找到O2,关闭锁屏清理开关,参见下面的GIF动画:</span>
+            <br>
+            <img alt="" src="http://muliba.u.qiniudn.com/o2/20170920/%E9%94%81%E5%B1%8F%E6%B8%85%E7%90%86.gif"
+                 style="width: 100%;">
+        </p>
+        <p class="p2">&nbsp;</p>
+        <p class="p1">
+            <span class="s1">2.</span>开启自动运行
+        </p>
+        <p class="p3">
+            <span class="s2">操作步骤:</span>
+            <span class="s3">找到手机管家-自启管理,找到O2并允许自启动,参见下面的GIF动画:</span>
+            <br>
+            <img alt="" src="http://muliba.u.qiniudn.com/o2/20170920/%E5%BC%80%E5%90%AF%E8%87%AA%E5%90%AF%E5%8A%A8.gif"
+                 style="width: 100%;">
+        </p>
+        <p class="p2">&nbsp;</p>
+        <p class="p1"><span class="s1">3.</span>通知设置</p>
+        <p class="p1">
+            <span class="s2">操作步骤:</span>
+            <span class="s3">设置-通知和状态栏-通知管理,找到O2-开启允许通知及其他开关。参见下面的GIF动画:</span>
+            <br><img alt="" src="http://muliba.u.qiniudn.com/o2/20170920/%E9%80%9A%E7%9F%A5%E8%AE%BE%E7%BD%AE.gif"
+                     style="width: 100%;">
+        </p>
+        <p class="p2">&nbsp;</p>
+        <p class="p1"><span class="s1">4.</span>多任务界面锁定O2</p>
+        <p class="p1">
+            <span class="s2">操作步骤:</span>
+            <span class="s3">点击手机右下角的功能键-进入多任务页面-找到O2,点击O2右上角锁图标锁定。参见下面的GIF动画:</span>
+            <br><img alt="" src="http://muliba.u.qiniudn.com/o2/20170920/%E5%A4%9A%E4%BB%BB%E5%8A%A1.gif"
+                     style="width: 100%;">
+        </p>
+        <p class="p2">&nbsp;</p>
+
+    </div>
+</div>
+</body>
+</html>

+ 78 - 0
o2android/app/assets/html/xiaomi.html

@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>O2-帮助</title>
+    <style type="text/css">
+        body {
+            padding: 10px;
+        }
+    </style>
+    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
+    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
+          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
+    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
+    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"
+            integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
+            crossorigin="anonymous"></script>
+
+</head>
+<body>
+<div class="panel panel-default">
+    <div class="panel-heading">
+        <h3 class="panel-title"> 小米手机消息提醒设置说明 </h3>
+    </div>
+    <div class="panel-body">
+        <p>小米手机需要开启O2自动运行应用程序,主要是解决使用O2无法及时收到新的消息通知(需要重新打开O2才能收到新的消息提醒)。</p>
+        <p>
+            <span style="color: rgb(255, 0, 0);">PS:如果你能接收消息通知,请忽略</span>
+            <br><br>
+            <strong>导致原因:</strong>
+            <br>
+            因为小米手机系统在黑屏待机后自动清理后台运行的软件,这样影响了我们正常接收新的消息,需要将O2设置为自动运行应用程序。
+        </p>
+        <p class="p1">
+            <strong>如何设置:</strong>
+        </p>
+        <p class="p1">
+            <span class="s1">1.</span>开启自动启动
+        </p>
+        <p class="p3">
+            <span class="s2">操作步骤:</span>
+            <span class="s3">手机找到并点击 安全中心-授权管理-自启动管理-找到O2开启开关。参见下面的GIF动画:</span>
+            <br>
+            <img alt="" src="http://muliba.u.qiniudn.com/o2/20170921/%E5%B0%8F%E7%B1%B3%E8%87%AA%E5%90%AF%E5%8A%A8.gif"
+                 style="width: 100%;">
+        </p>
+        <p class="p2">&nbsp;</p>
+        <p class="p1"><span class="s1">2.</span>神隐模式</p>
+        <p class="p1">
+            <span class="s2">操作步骤:</span>
+            <span class="s3">手机设置-电量和性能-神隐模式-应用配置-找到O2-点击无限制并允许定位。参见下面的GIF动画:</span>
+            <br><img alt="" src="http://muliba.u.qiniudn.com/o2/20170921/%E5%B0%8F%E7%B1%B3%E7%A5%9E%E9%9A%90%E6%A8%A1%E5%BC%8F.gif"
+                     style="width: 100%;">
+        </p>
+        <p class="p2">&nbsp;</p>
+        <p class="p1"><span class="s1">3.</span>通知设置</p>
+        <p class="p1">
+            <span class="s2">操作步骤:</span>
+            <span class="s3">手机设置-通知和状态栏-通知管理-找到O2-开启允许通知和其他选项。参见下面的GIF动画:</span>
+            <br><img alt="" src="http://muliba.u.qiniudn.com/o2/20170921/%E5%B0%8F%E7%B1%B3%E9%80%9A%E7%9F%A5%E8%AE%BE%E7%BD%AE.gif"
+                     style="width: 100%;">
+        </p>
+        <p class="p2">&nbsp;</p>
+        <p class="p1"><span class="s1">4.</span>多任务界面锁定O2</p>
+        <p class="p1">
+            <span class="s2">操作步骤:</span>
+            <span class="s3">点击手机左下角的功能键-进入多任务页面-找到O2-拖曳O2下滑-点击锁定任务。参见下面的GIF动画:</span>
+            <br><img alt="" src="http://muliba.u.qiniudn.com/o2/20170921/%E5%B0%8F%E7%B1%B3%E5%A4%9A%E4%BB%BB%E5%8A%A1.gif"
+                     style="width: 100%;">
+        </p>
+        <p class="p2">&nbsp;</p>
+
+    </div>
+</div>
+</body>
+</html>

BIN
o2android/app/assets/j_qinqin.png


+ 27 - 0
o2android/app/assets/kaomoji

@@ -0,0 +1,27 @@
+(๑‾ ꇴ ‾๑)好哒
+๑乛◡乛๑嘿嘿
+(/ω·\*)捂脸
+(๑⁼̴̀д⁼̴́๑)可恶
+(๑•॒̀ ູ॒•́๑)啦啦啦
+(づ ̄³ ̄)づ抱抱
+("▔□▔)汗
+<(ˉ^ˉ)>哼
+( ꒪Д꒪)吓尿
+( ・᷄д・᷅ )委屈
+(  ˃᷄˶˶̫˶˂᷅  )羞
+눈_눈
+Ծ‸Ծ
+(๑˙ー˙๑)
+( ´・ᴗ・` )
+٩(˃̶͈̀௰˂̶͈́)و加油
+(⺣◡⺣)♡喜欢哒
+(= ̄ω ̄=)喵
+(σ゚∀゚)σ呦呦
+ԅ( ¯་། ¯ԅ)
+◝( ˙ ꒳ ˙ )◜
+(っ˘̩╭╮˘̩)っ
+(⁍̥̥̥᷄д⁍̥̥̥᷅ ू )伤心
+( ・᷄ ᵌ・᷅ )我要嘛
+(ಥ_ಥ)爱不爱我
+(◕‿◕✿)
+╮( ̄⊿ ̄”)╭无奈

+ 4070 - 0
o2android/app/assets/province_data.xml

@@ -0,0 +1,4070 @@
+<root>
+    <province name="安徽省">
+        <city name="安庆市">
+            <district name="枞阳县" zipcode="246000" />
+            <district name="大观区" zipcode="246000" />
+            <district name="怀宁县" zipcode="246000" />
+            <district name="潜山县" zipcode="246000" />
+            <district name="宿松县" zipcode="246000" />
+            <district name="太湖县" zipcode="246000" />
+            <district name="桐城市" zipcode="246000" />
+            <district name="望江县" zipcode="246000" />
+            <district name="宜秀区" zipcode="246000" />
+            <district name="迎江区" zipcode="246000" />
+            <district name="岳西县" zipcode="246000" />
+            <district name="其他" zipcode="246000" />
+        </city>
+        <city name="蚌埠市">
+            <district name="蚌山区" zipcode="233000" />
+            <district name="固镇县" zipcode="233000" />
+            <district name="怀远县" zipcode="233000" />
+            <district name="淮上区" zipcode="233000" />
+            <district name="龙子湖区" zipcode="233000" />
+            <district name="五河县" zipcode="233000" />
+            <district name="禹会区" zipcode="233000" />
+            <district name="其他" zipcode="233000" />
+        </city>
+        <city name="亳州市">
+            <district name="利辛县" zipcode="236000" />
+            <district name="蒙城县" zipcode="236000" />
+            <district name="谯城区" zipcode="236000" />
+            <district name="涡阳县" zipcode="236000" />
+            <district name="其他" zipcode="236000" />
+        </city>
+        <city name="池州市">
+            <district name="东至县" zipcode="247100" />
+            <district name="贵池区" zipcode="247100" />
+            <district name="青阳县" zipcode="247100" />
+            <district name="石台县" zipcode="247100" />
+            <district name="其他" zipcode="247100" />
+        </city>
+        <city name="滁州市">
+            <district name="定远县" zipcode="239000" />
+            <district name="凤阳县" zipcode="239000" />
+            <district name="来安县" zipcode="239000" />
+            <district name="琅琊区" zipcode="239000" />
+            <district name="明光市" zipcode="239000" />
+            <district name="南谯区" zipcode="239000" />
+            <district name="全椒县" zipcode="239000" />
+            <district name="天长市" zipcode="239000" />
+            <district name="其他" zipcode="239000" />
+        </city>
+        <city name="阜阳市">
+            <district name="阜南县" zipcode="236100" />
+            <district name="界首市" zipcode="236100" />
+            <district name="临泉县" zipcode="236100" />
+            <district name="太和县" zipcode="236100" />
+            <district name="颍东区" zipcode="236100" />
+            <district name="颍泉区" zipcode="236100" />
+            <district name="颍上县" zipcode="236100" />
+            <district name="颍州区" zipcode="236100" />
+            <district name="其他" zipcode="236100" />
+        </city>
+        <city name="合肥市">
+            <district name="包河区" zipcode="230000" />
+            <district name="长丰县" zipcode="230000" />
+            <district name="肥东县" zipcode="230000" />
+            <district name="肥西县" zipcode="230000" />
+            <district name="庐江县" zipcode="230000" />
+            <district name="蜀山区" zipcode="230000" />
+            <district name="瑶海区" zipcode="230000" />
+            <district name="巢湖市" zipcode="230000" />
+            <district name="其他" zipcode="230000" />
+        </city>
+        <city name="淮北市">
+            <district name="杜集区" zipcode="235000" />
+            <district name="烈山区" zipcode="235000" />
+            <district name="濉溪县" zipcode="235000" />
+            <district name="相山区" zipcode="235000" />
+            <district name="其他" zipcode="235000" />
+        </city>
+        <city name="淮南市">
+            <district name="八公山区" zipcode="232000" />
+            <district name="大通区" zipcode="232000" />
+            <district name="凤台县" zipcode="232000" />
+            <district name="潘集区" zipcode="232000" />
+            <district name="田家庵区" zipcode="232000" />
+            <district name="谢家集区" zipcode="232000" />
+            <district name="寿县" zipcode="232000" />
+            <district name="其他" zipcode="232000" />
+        </city>
+        <city name="黄山市">
+            <district name="黄山区" zipcode="242700" />
+            <district name="徽州区" zipcode="242700" />
+            <district name="祁门县" zipcode="242700" />
+            <district name="屯溪区" zipcode="242700" />
+            <district name="歙县" zipcode="242700" />
+            <district name="休宁县" zipcode="242700" />
+            <district name="黟县" zipcode="242700" />
+            <district name="其他" zipcode="242700" />
+        </city>
+        <city name="六安市">
+            <district name="霍邱县" zipcode="237000" />
+            <district name="霍山县" zipcode="237000" />
+            <district name="金安区" zipcode="237000" />
+            <district name="金寨县" zipcode="237000" />
+            <district name="寿县" zipcode="237000" />
+            <district name="舒城县" zipcode="237000" />
+            <district name="裕安区" zipcode="237000" />
+            <district name="其他" zipcode="237000" />
+        </city>
+        <city name="马鞍山市">
+            <district name="当涂县" zipcode="243000" />
+            <district name="花山区" zipcode="243000" />
+            <district name="含山县" zipcode="243000" />
+            <district name="雨山区" zipcode="243000" />
+            <district name="博望区" zipcode="243000" />
+            <district name="和县" zipcode="243000" />
+            <district name="其他" zipcode="243000" />
+        </city>
+        <city name="宿州市">
+            <district name="砀山县" zipcode="234100" />
+            <district name="灵璧县" zipcode="234100" />
+            <district name="泗县" zipcode="234100" />
+            <district name="萧县" zipcode="234100" />
+            <district name="墉桥区" zipcode="234100" />
+            <district name="其他" zipcode="234100" />
+        </city>
+        <city name="铜陵市">
+            <district name="郊区" zipcode="244000" />
+            <district name="铜官山区" zipcode="244000" />
+            <district name="义安区" zipcode="244000" />
+            <district name="枞阳县" zipcode="244000" />
+            <district name="其他" zipcode="244000" />
+        </city>
+        <city name="芜湖市">
+            <district name="繁昌县" zipcode="241000" />
+            <district name="镜湖区" zipcode="241000" />
+            <district name="鸠江区" zipcode="241000" />
+            <district name="南陵县" zipcode="241000" />
+            <district name="三山区" zipcode="241000" />
+            <district name="芜湖县" zipcode="241000" />
+            <district name="弋江区" zipcode="241000" />
+            <district name="无为县" zipcode="241000" />
+            <district name="其他" zipcode="241000" />
+        </city>
+        <city name="宣城市">
+            <district name="广德县" zipcode="366000" />
+            <district name="绩溪县" zipcode="366000" />
+            <district name="泾县" zipcode="366000" />
+            <district name="旌德县" zipcode="366000" />
+            <district name="郎溪县" zipcode="366000" />
+            <district name="宁国市" zipcode="366000" />
+            <district name="宣州区" zipcode="366000" />
+            <district name="其他" zipcode="366000" />
+        </city>
+    </province>
+    <province name="北京市">
+        <city name="北京市">
+            <district name="昌平区" zipcode="100000" />
+            <district name="朝阳区" zipcode="100000" />
+            <district name="崇文区" zipcode="100000" />
+            <district name="大兴区" zipcode="100000" />
+            <district name="东城区" zipcode="100000" />
+            <district name="房山区" zipcode="100000" />
+            <district name="丰台区" zipcode="100000" />
+            <district name="海淀区" zipcode="100000" />
+            <district name="怀柔区" zipcode="100000" />
+            <district name="门头沟区" zipcode="100000" />
+            <district name="密云县" zipcode="100000" />
+            <district name="平谷区" zipcode="100000" />
+            <district name="石景山区" zipcode="100000" />
+            <district name="顺义区" zipcode="100000" />
+            <district name="通州区" zipcode="100000" />
+            <district name="西城区" zipcode="100000" />
+            <district name="宣武区" zipcode="100000" />
+            <district name="延庆县" zipcode="100000" />
+        </city>
+    </province>
+    <province name="福建省">
+        <city name="福州市">
+            <district name="仓山区" zipcode="350000" />
+            <district name="长乐市" zipcode="350000" />
+            <district name="福清市" zipcode="350000" />
+            <district name="鼓楼区" zipcode="350000" />
+            <district name="晋安区" zipcode="350000" />
+            <district name="连江县" zipcode="350000" />
+            <district name="罗源县" zipcode="350000" />
+            <district name="马尾区" zipcode="350000" />
+            <district name="闽侯县" zipcode="350000" />
+            <district name="闽清县" zipcode="350000" />
+            <district name="平潭县" zipcode="350000" />
+            <district name="台江区" zipcode="350000" />
+            <district name="永泰县" zipcode="350000" />
+            <district name="其他" zipcode="350000" />
+        </city>
+        <city name="龙岩市">
+            <district name="长汀县" zipcode="364000" />
+            <district name="连城县" zipcode="364000" />
+            <district name="上杭县" zipcode="364000" />
+            <district name="武平县" zipcode="364000" />
+            <district name="新罗区" zipcode="364000" />
+            <district name="永定县" zipcode="364000" />
+            <district name="漳平市" zipcode="364000" />
+            <district name="其他" zipcode="364000" />
+        </city>
+        <city name="南平市">
+            <district name="光泽县" zipcode="353000" />
+            <district name="建瓯市" zipcode="353000" />
+            <district name="建阳市" zipcode="353000" />
+            <district name="浦城县" zipcode="353000" />
+            <district name="邵武市" zipcode="353000" />
+            <district name="顺昌县" zipcode="353000" />
+            <district name="松溪县" zipcode="353000" />
+            <district name="武夷山市" zipcode="353000" />
+            <district name="延平区" zipcode="353000" />
+            <district name="政和县" zipcode="353000" />
+            <district name="其他" zipcode="353000" />
+        </city>
+        <city name="宁德市">
+            <district name="福安市" zipcode="352100" />
+            <district name="福鼎市" zipcode="352100" />
+            <district name="古田县" zipcode="352100" />
+            <district name="蕉城区" zipcode="352100" />
+            <district name="屏南县" zipcode="352100" />
+            <district name="寿宁县" zipcode="352100" />
+            <district name="霞浦县" zipcode="352100" />
+            <district name="柘荣县" zipcode="352100" />
+            <district name="周宁县" zipcode="352100" />
+            <district name="其他" zipcode="352100" />
+        </city>
+        <city name="莆田市">
+            <district name="城厢区" zipcode="362000" />
+            <district name="涵江区" zipcode="362000" />
+            <district name="荔城区" zipcode="362000" />
+            <district name="仙游县" zipcode="362000" />
+            <district name="秀屿区" zipcode="362000" />
+            <district name="其他" zipcode="362000" />
+        </city>
+        <city name="泉州市">
+            <district name="安溪县" zipcode="362000" />
+            <district name="德化县" zipcode="362000" />
+            <district name="丰泽区" zipcode="362000" />
+            <district name="惠安县" zipcode="362000" />
+            <district name="晋江市" zipcode="362000" />
+            <district name="鲤城区" zipcode="362000" />
+            <district name="洛江区" zipcode="362000" />
+            <district name="南安市" zipcode="362000" />
+            <district name="建宁县" zipcode="362000" />
+            <district name="泉港区" zipcode="362000" />
+            <district name="石狮市" zipcode="362000" />
+            <district name="永春县" zipcode="362000" />
+            <district name="其他" zipcode="362000" />
+        </city>
+        <city name="三明市">
+            <district name="大田县" zipcode="363000" />
+            <district name="建宁县" zipcode="363000" />
+            <district name="将乐县" zipcode="363000" />
+            <district name="梅列区" zipcode="363000" />
+            <district name="明溪县" zipcode="363000" />
+            <district name="宁化县" zipcode="363000" />
+            <district name="清流县" zipcode="743000" />
+            <district name="三元区" zipcode="743000" />
+            <district name="沙县" zipcode="743000" />
+            <district name="泰宁县" zipcode="743000" />
+            <district name="永安市" zipcode="743000" />
+            <district name="尤溪县" zipcode="743000" />
+            <district name="其他" zipcode="743000" />
+        </city>
+        <city name="厦门市">
+            <district name="海沧区" zipcode="743000" />
+            <district name="湖里区" zipcode="361000" />
+            <district name="集美区" zipcode="361000" />
+            <district name="思明区" zipcode="361000" />
+            <district name="同安区" zipcode="361000" />
+            <district name="翔安区" zipcode="361000" />
+            <district name="其他" zipcode="361000" />
+        </city>
+        <city name="漳州市">
+            <district name="长泰县" zipcode="363000" />
+            <district name="东山县" zipcode="363000" />
+            <district name="华安县" zipcode="363000" />
+            <district name="龙海市" zipcode="363000" />
+            <district name="龙文区" zipcode="363000" />
+            <district name="南靖县" zipcode="363000" />
+            <district name="平和县" zipcode="363000" />
+            <district name="芗城区" zipcode="363000" />
+            <district name="云霄县" zipcode="363000" />
+            <district name="漳浦县" zipcode="363000" />
+            <district name="诏安县" zipcode="363000" />
+            <district name="其他" zipcode="363000" />
+        </city>
+    </province>
+    <province name="甘肃省">
+        <city name="白银市">
+            <district name="白银区" zipcode="730900" />
+            <district name="会宁县" zipcode="730900" />
+            <district name="景泰县" zipcode="730900" />
+            <district name="靖远县" zipcode="730900" />
+            <district name="平川区" zipcode="730900" />
+            <district name="其他" zipcode="730900" />
+        </city>
+        <city name="定西市">
+            <district name="安定区" zipcode="743000" />
+            <district name="临洮县" zipcode="743000" />
+            <district name="陇西县" zipcode="743000" />
+            <district name="岷县" zipcode="743000" />
+            <district name="通渭县" zipcode="743000" />
+            <district name="渭源县" zipcode="743000" />
+            <district name="漳县" zipcode="743000" />
+            <district name="其他" zipcode="743000" />
+        </city>
+        <city name="甘南藏族自治州">
+            <district name="迭部县" zipcode="747000" />
+            <district name="合作市" zipcode="747000" />
+            <district name="临潭县" zipcode="747000" />
+            <district name="碌曲县" zipcode="747000" />
+            <district name="玛曲县" zipcode="747000" />
+            <district name="夏河县" zipcode="747000" />
+            <district name="舟曲县" zipcode="747000" />
+            <district name="卓尼县" zipcode="747000" />
+            <district name="其他" zipcode="747000" />
+        </city>
+        <city name="金昌市">
+            <district name="金川区" zipcode="737100" />
+            <district name="永昌县" zipcode="737100" />
+            <district name="其他" zipcode="737100" />
+        </city>
+        <city name="酒泉市">
+            <district name="阿克塞哈萨克族自治县" zipcode="735000" />
+            <district name="敦煌市" zipcode="735000" />
+            <district name="瓜州县" zipcode="735000" />
+            <district name="金塔县" zipcode="735000" />
+            <district name="肃北蒙古族自治县" zipcode="735000" />
+            <district name="肃州区" zipcode="735000" />
+            <district name="玉门市" zipcode="735000" />
+            <district name="其他" zipcode="735000" />
+        </city>
+        <city name="兰州市">
+            <district name="安宁区" zipcode="730000" />
+            <district name="城关区" zipcode="730000" />
+            <district name="皋兰县" zipcode="730000" />
+            <district name="红古区" zipcode="730000" />
+            <district name="七里河区" zipcode="730000" />
+            <district name="西固区" zipcode="730000" />
+            <district name="永登县" zipcode="730000" />
+            <district name="榆中县" zipcode="730000" />
+            <district name="其他" zipcode="730000" />
+        </city>
+        <city name="临夏回族自治州">
+            <district name="东乡族自治县" zipcode="731100" />
+            <district name="广河县" zipcode="731100" />
+            <district name="和政县" zipcode="731100" />
+            <district name="积石山保安族东乡族撒拉族自治县" zipcode="731100" />
+            <district name="康乐县" zipcode="731100" />
+            <district name="临夏市" zipcode="731100" />
+            <district name="临夏县" zipcode="731100" />
+            <district name="永靖县" zipcode="731100" />
+            <district name="其他" zipcode="731100" />
+        </city>
+        <city name="陇南市">
+            <district name="成县" zipcode="742100" />
+            <district name="宕昌县" zipcode="742100" />
+            <district name="徽县" zipcode="742100" />
+            <district name="康县" zipcode="742100" />
+            <district name="礼县" zipcode="742100" />
+            <district name="两当县" zipcode="742100" />
+            <district name="文县" zipcode="742100" />
+            <district name="武都区" zipcode="742100" />
+            <district name="西和县" zipcode="742100" />
+            <district name="其他" zipcode="742100" />
+        </city>
+        <city name="平凉市">
+            <district name="崇信县" zipcode="744000" />
+            <district name="华亭县" zipcode="744000" />
+            <district name="泾川县" zipcode="744000" />
+            <district name="静宁县" zipcode="744000" />
+            <district name="崆峒区" zipcode="744000" />
+            <district name="灵台县" zipcode="744000" />
+            <district name="庄浪县" zipcode="744000" />
+            <district name="其他" zipcode="744000" />
+        </city>
+        <city name="庆阳市">
+            <district name="合水县" zipcode="744500" />
+            <district name="华池县" zipcode="744500" />
+            <district name="环县" zipcode="744500" />
+            <district name="宁县" zipcode="744500" />
+            <district name="庆城县" zipcode="744500" />
+            <district name="西峰区" zipcode="744500" />
+            <district name="镇原县" zipcode="744500" />
+            <district name="正宁县" zipcode="744500" />
+            <district name="其他" zipcode="744500" />
+        </city>
+        <city name="天水市">
+            <district name="甘谷县" zipcode="741000" />
+            <district name="麦积区" zipcode="741000" />
+            <district name="秦安县" zipcode="741000" />
+            <district name="秦州区" zipcode="741000" />
+            <district name="清水县" zipcode="741000" />
+            <district name="武山县" zipcode="741000" />
+            <district name="张家川回族自治县" zipcode="741000" />
+            <district name="其他" zipcode="741000" />
+        </city>
+        <city name="武威市">
+            <district name="古浪县" zipcode="733000" />
+            <district name="凉州区" zipcode="733000" />
+            <district name="民勤县" zipcode="733000" />
+            <district name="天祝藏族自治县" zipcode="733000" />
+            <district name="其他" zipcode="733000" />
+        </city>
+        <city name="张掖市">
+            <district name="甘州区" zipcode="734000" />
+            <district name="高台县" zipcode="734000" />
+            <district name="临泽县" zipcode="734000" />
+            <district name="民乐县" zipcode="734000" />
+            <district name="山丹县" zipcode="734000" />
+            <district name="肃南裕固族自治县" zipcode="734000" />
+            <district name="其他" zipcode="734000" />
+        </city>
+        <city name="嘉峪关市">
+            <district name="嘉峪关市" zipcode="734000" />
+        </city>
+    </province>
+    <province name="广东省">
+        <city name="潮州市">
+            <district name="潮安县" zipcode="515600" />
+            <district name="饶平县" zipcode="515600" />
+            <district name="湘桥区" zipcode="515600" />
+            <district name="其他" zipcode="515600" />
+        </city>
+        <city name="佛山市">
+            <district name="禅城区" zipcode="517000" />
+            <district name="高明区" zipcode="517000" />
+            <district name="南海区" zipcode="517000" />
+            <district name="三水区" zipcode="517000" />
+            <district name="顺德区" zipcode="517000" />
+            <district name="其他" zipcode="517000" />
+        </city>
+        <city name="广州市">
+            <district name="白云区" zipcode="510000" />
+            <district name="从化区" zipcode="510000" />
+            <district name="番禺区" zipcode="510000" />
+            <district name="海珠区" zipcode="510000" />
+            <district name="花都区" zipcode="510000" />
+            <district name="黄埔区" zipcode="510000" />
+            <district name="荔湾区" zipcode="510000" />
+            <district name="天河区" zipcode="510000" />
+            <district name="越秀区" zipcode="510000" />
+            <district name="增城区" zipcode="510000" />
+            <district name="南沙区" zipcode="510000" />
+            <district name="其他" zipcode="510000" />
+        </city>
+        <city name="河源市">
+            <district name="东源县" zipcode="517000" />
+            <district name="和平县" zipcode="517000" />
+            <district name="连平县" zipcode="517000" />
+            <district name="龙川县" zipcode="517000" />
+            <district name="源城区" zipcode="517000" />
+            <district name="紫金县" zipcode="517000" />
+            <district name="其他" zipcode="517000" />
+        </city>
+        <city name="惠州市">
+            <district name="博罗县" zipcode="516000" />
+            <district name="惠城区" zipcode="516000" />
+            <district name="惠东县" zipcode="516000" />
+            <district name="惠阳区" zipcode="516000" />
+            <district name="龙门县" zipcode="516000" />
+            <district name="其他" zipcode="516000" />
+        </city>
+        <city name="江门市">
+            <district name="恩平市" zipcode="529000" />
+            <district name="鹤山市" zipcode="529000" />
+            <district name="江海区" zipcode="529000" />
+            <district name="开平市" zipcode="529000" />
+            <district name="蓬江区" zipcode="529000" />
+            <district name="台山市" zipcode="529000" />
+            <district name="新会区" zipcode="529000" />
+            <district name="其他" zipcode="529000" />
+        </city>
+        <city name="揭阳市">
+            <district name="东山区" zipcode="522000" />
+            <district name="惠来县" zipcode="522000" />
+            <district name="揭东县" zipcode="522000" />
+            <district name="揭西县" zipcode="522000" />
+            <district name="经济开发试验区" zipcode="522000" />
+            <district name="普宁市" zipcode="522000" />
+            <district name="榕城区" zipcode="522000" />
+            <district name="其他" zipcode="522000" />
+        </city>
+        <city name="茂名市">
+            <district name="电白县" zipcode="525000" />
+            <district name="高州市" zipcode="525000" />
+            <district name="化州市" zipcode="525000" />
+            <district name="茂港区" zipcode="525000" />
+            <district name="茂南区" zipcode="525000" />
+            <district name="信宜市" zipcode="525000" />
+            <district name="其他" zipcode="525000" />
+        </city>
+        <city name="梅州市">
+            <district name="大埔县" zipcode="514000" />
+            <district name="丰顺县" zipcode="514000" />
+            <district name="蕉岭县" zipcode="514000" />
+            <district name="梅江区" zipcode="514000" />
+            <district name="梅县" zipcode="514000" />
+            <district name="平远县" zipcode="514000" />
+            <district name="五华县" zipcode="514000" />
+            <district name="兴宁市" zipcode="514000" />
+            <district name="其他" zipcode="514000" />
+        </city>
+        <city name="清远市">
+            <district name="佛冈县" zipcode="511500" />
+            <district name="连南瑶族自治县" zipcode="511500" />
+            <district name="连山壮族瑶族自治县" zipcode="511500" />
+            <district name="连州市" zipcode="511500" />
+            <district name="清城区" zipcode="511500" />
+            <district name="清新县" zipcode="511500" />
+            <district name="阳山县" zipcode="511500" />
+            <district name="英德市" zipcode="511500" />
+            <district name="其他" zipcode="511500" />
+        </city>
+        <city name="汕头市">
+            <district name="潮南区" zipcode="515000" />
+            <district name="潮阳区" zipcode="515000" />
+            <district name="澄海区" zipcode="515000" />
+            <district name="濠江区" zipcode="515000" />
+            <district name="金平区" zipcode="515000" />
+            <district name="龙湖区" zipcode="515000" />
+            <district name="南澳县" zipcode="515000" />
+            <district name="其他" zipcode="515000" />
+        </city>
+        <city name="汕尾市">
+            <district name="城区" zipcode="516600" />
+            <district name="海丰县" zipcode="516600" />
+            <district name="红海湾经济开发试验区" zipcode="516600" />
+            <district name="陆丰市" zipcode="516600" />
+            <district name="陆河县" zipcode="516600" />
+            <district name="其他" zipcode="516600" />
+        </city>
+        <city name="韶关市">
+            <district name="乐昌市" zipcode="512000" />
+            <district name="南雄市" zipcode="512000" />
+            <district name="曲江区" zipcode="512000" />
+            <district name="仁化县" zipcode="512000" />
+            <district name="乳源瑶族自治县" zipcode="512000" />
+            <district name="始兴县" zipcode="512000" />
+            <district name="翁源县" zipcode="512000" />
+            <district name="武江区" zipcode="512000" />
+            <district name="新丰县" zipcode="512000" />
+            <district name="浈江区" zipcode="512000" />
+            <district name="其他" zipcode="512000" />
+        </city>
+        <city name="深圳市">
+            <district name="宝安区" zipcode="518000" />
+            <district name="福田区" zipcode="518000" />
+            <district name="龙岗区" zipcode="518000" />
+            <district name="罗湖区" zipcode="518000" />
+            <district name="南山区" zipcode="518000" />
+            <district name="盐田区" zipcode="518000" />
+            <district name="其他" zipcode="518000" />
+        </city>
+        <city name="阳江市">
+            <district name="江城区" zipcode="529500" />
+            <district name="阳春市" zipcode="529500" />
+            <district name="阳东县" zipcode="529500" />
+            <district name="阳西县" zipcode="529500" />
+            <district name="其他" zipcode="529500" />
+        </city>
+        <city name="云浮市">
+            <district name="罗定市" zipcode="527300" />
+            <district name="新兴县" zipcode="527300" />
+            <district name="郁南县" zipcode="527300" />
+            <district name="云安县" zipcode="527300" />
+            <district name="云城区" zipcode="527300" />
+            <district name="其他" zipcode="527300" />
+        </city>
+        <city name="湛江市">
+            <district name="赤坎区" zipcode="528400" />
+            <district name="东海岛" zipcode="519000" />
+            <district name="开发区" zipcode="519000" />
+            <district name="雷州市" zipcode="519000" />
+            <district name="廉江市" zipcode="533000" />
+            <district name="麻章区" zipcode="533000" />
+            <district name="坡头区" zipcode="533000" />
+            <district name="遂溪县" zipcode="533000" />
+            <district name="吴川市" zipcode="533000" />
+            <district name="霞山区" zipcode="533000" />
+            <district name="徐闻县" zipcode="533000" />
+            <district name="其他" zipcode="533000" />
+        </city>
+        <city name="肇庆市">
+            <district name="德庆县" zipcode="533000" />
+            <district name="鼎湖区" zipcode="533000" />
+            <district name="端州区" zipcode="533000" />
+            <district name="封开县" zipcode="533000" />
+            <district name="高要市" zipcode="533000" />
+            <district name="广宁县" zipcode="536000" />
+            <district name="怀集县" zipcode="536000" />
+            <district name="四会市" zipcode="536000" />
+            <district name="其他" zipcode="536000" />
+        </city>
+        <city name="珠海市">
+            <district name="斗门区" zipcode="519000" />
+            <district name="金湾区" zipcode="519000" />
+            <district name="香洲区" zipcode="519000" />
+            <district name="其他" zipcode="519000" />
+        </city>
+        <city name="东莞市">
+            <district name="东莞市" zipcode="536000" />
+        </city>
+        <city name="中山市">
+            <district name="中山市" zipcode="519000" />
+        </city>
+    </province>
+    <province name="广西壮族自治区">
+        <city name="百色市">
+            <district name="德保县" zipcode="533000" />
+            <district name="靖西县" zipcode="533000" />
+            <district name="乐业县" zipcode="533000" />
+            <district name="凌云县" zipcode="533000" />
+            <district name="隆林各族自治县" zipcode="533000" />
+            <district name="那坡县" zipcode="533000" />
+            <district name="平果县" zipcode="533000" />
+            <district name="田东县" zipcode="533000" />
+            <district name="田林县" zipcode="533000" />
+            <district name="田阳县" zipcode="533000" />
+            <district name="西林县" zipcode="533000" />
+            <district name="右江区" zipcode="533000" />
+            <district name="其他" zipcode="533000" />
+        </city>
+        <city name="北海市">
+            <district name="海城区" zipcode="536000" />
+            <district name="合浦县" zipcode="536000" />
+            <district name="铁山港区" zipcode="536000" />
+            <district name="银海区" zipcode="536000" />
+            <district name="其他" zipcode="536000" />
+        </city>
+        <city name="崇左市">
+            <district name="大新县" zipcode="532200" />
+            <district name="扶绥县" zipcode="532200" />
+            <district name="江洲区" zipcode="532200" />
+            <district name="龙州县" zipcode="532200" />
+            <district name="宁明县" zipcode="532200" />
+            <district name="凭祥市" zipcode="532200" />
+            <district name="天等县" zipcode="532200" />
+            <district name="其他" zipcode="532200" />
+        </city>
+        <city name="防城港市">
+            <district name="东兴市" zipcode="538000" />
+            <district name="防城区" zipcode="538000" />
+            <district name="港口区" zipcode="538000" />
+            <district name="上思县" zipcode="538000" />
+            <district name="其他" zipcode="538000" />
+        </city>
+        <city name="贵港市">
+            <district name="港北区" zipcode="537100" />
+            <district name="港南区" zipcode="537100" />
+            <district name="桂平市" zipcode="537100" />
+            <district name="平南县" zipcode="537100" />
+            <district name="覃塘区" zipcode="537100" />
+            <district name="其他" zipcode="537100" />
+        </city>
+        <city name="桂林市">
+            <district name="叠彩区" zipcode="541000" />
+            <district name="恭城瑶族自治县" zipcode="541000" />
+            <district name="灌阳县" zipcode="541000" />
+            <district name="荔蒲县" zipcode="541000" />
+            <district name="临桂县" zipcode="541000" />
+            <district name="灵川县" zipcode="541000" />
+            <district name="龙胜各族自治县" zipcode="541000" />
+            <district name="平乐县" zipcode="541000" />
+            <district name="七星区" zipcode="541000" />
+            <district name="全州县" zipcode="541000" />
+            <district name="象山区" zipcode="541000" />
+            <district name="兴安县" zipcode="541000" />
+            <district name="秀峰区" zipcode="541000" />
+            <district name="雁山区" zipcode="541000" />
+            <district name="阳朔县" zipcode="541000" />
+            <district name="永福县" zipcode="541000" />
+            <district name="资源县" zipcode="541000" />
+            <district name="其他" zipcode="541000" />
+        </city>
+        <city name="河池市">
+            <district name="巴马瑶族自治县" zipcode="547000" />
+            <district name="大化瑶族自治县" zipcode="547000" />
+            <district name="东兰县" zipcode="547000" />
+            <district name="都安瑶族自治县" zipcode="547000" />
+            <district name="凤山县" zipcode="547000" />
+            <district name="环江毛南族自治县" zipcode="547000" />
+            <district name="金城江区" zipcode="547000" />
+            <district name="罗城仫佬族自治县" zipcode="547000" />
+            <district name="南丹县" zipcode="547000" />
+            <district name="天峨县" zipcode="547000" />
+            <district name="宜州市" zipcode="547000" />
+            <district name="其他" zipcode="547000" />
+        </city>
+        <city name="贺州市">
+            <district name="八步区" zipcode="542800" />
+            <district name="富川瑶族自治县" zipcode="542800" />
+            <district name="昭平县" zipcode="542800" />
+            <district name="钟山县" zipcode="542800" />
+            <district name="其他" zipcode="542800" />
+        </city>
+        <city name="来宾市">
+            <district name="合山市" zipcode="546100" />
+            <district name="金秀瑶族自治县" zipcode="546100" />
+            <district name="武宣县" zipcode="546100" />
+            <district name="象州县" zipcode="546100" />
+            <district name="忻城县" zipcode="546100" />
+            <district name="兴宾区" zipcode="546100" />
+            <district name="其他" zipcode="546100" />
+        </city>
+        <city name="柳州市">
+            <district name="城中区" zipcode="545000" />
+            <district name="柳北区" zipcode="545000" />
+            <district name="柳城县" zipcode="545000" />
+            <district name="柳江县" zipcode="545000" />
+            <district name="柳南区" zipcode="545000" />
+            <district name="鹿寨县" zipcode="545000" />
+            <district name="融安县" zipcode="545000" />
+            <district name="融水苗族自治县" zipcode="545000" />
+            <district name="三江侗族自治县" zipcode="545000" />
+            <district name="鱼峰区" zipcode="545000" />
+            <district name="其他" zipcode="545000" />
+        </city>
+        <city name="南宁市">
+            <district name="宾阳县" zipcode="530000" />
+            <district name="横县" zipcode="530000" />
+            <district name="江南区" zipcode="530000" />
+            <district name="良庆区" zipcode="530000" />
+            <district name="隆安县" zipcode="530000" />
+            <district name="马山县" zipcode="530000" />
+            <district name="青秀区" zipcode="530000" />
+            <district name="上林县" zipcode="530000" />
+            <district name="武鸣县" zipcode="530000" />
+            <district name="西乡塘区" zipcode="530000" />
+            <district name="兴宁区" zipcode="530000" />
+            <district name="邕宁区" zipcode="530000" />
+            <district name="其他" zipcode="530000" />
+        </city>
+        <city name="钦州市">
+            <district name="灵山县" zipcode="535000" />
+            <district name="浦北县" zipcode="535000" />
+            <district name="钦北区" zipcode="535000" />
+            <district name="钦南区" zipcode="535000" />
+            <district name="其他" zipcode="535000" />
+        </city>
+        <city name="梧州市">
+            <district name="苍梧县" zipcode="543000" />
+            <district name="岑溪市" zipcode="543000" />
+            <district name="长洲区" zipcode="543000" />
+            <district name="蝶山区" zipcode="543000" />
+            <district name="蒙山县" zipcode="543000" />
+            <district name="藤县" zipcode="543000" />
+            <district name="万秀区" zipcode="543000" />
+            <district name="其他" zipcode="543000" />
+        </city>
+        <city name="玉林市">
+            <district name="北流市" zipcode="537000" />
+            <district name="博白县" zipcode="537000" />
+            <district name="陆川县" zipcode="537000" />
+            <district name="容县" zipcode="537000" />
+            <district name="兴业县" zipcode="537000" />
+            <district name="玉州区" zipcode="537000" />
+            <district name="其他" zipcode="537000" />
+        </city>
+    </province>
+    <province name="贵州省">
+        <city name="安顺市">
+            <district name="关岭布依族苗族自治县" zipcode="561000" />
+            <district name="平坝县" zipcode="561000" />
+            <district name="普定县" zipcode="561000" />
+            <district name="西秀区" zipcode="561000" />
+            <district name="镇宁布依族苗族自治县" zipcode="561000" />
+            <district name="紫云苗族布依族自治县" zipcode="561000" />
+            <district name="其他" zipcode="561000" />
+        </city>
+        <city name="毕节地区">
+            <district name="毕节市" zipcode="551700" />
+            <district name="大方县" zipcode="551700" />
+            <district name="赫章县" zipcode="551700" />
+            <district name="金沙县" zipcode="551700" />
+            <district name="纳雍县" zipcode="551700" />
+            <district name="黔西县" zipcode="551700" />
+            <district name="威宁彝族回族苗族自治县" zipcode="551700" />
+            <district name="织金县" zipcode="551700" />
+            <district name="其他" zipcode="551700" />
+        </city>
+        <city name="贵阳市">
+            <district name="白云区" zipcode="550000" />
+            <district name="花溪区" zipcode="550000" />
+            <district name="开阳县" zipcode="550000" />
+            <district name="南明区" zipcode="550000" />
+            <district name="清镇市" zipcode="550000" />
+            <district name="乌当区" zipcode="550000" />
+            <district name="息烽县" zipcode="550000" />
+            <district name="小河区" zipcode="550000" />
+            <district name="修文县" zipcode="550000" />
+            <district name="云岩区" zipcode="550000" />
+            <district name="其他" zipcode="550000" />
+        </city>
+        <city name="六盘水市">
+            <district name="六枝特区" zipcode="553000" />
+            <district name="盘县" zipcode="553000" />
+            <district name="水城县" zipcode="553000" />
+            <district name="钟山区" zipcode="553000" />
+            <district name="其他" zipcode="553000" />
+        </city>
+        <city name="黔东南苗族侗族自治州">
+            <district name="岑巩县" zipcode="556000" />
+            <district name="从江县" zipcode="556000" />
+            <district name="丹寨县" zipcode="556000" />
+            <district name="黄平县" zipcode="556000" />
+            <district name="剑河县" zipcode="556000" />
+            <district name="锦屏县" zipcode="556000" />
+            <district name="凯里市" zipcode="556000" />
+            <district name="雷山县" zipcode="556000" />
+            <district name="黎平县" zipcode="556000" />
+            <district name="麻江县" zipcode="556000" />
+            <district name="榕江县" zipcode="556000" />
+            <district name="三穗县" zipcode="556000" />
+            <district name="施秉县" zipcode="556000" />
+            <district name="台江县" zipcode="556000" />
+            <district name="天柱县" zipcode="556000" />
+            <district name="镇远县" zipcode="556000" />
+            <district name="其他" zipcode="556000" />
+        </city>
+        <city name="黔南布依族苗族自治州">
+            <district name="长顺县" zipcode="558000" />
+            <district name="都匀市" zipcode="558000" />
+            <district name="独山县" zipcode="558000" />
+            <district name="福泉市" zipcode="558000" />
+            <district name="贵定县" zipcode="558000" />
+            <district name="惠水县" zipcode="558000" />
+            <district name="荔波县" zipcode="558000" />
+            <district name="龙里县" zipcode="558000" />
+            <district name="罗甸县" zipcode="558000" />
+            <district name="平塘县" zipcode="558000" />
+            <district name="三都水族自治县" zipcode="558000" />
+            <district name="瓮安县" zipcode="558000" />
+            <district name="其他" zipcode="558000" />
+        </city>
+        <city name="黔西南布依族苗族自治州">
+            <district name="安龙县" zipcode="562400" />
+            <district name="册亨县" zipcode="562400" />
+            <district name="普安县" zipcode="562400" />
+            <district name="晴隆县" zipcode="562400" />
+            <district name="望谟县" zipcode="562400" />
+            <district name="兴仁县" zipcode="562400" />
+            <district name="兴义市" zipcode="562400" />
+            <district name="贞丰县" zipcode="562400" />
+            <district name="其他" zipcode="562400" />
+        </city>
+        <city name="铜仁地区">
+            <district name="德江县" zipcode="554300" />
+            <district name="江口县" zipcode="554300" />
+            <district name="石阡县" zipcode="554300" />
+            <district name="思南县" zipcode="554300" />
+            <district name="松桃苗族自治县" zipcode="554300" />
+            <district name="铜仁市" zipcode="554300" />
+            <district name="万山特区" zipcode="554300" />
+            <district name="沿河土家族自治县" zipcode="554300" />
+            <district name="印江土家族苗族自治县" zipcode="554300" />
+            <district name="玉屏侗族自治县" zipcode="554300" />
+            <district name="其他" zipcode="554300" />
+        </city>
+        <city name="遵义市">
+            <district name="赤水市" zipcode="563000" />
+            <district name="道真仡佬族苗族自治县" zipcode="563000" />
+            <district name="凤冈县" zipcode="563000" />
+            <district name="红花岗区" zipcode="563000" />
+            <district name="汇川区" zipcode="563000" />
+            <district name="湄潭县" zipcode="563000" />
+            <district name="仁怀市" zipcode="563000" />
+            <district name="绥阳县" zipcode="563000" />
+            <district name="桐梓县" zipcode="563000" />
+            <district name="务川仡佬族苗族自治县" zipcode="563000" />
+            <district name="习水县" zipcode="563000" />
+            <district name="余庆县" zipcode="563000" />
+            <district name="正安县" zipcode="563000" />
+            <district name="遵义县" zipcode="563000" />
+            <district name="其他" zipcode="563000" />
+        </city>
+    </province>
+    <province name="海南省">
+        <city name="三亚市">
+            <district name="海棠区" zipcode="572000" />
+            <district name="吉阳区" zipcode="572000" />
+            <district name="天涯区" zipcode="572000" />
+            <district name="崖州区" zipcode="572000" />
+            <district name="其他" zipcode="572000" />
+        </city>
+        <city name="海口市">
+            <district name="龙华区" zipcode="570000" />
+            <district name="美兰区" zipcode="570000" />
+            <district name="琼山区" zipcode="570000" />
+            <district name="秀英区" zipcode="570000" />
+            <district name="其他" zipcode="570000" />
+        </city>
+        <city name="三沙市">
+            <district name="三沙市" zipcode="572000" />
+        </city>
+        <city name="儋州市">
+            <district name="儋州市" zipcode="570000" />
+        </city>
+        <city name="省直辖行政单位">
+            <district name="白沙黎族自治县" zipcode="572000" />
+            <district name="保亭黎族苗族自治县" zipcode="572000" />
+            <district name="昌江黎族自治县" zipcode="572000" />
+            <district name="澄迈县" zipcode="572000" />
+            <district name="儋州市" zipcode="572000" />
+            <district name="定安县" zipcode="572000" />
+            <district name="东方市" zipcode="572000" />
+            <district name="乐东黎族自治县" zipcode="572000" />
+            <district name="临高县" zipcode="572000" />
+            <district name="陵水黎族自治县" zipcode="572000" />
+            <district name="琼海市" zipcode="572000" />
+            <district name="琼中黎族苗族自治县" zipcode="572000" />
+            <district name="屯昌县" zipcode="572000" />
+            <district name="万宁市" zipcode="572000" />
+            <district name="文昌市" zipcode="572000" />
+            <district name="五指山市" zipcode="572000" />
+            <district name="西沙群岛" zipcode="572000" />
+            <district name="其他" zipcode="572000" />
+        </city>
+
+    </province>
+    <province name="河北省">
+        <city name="保定市">
+            <district name="安国市" zipcode="071000" />
+            <district name="安新县" zipcode="071000" />
+            <district name="北市区" zipcode="071000" />
+            <district name="博野县" zipcode="071000" />
+            <district name="定兴县" zipcode="071000" />
+            <district name="定州市" zipcode="071000" />
+            <district name="阜平县" zipcode="071000" />
+            <district name="高碑店市" zipcode="071000" />
+            <district name="高阳县" zipcode="071000" />
+            <district name="涞水县" zipcode="071000" />
+            <district name="涞源县" zipcode="071000" />
+            <district name="蠡县" zipcode="071000" />
+            <district name="满城县" zipcode="071000" />
+            <district name="南市区" zipcode="071000" />
+            <district name="清苑县" zipcode="071000" />
+            <district name="曲阳县" zipcode="071000" />
+            <district name="容城县" zipcode="071000" />
+            <district name="顺平县" zipcode="071000" />
+            <district name="唐县" zipcode="071000" />
+            <district name="望都县" zipcode="071000" />
+            <district name="新市区" zipcode="071000" />
+            <district name="雄县" zipcode="071000" />
+            <district name="徐水县" zipcode="071000" />
+            <district name="易县" zipcode="071000" />
+            <district name="涿州市" zipcode="071000" />
+            <district name="其他" zipcode="71000" />
+        </city>
+        <city name="沧州市">
+            <district name="泊头市" zipcode="061000" />
+            <district name="沧县" zipcode="061000" />
+            <district name="东光县" zipcode="061000" />
+            <district name="海兴县" zipcode="061000" />
+            <district name="河间市" zipcode="061000" />
+            <district name="黄骅市" zipcode="061000" />
+            <district name="孟村回族自治县" zipcode="061000" />
+            <district name="南皮县" zipcode="061000" />
+            <district name="青县" zipcode="061000" />
+            <district name="任丘市" zipcode="061000" />
+            <district name="肃宁县" zipcode="061000" />
+            <district name="吴桥县" zipcode="061000" />
+            <district name="献县" zipcode="061000" />
+            <district name="新华区" zipcode="061000" />
+            <district name="盐山县" zipcode="061000" />
+            <district name="运河区" zipcode="061000" />
+            <district name="其他" zipcode="61000" />
+        </city>
+        <city name="承德市">
+            <district name="承德县" zipcode="067000" />
+            <district name="丰宁满族自治县" zipcode="067000" />
+            <district name="宽城满族自治县" zipcode="067000" />
+            <district name="隆化县" zipcode="067000" />
+            <district name="滦平县" zipcode="067000" />
+            <district name="平泉县" zipcode="067000" />
+            <district name="双滦区" zipcode="067000" />
+            <district name="双桥区" zipcode="067000" />
+            <district name="围场满族蒙古族自治县" zipcode="067000" />
+            <district name="兴隆县" zipcode="067000" />
+            <district name="鹰手营子矿区" zipcode="067000" />
+            <district name="其他" zipcode="67000" />
+        </city>
+        <city name="邯郸市">
+            <district name="成安县" zipcode="056000" />
+            <district name="磁县" zipcode="056000" />
+            <district name="丛台区" zipcode="056000" />
+            <district name="大名县" zipcode="056000" />
+            <district name="肥乡县" zipcode="056000" />
+            <district name="峰峰矿区" zipcode="056000" />
+            <district name="复兴区" zipcode="056000" />
+            <district name="馆陶县" zipcode="056000" />
+            <district name="广平县" zipcode="056000" />
+            <district name="邯郸县" zipcode="056000" />
+            <district name="邯山区" zipcode="056000" />
+            <district name="鸡泽县" zipcode="056000" />
+            <district name="临漳县" zipcode="056000" />
+            <district name="邱县" zipcode="056000" />
+            <district name="曲周县" zipcode="056000" />
+            <district name="涉县" zipcode="056000" />
+            <district name="魏县" zipcode="056000" />
+            <district name="武安市" zipcode="056000" />
+            <district name="永年县" zipcode="056000" />
+            <district name="其他" zipcode="56000" />
+        </city>
+        <city name="衡水市">
+            <district name="安平县" zipcode="053000" />
+            <district name="阜城县" zipcode="053000" />
+            <district name="故城县" zipcode="053000" />
+            <district name="冀州市" zipcode="053000" />
+            <district name="景县" zipcode="053000" />
+            <district name="饶阳县" zipcode="053000" />
+            <district name="深州市" zipcode="053000" />
+            <district name="桃城区" zipcode="053000" />
+            <district name="武强县" zipcode="053000" />
+            <district name="武邑县" zipcode="053000" />
+            <district name="枣强县" zipcode="053000" />
+            <district name="其他" zipcode="53000" />
+        </city>
+        <city name="廊坊市">
+            <district name="安次区" zipcode="065000" />
+            <district name="霸州市" zipcode="065000" />
+            <district name="大厂回族自治县" zipcode="065000" />
+            <district name="大城县" zipcode="065000" />
+            <district name="固安县" zipcode="065000" />
+            <district name="广阳区" zipcode="065000" />
+            <district name="三河市" zipcode="065000" />
+            <district name="文安县" zipcode="065000" />
+            <district name="香河县" zipcode="065000" />
+            <district name="永清县" zipcode="065000" />
+            <district name="其他" zipcode="65000" />
+        </city>
+        <city name="秦皇岛市">
+            <district name="北戴河区" zipcode="066000" />
+            <district name="昌黎县" zipcode="066000" />
+            <district name="抚宁县" zipcode="066000" />
+            <district name="海港区" zipcode="066000" />
+            <district name="卢龙县" zipcode="066000" />
+            <district name="青龙满族自治县" zipcode="066000" />
+            <district name="山海关区" zipcode="066000" />
+            <district name="其他" zipcode="66000" />
+        </city>
+        <city name="石家庄市">
+            <district name="长安区" zipcode="050000" />
+            <district name="高邑县" zipcode="050000" />
+            <district name="藁城市" zipcode="050000" />
+            <district name="晋州市" zipcode="050000" />
+            <district name="井陉矿区" zipcode="050000" />
+            <district name="井陉县" zipcode="050000" />
+            <district name="灵寿县" zipcode="050000" />
+            <district name="鹿泉市" zipcode="050000" />
+            <district name="栾城县" zipcode="050000" />
+            <district name="平山县" zipcode="050000" />
+            <district name="桥东区" zipcode="050000" />
+            <district name="桥西区" zipcode="050000" />
+            <district name="深泽县" zipcode="050000" />
+            <district name="无极县" zipcode="050000" />
+            <district name="辛集市" zipcode="050000" />
+            <district name="新华区" zipcode="050000" />
+            <district name="新乐市" zipcode="050000" />
+            <district name="行唐县" zipcode="050000" />
+            <district name="裕华区" zipcode="050000" />
+            <district name="元氏县" zipcode="050000" />
+            <district name="赞皇县" zipcode="050000" />
+            <district name="赵县" zipcode="050000" />
+            <district name="正定县" zipcode="050000" />
+            <district name="其他" zipcode="50000" />
+        </city>
+        <city name="唐山市">
+            <district name="丰南区" zipcode="063000" />
+            <district name="丰润区" zipcode="063000" />
+            <district name="古冶区" zipcode="063000" />
+            <district name="开平区" zipcode="063000" />
+            <district name="乐亭县" zipcode="063000" />
+            <district name="路北区" zipcode="063000" />
+            <district name="路南区" zipcode="063000" />
+            <district name="滦南县" zipcode="063000" />
+            <district name="滦县" zipcode="063000" />
+            <district name="迁安市" zipcode="063000" />
+            <district name="迁西县" zipcode="063000" />
+            <district name="唐海县" zipcode="063000" />
+            <district name="玉田县" zipcode="063000" />
+            <district name="遵化市" zipcode="063000" />
+            <district name="其他" zipcode="63000" />
+        </city>
+        <city name="邢台市">
+            <district name="柏乡县" zipcode="054000" />
+            <district name="广宗县" zipcode="054000" />
+            <district name="巨鹿县" zipcode="054000" />
+            <district name="临城县" zipcode="054000" />
+            <district name="临西县" zipcode="054000" />
+            <district name="隆尧县" zipcode="054000" />
+            <district name="内丘县" zipcode="054000" />
+            <district name="南宫市" zipcode="054000" />
+            <district name="南和县" zipcode="054000" />
+            <district name="宁晋县" zipcode="054000" />
+            <district name="平乡县" zipcode="054000" />
+            <district name="桥东区" zipcode="054000" />
+            <district name="桥西区" zipcode="054000" />
+            <district name="清河县" zipcode="054000" />
+            <district name="任县" zipcode="054000" />
+            <district name="沙河市" zipcode="054000" />
+            <district name="威县" zipcode="054000" />
+            <district name="新河县" zipcode="054000" />
+            <district name="邢台县" zipcode="054000" />
+            <district name="其他" zipcode="54000" />
+        </city>
+        <city name="张家口市">
+            <district name="赤城县" zipcode="075000" />
+            <district name="崇礼县" zipcode="075000" />
+            <district name="沽源县" zipcode="075000" />
+            <district name="怀安县" zipcode="075000" />
+            <district name="怀来县" zipcode="075000" />
+            <district name="康保县" zipcode="075000" />
+            <district name="桥东区" zipcode="075000" />
+            <district name="桥西区" zipcode="075000" />
+            <district name="尚义县" zipcode="075000" />
+            <district name="万全县" zipcode="075000" />
+            <district name="蔚县" zipcode="075000" />
+            <district name="下花园区" zipcode="075000" />
+            <district name="宣化区" zipcode="075000" />
+            <district name="宣化县" zipcode="075000" />
+            <district name="阳原县" zipcode="075000" />
+            <district name="张北县" zipcode="075000" />
+            <district name="涿鹿县" zipcode="075000" />
+            <district name="其他" zipcode="75000" />
+        </city>
+    </province>
+    <province name="河南省">
+        <city name="安阳市">
+            <district name="安阳县" zipcode="454900" />
+            <district name="北关区" zipcode="454900" />
+            <district name="滑县" zipcode="454900" />
+            <district name="林州市" zipcode="454900" />
+            <district name="龙安区" zipcode="454900" />
+            <district name="内黄县" zipcode="454900" />
+            <district name="汤阴县" zipcode="454900" />
+            <district name="文峰区" zipcode="454900" />
+            <district name="殷都区" zipcode="454900" />
+            <district name="其他" zipcode="454900" />
+        </city>
+        <city name="鹤壁市">
+            <district name="鹤山区" zipcode="458000" />
+            <district name="浚县" zipcode="458000" />
+            <district name="淇滨区" zipcode="458000" />
+            <district name="淇县" zipcode="458000" />
+            <district name="山城区" zipcode="458000" />
+            <district name="其他" zipcode="458000" />
+        </city>
+        <city name="焦作市">
+            <district name="博爱县" zipcode="454100" />
+            <district name="解放区" zipcode="454100" />
+            <district name="孟州市" zipcode="454100" />
+            <district name="沁阳市" zipcode="454100" />
+            <district name="山阳区" zipcode="454100" />
+            <district name="温县" zipcode="454100" />
+            <district name="武陟县" zipcode="454100" />
+            <district name="修武县" zipcode="454100" />
+            <district name="中站区" zipcode="454100" />
+            <district name="马村区" zipcode="454100" />
+            <district name="其他" zipcode="454100" />
+        </city>
+        <city name="开封市">
+            <district name="鼓楼区" zipcode="475000" />
+            <district name="金明区" zipcode="475000" />
+            <district name="开封县" zipcode="475000" />
+            <district name="兰考县" zipcode="475000" />
+            <district name="龙亭区" zipcode="475000" />
+            <district name="杞县" zipcode="475000" />
+            <district name="顺河回族区" zipcode="475000" />
+            <district name="通许县" zipcode="475000" />
+            <district name="尉氏县" zipcode="475000" />
+            <district name="禹王台区" zipcode="475000" />
+            <district name="其他" zipcode="475000" />
+        </city>
+        <city name="洛阳市">
+            <district name="瀍河回族区" zipcode="471000" />
+            <district name="吉利区" zipcode="471000" />
+            <district name="涧西区" zipcode="471000" />
+            <district name="老城区" zipcode="471000" />
+            <district name="栾川县" zipcode="471000" />
+            <district name="洛龙区" zipcode="471000" />
+            <district name="洛宁县" zipcode="471000" />
+            <district name="孟津县" zipcode="471000" />
+            <district name="汝阳县" zipcode="471000" />
+            <district name="嵩县" zipcode="471000" />
+            <district name="西工区" zipcode="471000" />
+            <district name="新安县" zipcode="471000" />
+            <district name="偃师市" zipcode="471000" />
+            <district name="伊川县" zipcode="471000" />
+            <district name="宜阳县" zipcode="471000" />
+            <district name="其他" zipcode="471000" />
+        </city>
+        <city name="漯河市">
+            <district name="临颍县" zipcode="462000" />
+            <district name="舞阳县" zipcode="462000" />
+            <district name="郾城区" zipcode="462000" />
+            <district name="源汇区" zipcode="462000" />
+            <district name="召陵区" zipcode="462000" />
+            <district name="其他" zipcode="462000" />
+        </city>
+        <city name="南阳市">
+            <district name="邓州市" zipcode="473000" />
+            <district name="方城县" zipcode="473000" />
+            <district name="内乡县" zipcode="473000" />
+            <district name="南召县" zipcode="473000" />
+            <district name="社旗县" zipcode="473000" />
+            <district name="唐河县" zipcode="473000" />
+            <district name="桐柏县" zipcode="473000" />
+            <district name="宛城区" zipcode="473000" />
+            <district name="卧龙区" zipcode="473000" />
+            <district name="西峡县" zipcode="473000" />
+            <district name="淅川县" zipcode="473000" />
+            <district name="新野县" zipcode="473000" />
+            <district name="镇平县" zipcode="473000" />
+            <district name="其他" zipcode="473000" />
+        </city>
+        <city name="平顶山市">
+            <district name="宝丰县" zipcode="467000" />
+            <district name="郏县" zipcode="467000" />
+            <district name="鲁山县" zipcode="467000" />
+            <district name="汝州市" zipcode="467000" />
+            <district name="石龙区" zipcode="467000" />
+            <district name="卫东区" zipcode="467000" />
+            <district name="舞钢市" zipcode="467000" />
+            <district name="新华区" zipcode="467000" />
+            <district name="叶县" zipcode="467000" />
+            <district name="湛河区" zipcode="467000" />
+            <district name="其他" zipcode="467000" />
+        </city>
+        <city name="濮阳市">
+            <district name="范县" zipcode="457000" />
+            <district name="华龙区" zipcode="457000" />
+            <district name="南乐县" zipcode="457000" />
+            <district name="濮阳县" zipcode="457000" />
+            <district name="清丰县" zipcode="457000" />
+            <district name="台前县" zipcode="457000" />
+            <district name="其他" zipcode="457000" />
+        </city>
+        <city name="三门峡市">
+            <district name="湖滨区" zipcode="472000" />
+            <district name="灵宝市" zipcode="472000" />
+            <district name="卢氏县" zipcode="472000" />
+            <district name="陕县" zipcode="472000" />
+            <district name="渑池县" zipcode="472000" />
+            <district name="义马市" zipcode="472000" />
+            <district name="其他" zipcode="472000" />
+        </city>
+        <city name="商丘市">
+            <district name="梁园区" zipcode="476000" />
+            <district name="民权县" zipcode="476000" />
+            <district name="宁陵县" zipcode="476000" />
+            <district name="睢县" zipcode="476000" />
+            <district name="睢阳区" zipcode="476000" />
+            <district name="夏邑县" zipcode="476000" />
+            <district name="永城市" zipcode="476000" />
+            <district name="虞城县" zipcode="476000" />
+            <district name="柘城县" zipcode="476000" />
+            <district name="其他" zipcode="476000" />
+        </city>
+        <city name="新乡市">
+            <district name="长垣县" zipcode="453000" />
+            <district name="封丘县" zipcode="453000" />
+            <district name="凤泉区" zipcode="453000" />
+            <district name="红旗区" zipcode="453000" />
+            <district name="辉县市" zipcode="453000" />
+            <district name="获嘉县" zipcode="453000" />
+            <district name="牧野区" zipcode="453000" />
+            <district name="卫滨区" zipcode="453000" />
+            <district name="卫辉市" zipcode="453000" />
+            <district name="新乡县" zipcode="453000" />
+            <district name="延津县" zipcode="453000" />
+            <district name="原阳县" zipcode="453000" />
+            <district name="其他" zipcode="453000" />
+        </city>
+        <city name="信阳市">
+            <district name="固始县" zipcode="464000" />
+            <district name="光山县" zipcode="464000" />
+            <district name="淮滨县" zipcode="464000" />
+            <district name="潢川县" zipcode="464000" />
+            <district name="罗山县" zipcode="464000" />
+            <district name="平桥区" zipcode="464000" />
+            <district name="商城县" zipcode="464000" />
+            <district name="浉河区" zipcode="464000" />
+            <district name="息县" zipcode="464000" />
+            <district name="新县" zipcode="464000" />
+            <district name="其他" zipcode="464000" />
+        </city>
+        <city name="许昌市">
+            <district name="长葛市" zipcode="461000" />
+            <district name="魏都区" zipcode="461000" />
+            <district name="襄城县" zipcode="461000" />
+            <district name="许昌县" zipcode="461000" />
+            <district name="鄢陵县" zipcode="461000" />
+            <district name="禹州市" zipcode="461000" />
+            <district name="其他" zipcode="461000" />
+        </city>
+        <city name="郑州市">
+            <district name="登封市" zipcode="450000" />
+            <district name="二七区" zipcode="450000" />
+            <district name="巩义市" zipcode="450000" />
+            <district name="管城回族区" zipcode="450000" />
+            <district name="惠济区" zipcode="450000" />
+            <district name="金水区" zipcode="450000" />
+            <district name="上街区" zipcode="450000" />
+            <district name="新密市" zipcode="450000" />
+            <district name="新郑市" zipcode="450000" />
+            <district name="荥阳市" zipcode="450000" />
+            <district name="中牟县" zipcode="450000" />
+            <district name="中原区" zipcode="450000" />
+            <district name="其他" zipcode="450000" />
+        </city>
+        <city name="周口市">
+            <district name="川汇区" zipcode="466000" />
+            <district name="郸城县" zipcode="466000" />
+            <district name="扶沟县" zipcode="466000" />
+            <district name="淮阳县" zipcode="466000" />
+            <district name="鹿邑县" zipcode="466000" />
+            <district name="商水县" zipcode="466000" />
+            <district name="沈丘县" zipcode="466000" />
+            <district name="太康县" zipcode="466000" />
+            <district name="西华县" zipcode="466000" />
+            <district name="项城市" zipcode="466000" />
+            <district name="其他" zipcode="466000" />
+        </city>
+        <city name="驻马店市">
+            <district name="泌阳县" zipcode="463000" />
+            <district name="平舆县" zipcode="463000" />
+            <district name="确山县" zipcode="463000" />
+            <district name="汝南县" zipcode="463000" />
+            <district name="上蔡县" zipcode="463000" />
+            <district name="遂平县" zipcode="463000" />
+            <district name="西平县" zipcode="463000" />
+            <district name="新蔡县" zipcode="463000" />
+            <district name="驿城区" zipcode="463000" />
+            <district name="正阳县" zipcode="463000" />
+            <district name="其他" zipcode="463000" />
+        </city>
+        <city name="省直辖行政区">
+            <district name="济源市" zipcode="463000" />
+            <district name="其他" zipcode="463000" />
+        </city>
+    </province>
+    <province name="黑龙江省">
+        <city name="大庆市">
+            <district name="大同区" zipcode="163000" />
+            <district name="杜尔伯特蒙古族自治县" zipcode="163000" />
+            <district name="红岗区" zipcode="163000" />
+            <district name="林甸县" zipcode="163000" />
+            <district name="龙凤区" zipcode="163000" />
+            <district name="让胡路区" zipcode="163000" />
+            <district name="萨尔图区" zipcode="163000" />
+            <district name="肇源县" zipcode="163000" />
+            <district name="肇州县" zipcode="163000" />
+            <district name="其他" zipcode="163000" />
+        </city>
+        <city name="大兴安岭地区">
+            <district name="呼玛县" zipcode="165000" />
+            <district name="漠河县" zipcode="165000" />
+            <district name="塔河县" zipcode="165000" />
+            <district name="其他" zipcode="165000" />
+        </city>
+        <city name="哈尔滨市">
+            <district name="阿城区" zipcode="150000" />
+            <district name="巴彦县" zipcode="150000" />
+            <district name="宾县" zipcode="150000" />
+            <district name="道里区" zipcode="150000" />
+            <district name="道外区" zipcode="150000" />
+            <district name="方正县" zipcode="150000" />
+            <district name="呼兰区" zipcode="150000" />
+            <district name="木兰县" zipcode="150000" />
+            <district name="南岗区" zipcode="150000" />
+            <district name="平房区" zipcode="150000" />
+            <district name="尚志市" zipcode="150000" />
+            <district name="双城市" zipcode="150000" />
+            <district name="松北区" zipcode="150000" />
+            <district name="通河县" zipcode="150000" />
+            <district name="五常市" zipcode="150000" />
+            <district name="香坊区" zipcode="150000" />
+            <district name="延寿县" zipcode="150000" />
+            <district name="依兰县" zipcode="150000" />
+            <district name="其他" zipcode="150000" />
+        </city>
+        <city name="鹤岗市">
+            <district name="东山区" zipcode="154100" />
+            <district name="工农区" zipcode="154100" />
+            <district name="萝北县" zipcode="154100" />
+            <district name="南山区" zipcode="154100" />
+            <district name="绥滨县" zipcode="154100" />
+            <district name="向阳区" zipcode="154100" />
+            <district name="兴安区" zipcode="154100" />
+            <district name="兴山区" zipcode="154100" />
+            <district name="其他" zipcode="154100" />
+        </city>
+        <city name="黑河市">
+            <district name="爱辉区" zipcode="164300" />
+            <district name="北安市" zipcode="164300" />
+            <district name="嫩江县" zipcode="164300" />
+            <district name="孙吴县" zipcode="164300" />
+            <district name="五大连池市" zipcode="164300" />
+            <district name="逊克县" zipcode="164300" />
+            <district name="其他" zipcode="164300" />
+        </city>
+        <city name="鸡西市">
+            <district name="城子河区" zipcode="158100" />
+            <district name="滴道区" zipcode="158100" />
+            <district name="恒山区" zipcode="158100" />
+            <district name="虎林市" zipcode="158100" />
+            <district name="鸡东县" zipcode="158100" />
+            <district name="鸡冠区" zipcode="158100" />
+            <district name="梨树区" zipcode="158100" />
+            <district name="麻山区" zipcode="158100" />
+            <district name="密山市" zipcode="158100" />
+            <district name="其他" zipcode="158100" />
+        </city>
+        <city name="佳木斯市">
+            <district name="东风区" zipcode="154000" />
+            <district name="抚远县" zipcode="154000" />
+            <district name="富锦市" zipcode="154000" />
+            <district name="桦川县" zipcode="154000" />
+            <district name="桦南县" zipcode="154000" />
+            <district name="郊区" zipcode="154000" />
+            <district name="前进区" zipcode="154000" />
+            <district name="汤原县" zipcode="154000" />
+            <district name="同江市" zipcode="154000" />
+            <district name="向阳区" zipcode="154000" />
+            <district name="其他" zipcode="154000" />
+        </city>
+        <city name="牡丹江市">
+            <district name="爱民区" zipcode="157000" />
+            <district name="东安区" zipcode="157000" />
+            <district name="东宁县" zipcode="157000" />
+            <district name="海林市" zipcode="157000" />
+            <district name="林口县" zipcode="157000" />
+            <district name="穆棱市" zipcode="157000" />
+            <district name="宁安市" zipcode="157000" />
+            <district name="绥芬河市" zipcode="157000" />
+            <district name="西安区" zipcode="157000" />
+            <district name="阳明区" zipcode="157000" />
+            <district name="其他" zipcode="157000" />
+        </city>
+        <city name="七台河市">
+            <district name="勃利县" zipcode="154600" />
+            <district name="茄子河区" zipcode="154600" />
+            <district name="桃山区" zipcode="154600" />
+            <district name="新兴区" zipcode="154600" />
+            <district name="其他" zipcode="154600" />
+        </city>
+        <city name="齐齐哈尔市">
+            <district name="昂昂溪区" zipcode="161000" />
+            <district name="拜泉县" zipcode="161000" />
+            <district name="富拉尔基区" zipcode="161000" />
+            <district name="富裕县" zipcode="161000" />
+            <district name="甘南县" zipcode="161000" />
+            <district name="建华区" zipcode="161000" />
+            <district name="克东县" zipcode="161000" />
+            <district name="克山县" zipcode="161000" />
+            <district name="龙江县" zipcode="161000" />
+            <district name="龙沙区" zipcode="161000" />
+            <district name="梅里斯达斡尔族区" zipcode="161000" />
+            <district name="讷河市" zipcode="161000" />
+            <district name="碾子山区" zipcode="161000" />
+            <district name="泰来县" zipcode="161000" />
+            <district name="铁锋区" zipcode="161000" />
+            <district name="依安县" zipcode="161000" />
+            <district name="其他" zipcode="161000" />
+        </city>
+        <city name="双鸭山市">
+            <district name="宝清县" zipcode="155100" />
+            <district name="宝山区" zipcode="155100" />
+            <district name="集贤县" zipcode="155100" />
+            <district name="尖山区" zipcode="155100" />
+            <district name="岭东区" zipcode="155100" />
+            <district name="饶河县" zipcode="155100" />
+            <district name="四方台区" zipcode="155100" />
+            <district name="友谊县" zipcode="155100" />
+            <district name="其他" zipcode="155100" />
+        </city>
+        <city name="绥化市">
+            <district name="安达市" zipcode="152000" />
+            <district name="北林区" zipcode="152000" />
+            <district name="海伦市" zipcode="152000" />
+            <district name="兰西县" zipcode="152000" />
+            <district name="明水县" zipcode="152000" />
+            <district name="青冈县" zipcode="152000" />
+            <district name="庆安县" zipcode="152000" />
+            <district name="绥棱县" zipcode="152000" />
+            <district name="望奎县" zipcode="152000" />
+            <district name="肇东市" zipcode="152000" />
+            <district name="其他" zipcode="152000" />
+        </city>
+        <city name="伊春市">
+            <district name="翠峦区" zipcode="152300" />
+            <district name="带岭区" zipcode="152300" />
+            <district name="红星区" zipcode="152300" />
+            <district name="嘉荫县" zipcode="152300" />
+            <district name="金山屯区" zipcode="152300" />
+            <district name="美溪区" zipcode="152300" />
+            <district name="南岔区" zipcode="152300" />
+            <district name="上甘岭区" zipcode="152300" />
+            <district name="汤旺河区" zipcode="152300" />
+            <district name="铁力市" zipcode="152300" />
+            <district name="乌马河区" zipcode="152300" />
+            <district name="乌伊岭区" zipcode="152300" />
+            <district name="五营区" zipcode="152300" />
+            <district name="西林区" zipcode="152300" />
+            <district name="新青区" zipcode="152300" />
+            <district name="伊春区" zipcode="152300" />
+            <district name="友好区" zipcode="152300" />
+            <district name="其他" zipcode="152300" />
+        </city>
+    </province>
+    <province name="湖北省">
+        <city name="鄂州市">
+            <district name="鄂城区" zipcode="436000" />
+            <district name="华容区" zipcode="436000" />
+            <district name="梁子湖区" zipcode="436000" />
+            <district name="其他" zipcode="436000" />
+        </city>
+        <city name="恩施土家族苗族自治州">
+            <district name="巴东县" zipcode="445000" />
+            <district name="恩施市" zipcode="445000" />
+            <district name="鹤峰县" zipcode="445000" />
+            <district name="建始县" zipcode="445000" />
+            <district name="来凤县" zipcode="445000" />
+            <district name="利川市" zipcode="445000" />
+            <district name="咸丰县" zipcode="445000" />
+            <district name="宣恩县" zipcode="445000" />
+            <district name="其他" zipcode="445000" />
+        </city>
+        <city name="黄冈市">
+            <district name="红安县" zipcode="438000" />
+            <district name="黄梅县" zipcode="438000" />
+            <district name="黄州区" zipcode="438000" />
+            <district name="罗田县" zipcode="438000" />
+            <district name="麻城市" zipcode="438000" />
+            <district name="蕲春县" zipcode="438000" />
+            <district name="团风县" zipcode="438000" />
+            <district name="武穴市" zipcode="438000" />
+            <district name="浠水县" zipcode="438000" />
+            <district name="英山县" zipcode="438000" />
+            <district name="其他" zipcode="438000" />
+        </city>
+        <city name="黄石市">
+            <district name="大冶市" zipcode="435000" />
+            <district name="黄石港区" zipcode="435000" />
+            <district name="铁山区" zipcode="435000" />
+            <district name="西塞山区" zipcode="435000" />
+            <district name="下陆区" zipcode="435000" />
+            <district name="阳新县" zipcode="435000" />
+            <district name="其他" zipcode="435000" />
+        </city>
+        <city name="荆门市">
+            <district name="东宝区" zipcode="448000" />
+            <district name="掇刀区" zipcode="448000" />
+            <district name="京山县" zipcode="448000" />
+            <district name="沙洋县" zipcode="448000" />
+            <district name="钟祥市" zipcode="448000" />
+            <district name="其他" zipcode="448000" />
+        </city>
+        <city name="荆州市">
+            <district name="公安县" zipcode="434000" />
+            <district name="洪湖市" zipcode="434000" />
+            <district name="监利县" zipcode="434000" />
+            <district name="江陵县" zipcode="434000" />
+            <district name="荆州区" zipcode="434000" />
+            <district name="沙市区" zipcode="434000" />
+            <district name="石首市" zipcode="434000" />
+            <district name="松滋市" zipcode="434000" />
+            <district name="其他" zipcode="434000" />
+        </city>
+        <city name="十堰市">
+            <district name="丹江口市" zipcode="442000" />
+            <district name="房县" zipcode="442000" />
+            <district name="茅箭区" zipcode="442000" />
+            <district name="郧西县" zipcode="442000" />
+            <district name="郧县" zipcode="442000" />
+            <district name="张湾区" zipcode="442000" />
+            <district name="竹山县" zipcode="442000" />
+            <district name="竹溪县" zipcode="442000" />
+            <district name="其他" zipcode="442000" />
+        </city>
+        <city name="随州市">
+            <district name="广水市" zipcode="441300" />
+            <district name="曾都区" zipcode="441300" />
+            <district name="随县" zipcode="441300" />
+            <district name="其他" zipcode="441300" />
+        </city>
+        <city name="武汉市">
+            <district name="蔡甸区" zipcode="430000" />
+            <district name="东西湖区" zipcode="430000" />
+            <district name="汉南区" zipcode="430000" />
+            <district name="汉阳区" zipcode="430000" />
+            <district name="洪山区" zipcode="430000" />
+            <district name="黄陂区" zipcode="430000" />
+            <district name="江岸区" zipcode="430000" />
+            <district name="江汉区" zipcode="430000" />
+            <district name="江夏区" zipcode="430000" />
+            <district name="硚口区" zipcode="430000" />
+            <district name="青山区" zipcode="430000" />
+            <district name="武昌区" zipcode="430000" />
+            <district name="新洲区" zipcode="430000" />
+            <district name="其他" zipcode="430000" />
+        </city>
+        <city name="咸宁市">
+            <district name="赤壁市" zipcode="437000" />
+            <district name="崇阳县" zipcode="437000" />
+            <district name="嘉鱼县" zipcode="437000" />
+            <district name="通城县" zipcode="437000" />
+            <district name="通山县" zipcode="437000" />
+            <district name="咸安区" zipcode="437000" />
+            <district name="其他" zipcode="437000" />
+        </city>
+        <city name="襄樊市">
+            <district name="保康县" zipcode="441000" />
+            <district name="樊城区" zipcode="441000" />
+            <district name="谷城县" zipcode="441000" />
+            <district name="老河口市" zipcode="441000" />
+            <district name="南漳县" zipcode="441000" />
+            <district name="襄城区" zipcode="441000" />
+            <district name="襄阳区" zipcode="441000" />
+            <district name="宜城市" zipcode="441000" />
+            <district name="枣阳市" zipcode="441000" />
+            <district name="其他" zipcode="441000" />
+        </city>
+        <city name="孝感市">
+            <district name="安陆市" zipcode="432100" />
+            <district name="大悟县" zipcode="432100" />
+            <district name="汉川市" zipcode="432100" />
+            <district name="孝昌县" zipcode="432100" />
+            <district name="孝南区" zipcode="432100" />
+            <district name="应城市" zipcode="432100" />
+            <district name="云梦县" zipcode="432100" />
+            <district name="其他" zipcode="432100" />
+        </city>
+        <city name="宜昌市">
+            <district name="长阳土家族自治县" zipcode="443000" />
+            <district name="当阳市" zipcode="443000" />
+            <district name="点军区" zipcode="443000" />
+            <district name="五峰土家族自治县" zipcode="443000" />
+            <district name="伍家岗区" zipcode="443000" />
+            <district name="西陵区" zipcode="443000" />
+            <district name="猇亭区" zipcode="443000" />
+            <district name="兴山县" zipcode="443000" />
+            <district name="夷陵区" zipcode="443000" />
+            <district name="宜都市" zipcode="443000" />
+            <district name="远安县" zipcode="443000" />
+            <district name="枝江市" zipcode="443000" />
+            <district name="秭归县" zipcode="443000" />
+            <district name="其他" zipcode="443000" />
+        </city>
+        <city name="省直辖">
+            <district name="仙桃市" zipcode="443000" />
+            <district name="潜江市" zipcode="443000" />
+            <district name="天门市" zipcode="443000" />
+            <district name="神农架林区" zipcode="443000" />
+            <district name="其他" zipcode="443000" />
+        </city>
+    </province>
+    <province name="湖南省">
+        <city name="长沙市">
+            <district name="长沙县" zipcode="410000" />
+            <district name="芙蓉区" zipcode="410000" />
+            <district name="开福区" zipcode="410000" />
+            <district name="浏阳市" zipcode="410000" />
+            <district name="宁乡县" zipcode="410000" />
+            <district name="天心区" zipcode="410000" />
+            <district name="望城县" zipcode="410000" />
+            <district name="雨花区" zipcode="410000" />
+            <district name="岳麓区" zipcode="410000" />
+            <district name="其他" zipcode="410000" />
+        </city>
+        <city name="常德市">
+            <district name="安乡县" zipcode="415000" />
+            <district name="鼎城区" zipcode="415000" />
+            <district name="汉寿县" zipcode="415000" />
+            <district name="津市市" zipcode="415000" />
+            <district name="澧县" zipcode="415000" />
+            <district name="临澧县" zipcode="415000" />
+            <district name="石门县" zipcode="415000" />
+            <district name="桃源县" zipcode="415000" />
+            <district name="武陵区" zipcode="415000" />
+            <district name="其他" zipcode="415000" />
+        </city>
+        <city name="郴州市">
+            <district name="安仁县" zipcode="423000" />
+            <district name="北湖区" zipcode="423000" />
+            <district name="桂东县" zipcode="423000" />
+            <district name="桂阳县" zipcode="423000" />
+            <district name="嘉禾县" zipcode="423000" />
+            <district name="临武县" zipcode="423000" />
+            <district name="汝城县" zipcode="423000" />
+            <district name="苏仙区" zipcode="423000" />
+            <district name="宜章县" zipcode="423000" />
+            <district name="永兴县" zipcode="423000" />
+            <district name="资兴市" zipcode="423000" />
+            <district name="其他" zipcode="423000" />
+        </city>
+        <city name="衡阳市">
+            <district name="常宁市" zipcode="421000" />
+            <district name="衡东县" zipcode="421000" />
+            <district name="衡南县" zipcode="421000" />
+            <district name="衡山县" zipcode="421000" />
+            <district name="衡阳县" zipcode="421000" />
+            <district name="耒阳市" zipcode="421000" />
+            <district name="南岳区" zipcode="421000" />
+            <district name="祁东县" zipcode="421000" />
+            <district name="石鼓区" zipcode="421000" />
+            <district name="雁峰区" zipcode="421000" />
+            <district name="蒸湘区" zipcode="421000" />
+            <district name="珠晖区" zipcode="421000" />
+            <district name="其他" zipcode="421000" />
+        </city>
+        <city name="怀化市">
+            <district name="辰溪县" zipcode="418000" />
+            <district name="鹤城区" zipcode="418000" />
+            <district name="洪江市" zipcode="418000" />
+            <district name="会同县" zipcode="418000" />
+            <district name="靖州苗族侗族自治县" zipcode="418000" />
+            <district name="麻阳苗族自治县" zipcode="418000" />
+            <district name="通道侗族自治县" zipcode="418000" />
+            <district name="新晃侗族自治县" zipcode="418000" />
+            <district name="溆浦县" zipcode="418000" />
+            <district name="沅陵县" zipcode="418000" />
+            <district name="芷江侗族自治县" zipcode="418000" />
+            <district name="中方县" zipcode="418000" />
+            <district name="其他" zipcode="418000" />
+        </city>
+        <city name="娄底市">
+            <district name="冷水江市" zipcode="417000" />
+            <district name="涟源市" zipcode="417000" />
+            <district name="娄星区" zipcode="417000" />
+            <district name="双峰县" zipcode="417000" />
+            <district name="新化县" zipcode="417000" />
+            <district name="其他" zipcode="417000" />
+        </city>
+        <city name="邵阳市">
+            <district name="北塔区" zipcode="422000" />
+            <district name="城步苗族自治县" zipcode="422000" />
+            <district name="大祥区" zipcode="422000" />
+            <district name="洞口县" zipcode="422000" />
+            <district name="隆回县" zipcode="422000" />
+            <district name="邵东县" zipcode="422000" />
+            <district name="邵阳县" zipcode="422000" />
+            <district name="双清区" zipcode="422000" />
+            <district name="绥宁县" zipcode="422000" />
+            <district name="武冈市" zipcode="422000" />
+            <district name="新宁县" zipcode="422000" />
+            <district name="新邵县" zipcode="422000" />
+            <district name="其他" zipcode="422000" />
+        </city>
+        <city name="湘潭市">
+            <district name="韶山市" zipcode="411100" />
+            <district name="湘潭县" zipcode="411100" />
+            <district name="湘乡市" zipcode="411100" />
+            <district name="雨湖区" zipcode="411100" />
+            <district name="岳塘区" zipcode="411100" />
+            <district name="其他" zipcode="411100" />
+        </city>
+        <city name="湘西土家族苗族自治州">
+            <district name="保靖县" zipcode="416000" />
+            <district name="凤凰县" zipcode="416000" />
+            <district name="古丈县" zipcode="416000" />
+            <district name="花垣县" zipcode="416000" />
+            <district name="吉首市" zipcode="416000" />
+            <district name="龙山县" zipcode="416000" />
+            <district name="泸溪县" zipcode="416000" />
+            <district name="永顺县" zipcode="416000" />
+            <district name="其他" zipcode="416000" />
+        </city>
+        <city name="益阳市">
+            <district name="安化县" zipcode="413000" />
+            <district name="赫山区" zipcode="413000" />
+            <district name="南县" zipcode="413000" />
+            <district name="桃江县" zipcode="413000" />
+            <district name="沅江市" zipcode="413000" />
+            <district name="资阳区" zipcode="413000" />
+            <district name="其他" zipcode="413000" />
+        </city>
+        <city name="永州市">
+            <district name="道县" zipcode="425000" />
+            <district name="东安县" zipcode="425000" />
+            <district name="江华瑶族自治县" zipcode="425000" />
+            <district name="江永县" zipcode="425000" />
+            <district name="蓝山县" zipcode="425000" />
+            <district name="冷水滩区" zipcode="425000" />
+            <district name="零陵区" zipcode="425000" />
+            <district name="宁远县" zipcode="425000" />
+            <district name="祁阳县" zipcode="425000" />
+            <district name="双牌县" zipcode="425000" />
+            <district name="新田县" zipcode="425000" />
+            <district name="其他" zipcode="425000" />
+        </city>
+        <city name="岳阳市">
+            <district name="华容县" zipcode="414000" />
+            <district name="君山区" zipcode="414000" />
+            <district name="临湘市" zipcode="414000" />
+            <district name="汨罗市" zipcode="414000" />
+            <district name="平江县" zipcode="414000" />
+            <district name="湘阴县" zipcode="414000" />
+            <district name="岳阳楼区" zipcode="414000" />
+            <district name="岳阳县" zipcode="414000" />
+            <district name="云溪区" zipcode="414000" />
+            <district name="其他" zipcode="414000" />
+        </city>
+        <city name="张家界市">
+            <district name="慈利县" zipcode="427000" />
+            <district name="桑植县" zipcode="427000" />
+            <district name="武陵源区" zipcode="427000" />
+            <district name="永定区" zipcode="427000" />
+            <district name="其他" zipcode="427000" />
+        </city>
+        <city name="株洲市">
+            <district name="茶陵县" zipcode="412000" />
+            <district name="荷塘区" zipcode="412000" />
+            <district name="醴陵市" zipcode="412000" />
+            <district name="芦淞区" zipcode="412000" />
+            <district name="石峰区" zipcode="412000" />
+            <district name="天元区" zipcode="412000" />
+            <district name="炎陵县" zipcode="412000" />
+            <district name="攸县" zipcode="412000" />
+            <district name="株洲县" zipcode="412000" />
+            <district name="其他" zipcode="412000" />
+        </city>
+    </province>
+    <province name="吉林省">
+        <city name="白城市">
+            <district name="大安市" zipcode="137000" />
+            <district name="洮北区" zipcode="137000" />
+            <district name="洮南市" zipcode="137000" />
+            <district name="通榆县" zipcode="137000" />
+            <district name="镇赉县" zipcode="137000" />
+            <district name="其他" zipcode="137000" />
+        </city>
+        <city name="白山市">
+            <district name="八道江区" zipcode="134300" />
+            <district name="长白朝鲜族自治县" zipcode="134300" />
+            <district name="抚松县" zipcode="134300" />
+            <district name="江源区" zipcode="134300" />
+            <district name="靖宇县" zipcode="134300" />
+            <district name="临江市" zipcode="134300" />
+            <district name="其他" zipcode="134300" />
+        </city>
+        <city name="长春市">
+            <district name="朝阳区" zipcode="130000" />
+            <district name="德惠市" zipcode="130000" />
+            <district name="二道区" zipcode="130000" />
+            <district name="九台市" zipcode="130000" />
+            <district name="宽城区" zipcode="130000" />
+            <district name="绿园区" zipcode="130000" />
+            <district name="南关区" zipcode="130000" />
+            <district name="农安县" zipcode="130000" />
+            <district name="双阳区" zipcode="130000" />
+            <district name="榆树市" zipcode="130000" />
+            <district name="其他" zipcode="130000" />
+        </city>
+        <city name="吉林市">
+            <district name="昌邑区" zipcode="132000" />
+            <district name="船营区" zipcode="132000" />
+            <district name="丰满区" zipcode="132000" />
+            <district name="桦甸市" zipcode="132000" />
+            <district name="蛟河市" zipcode="132000" />
+            <district name="龙潭区" zipcode="132000" />
+            <district name="磐石市" zipcode="132000" />
+            <district name="舒兰市" zipcode="132000" />
+            <district name="永吉县" zipcode="132000" />
+            <district name="其他" zipcode="132000" />
+        </city>
+        <city name="辽源市">
+            <district name="东丰县" zipcode="136200" />
+            <district name="东辽县" zipcode="136200" />
+            <district name="龙山区" zipcode="136200" />
+            <district name="西安区" zipcode="136200" />
+            <district name="其他" zipcode="136200" />
+        </city>
+        <city name="四平市">
+            <district name="公主岭市" zipcode="136000" />
+            <district name="梨树县" zipcode="136000" />
+            <district name="双辽市" zipcode="136000" />
+            <district name="铁东区" zipcode="136000" />
+            <district name="铁西区" zipcode="136000" />
+            <district name="伊通满族自治县" zipcode="136000" />
+            <district name="其他" zipcode="136000" />
+        </city>
+        <city name="松原市">
+            <district name="长岭县" zipcode="131100" />
+            <district name="扶余县" zipcode="131100" />
+            <district name="宁江区" zipcode="131100" />
+            <district name="前郭尔罗斯蒙古族自治县" zipcode="131100" />
+            <district name="乾安县" zipcode="131100" />
+            <district name="其他" zipcode="131100" />
+        </city>
+        <city name="通化市">
+            <district name="东昌区" zipcode="134000" />
+            <district name="二道江区" zipcode="134000" />
+            <district name="辉南县" zipcode="134000" />
+            <district name="集安市" zipcode="134000" />
+            <district name="柳河县" zipcode="134000" />
+            <district name="梅河口市" zipcode="134000" />
+            <district name="通化县" zipcode="134000" />
+            <district name="其他" zipcode="134000" />
+        </city>
+        <city name="延边朝鲜族自治州">
+            <district name="安图县" zipcode="133000" />
+            <district name="敦化市" zipcode="133000" />
+            <district name="和龙市" zipcode="133000" />
+            <district name="珲春市" zipcode="133000" />
+            <district name="龙井市" zipcode="133000" />
+            <district name="图们市" zipcode="133000" />
+            <district name="汪清县" zipcode="133000" />
+            <district name="延吉市" zipcode="133000" />
+            <district name="其他" zipcode="133000" />
+        </city>
+    </province>
+    <province name="江苏省">
+        <city name="常州市">
+            <district name="金坛市" zipcode="213000" />
+            <district name="溧阳市" zipcode="213000" />
+            <district name="戚墅堰区" zipcode="213000" />
+            <district name="天宁区" zipcode="213000" />
+            <district name="武进区" zipcode="213000" />
+            <district name="新北区" zipcode="213000" />
+            <district name="钟楼区" zipcode="213000" />
+            <district name="其他" zipcode="213000" />
+        </city>
+        <city name="淮安市">
+            <district name="楚州区" zipcode="223200" />
+            <district name="洪泽县" zipcode="223200" />
+            <district name="淮阴区" zipcode="223200" />
+            <district name="金湖县" zipcode="223200" />
+            <district name="涟水县" zipcode="223200" />
+            <district name="清河区" zipcode="223200" />
+            <district name="清浦区" zipcode="223200" />
+            <district name="盱眙县" zipcode="223200" />
+            <district name="其他" zipcode="223200" />
+        </city>
+        <city name="连云港市">
+            <district name="东海县" zipcode="222000" />
+            <district name="赣榆县" zipcode="222000" />
+            <district name="灌南县" zipcode="222000" />
+            <district name="灌云县" zipcode="222000" />
+            <district name="海州区" zipcode="222000" />
+            <district name="连云区" zipcode="222000" />
+            <district name="新浦区" zipcode="222000" />
+            <district name="其他" zipcode="222000" />
+        </city>
+        <city name="南京市">
+            <district name="白下区" zipcode="210000" />
+            <district name="高淳县" zipcode="210000" />
+            <district name="鼓楼区" zipcode="210000" />
+            <district name="建邺区" zipcode="210000" />
+            <district name="江宁区" zipcode="210000" />
+            <district name="溧水县" zipcode="210000" />
+            <district name="六合区" zipcode="210000" />
+            <district name="浦口区" zipcode="210000" />
+            <district name="栖霞区" zipcode="210000" />
+            <district name="秦淮区" zipcode="210000" />
+            <district name="下关区" zipcode="210000" />
+            <district name="玄武区" zipcode="210000" />
+            <district name="雨花台区" zipcode="210000" />
+            <district name="其他" zipcode="210000" />
+        </city>
+        <city name="南通市">
+            <district name="崇川区" zipcode="226000" />
+            <district name="港闸区" zipcode="226000" />
+            <district name="海安县" zipcode="226000" />
+            <district name="海门市" zipcode="226000" />
+            <district name="启东市" zipcode="226000" />
+            <district name="如东县" zipcode="226000" />
+            <district name="如皋市" zipcode="226000" />
+            <district name="通州市" zipcode="226000" />
+            <district name="其他" zipcode="226000" />
+        </city>
+        <city name="苏州市">
+            <district name="沧浪区" zipcode="215000" />
+            <district name="常熟市" zipcode="215000" />
+            <district name="虎丘区" zipcode="215000" />
+            <district name="金阊区" zipcode="215000" />
+            <district name="昆山市" zipcode="215000" />
+            <district name="平江区" zipcode="215000" />
+            <district name="太仓市" zipcode="215000" />
+            <district name="吴江市" zipcode="215000" />
+            <district name="吴中区" zipcode="215000" />
+            <district name="相城区" zipcode="215000" />
+            <district name="张家港市" zipcode="215000" />
+            <district name="其他" zipcode="215000" />
+        </city>
+        <city name="宿迁市">
+            <district name="沭阳县" zipcode="223800" />
+            <district name="泗洪县" zipcode="223800" />
+            <district name="泗阳县" zipcode="223800" />
+            <district name="宿城区" zipcode="223800" />
+            <district name="宿豫区" zipcode="223800" />
+            <district name="其他" zipcode="223800" />
+        </city>
+        <city name="泰州市">
+            <district name="高港区" zipcode="225300" />
+            <district name="海陵区" zipcode="225300" />
+            <district name="姜堰市" zipcode="225300" />
+            <district name="靖江市" zipcode="225300" />
+            <district name="泰兴市" zipcode="225300" />
+            <district name="兴化市" zipcode="225300" />
+            <district name="其他" zipcode="225300" />
+        </city>
+        <city name="无锡市">
+            <district name="北塘区" zipcode="214000" />
+            <district name="滨湖区" zipcode="214000" />
+            <district name="崇安区" zipcode="214000" />
+            <district name="惠山区" zipcode="214000" />
+            <district name="江阴市" zipcode="214000" />
+            <district name="南长区" zipcode="214000" />
+            <district name="锡山区" zipcode="214000" />
+            <district name="宜兴市" zipcode="214000" />
+            <district name="其他" zipcode="214000" />
+        </city>
+        <city name="徐州市">
+            <district name="丰县" zipcode="221000" />
+            <district name="鼓楼区" zipcode="221000" />
+            <district name="贾汪区" zipcode="221000" />
+            <district name="九里区" zipcode="221000" />
+            <district name="沛县" zipcode="221000" />
+            <district name="邳州市" zipcode="221000" />
+            <district name="泉山区" zipcode="221000" />
+            <district name="睢宁县" zipcode="221000" />
+            <district name="铜山县" zipcode="221000" />
+            <district name="新沂市" zipcode="221000" />
+            <district name="云龙区" zipcode="221000" />
+            <district name="其他" zipcode="221000" />
+        </city>
+        <city name="盐城市">
+            <district name="滨海县" zipcode="224000" />
+            <district name="大丰市" zipcode="224000" />
+            <district name="东台市" zipcode="224000" />
+            <district name="阜宁县" zipcode="224000" />
+            <district name="建湖县" zipcode="224000" />
+            <district name="射阳县" zipcode="224000" />
+            <district name="亭湖区" zipcode="224000" />
+            <district name="响水县" zipcode="224000" />
+            <district name="盐都区" zipcode="224000" />
+            <district name="其他" zipcode="224000" />
+        </city>
+        <city name="扬州市">
+            <district name="宝应县" zipcode="225000" />
+            <district name="高邮市" zipcode="225000" />
+            <district name="广陵区" zipcode="225000" />
+            <district name="邗江区" zipcode="225000" />
+            <district name="江都市" zipcode="225000" />
+            <district name="维扬区" zipcode="225000" />
+            <district name="仪征市" zipcode="225000" />
+            <district name="其他" zipcode="225000" />
+        </city>
+        <city name="镇江市">
+            <district name="丹徒区" zipcode="212000" />
+            <district name="丹阳市" zipcode="212000" />
+            <district name="京口区" zipcode="212000" />
+            <district name="句容市" zipcode="212000" />
+            <district name="润州区" zipcode="212000" />
+            <district name="扬中市" zipcode="212000" />
+            <district name="其他" zipcode="212000" />
+        </city>
+    </province>
+    <province name="江西省">
+        <city name="抚州市">
+            <district name="崇仁县" zipcode="332900" />
+            <district name="东乡县" zipcode="332900" />
+            <district name="广昌县" zipcode="332900" />
+            <district name="金溪县" zipcode="332900" />
+            <district name="乐安县" zipcode="332900" />
+            <district name="黎川县" zipcode="332900" />
+            <district name="临川区" zipcode="332900" />
+            <district name="南城县" zipcode="332900" />
+            <district name="南丰县" zipcode="332900" />
+            <district name="宜黄县" zipcode="332900" />
+            <district name="资溪县" zipcode="332900" />
+            <district name="其他" zipcode="332900" />
+        </city>
+        <city name="赣州市">
+            <district name="安远县" zipcode="341000" />
+            <district name="崇义县" zipcode="341000" />
+            <district name="大余县" zipcode="341000" />
+            <district name="定南县" zipcode="341000" />
+            <district name="赣县" zipcode="341000" />
+            <district name="会昌县" zipcode="341000" />
+            <district name="龙南县" zipcode="341000" />
+            <district name="南康市" zipcode="341000" />
+            <district name="宁都县" zipcode="341000" />
+            <district name="全南县" zipcode="341000" />
+            <district name="瑞金市" zipcode="341000" />
+            <district name="上犹县" zipcode="341000" />
+            <district name="石城县" zipcode="341000" />
+            <district name="信丰县" zipcode="341000" />
+            <district name="兴国县" zipcode="341000" />
+            <district name="寻乌县" zipcode="341000" />
+            <district name="于都县" zipcode="341000" />
+            <district name="章贡区" zipcode="341000" />
+            <district name="其他" zipcode="341000" />
+        </city>
+        <city name="吉安市">
+            <district name="安福县" zipcode="343000" />
+            <district name="吉安县" zipcode="343000" />
+            <district name="吉水县" zipcode="343000" />
+            <district name="吉州区" zipcode="343000" />
+            <district name="井冈山市" zipcode="343000" />
+            <district name="青原区" zipcode="343000" />
+            <district name="遂川县" zipcode="343000" />
+            <district name="泰和县" zipcode="343000" />
+            <district name="万安县" zipcode="343000" />
+            <district name="峡江县" zipcode="343000" />
+            <district name="新干县" zipcode="343000" />
+            <district name="永丰县" zipcode="343000" />
+            <district name="永新县" zipcode="343000" />
+            <district name="其他" zipcode="343000" />
+        </city>
+        <city name="景德镇市">
+            <district name="昌江区" zipcode="333000" />
+            <district name="浮梁县" zipcode="333000" />
+            <district name="乐平市" zipcode="333000" />
+            <district name="珠山区" zipcode="333000" />
+            <district name="其他" zipcode="333000" />
+        </city>
+        <city name="九江市">
+            <district name="德安县" zipcode="332000" />
+            <district name="都昌县" zipcode="332000" />
+            <district name="共青城" zipcode="332000" />
+            <district name="湖口县" zipcode="332000" />
+            <district name="九江县" zipcode="332000" />
+            <district name="庐山区" zipcode="332000" />
+            <district name="彭泽县" zipcode="332000" />
+            <district name="瑞昌市" zipcode="332000" />
+            <district name="武宁县" zipcode="332000" />
+            <district name="星子县" zipcode="332000" />
+            <district name="修水县" zipcode="332000" />
+            <district name="浔阳区" zipcode="332000" />
+            <district name="永修县" zipcode="332000" />
+            <district name="其他" zipcode="332000" />
+        </city>
+        <city name="南昌市">
+            <district name="安义县" zipcode="330000" />
+            <district name="东湖区" zipcode="330000" />
+            <district name="进贤县" zipcode="330000" />
+            <district name="南昌县" zipcode="330000" />
+            <district name="青山湖区" zipcode="330000" />
+            <district name="青云谱区" zipcode="330000" />
+            <district name="湾里区" zipcode="330000" />
+            <district name="西湖区" zipcode="330000" />
+            <district name="新建县" zipcode="330000" />
+            <district name="其他" zipcode="330000" />
+        </city>
+        <city name="萍乡市">
+            <district name="安源区" zipcode="337000" />
+            <district name="莲花县" zipcode="337000" />
+            <district name="芦溪县" zipcode="337000" />
+            <district name="上栗县" zipcode="337000" />
+            <district name="湘东区" zipcode="337000" />
+            <district name="其他" zipcode="337000" />
+        </city>
+        <city name="上饶市">
+            <district name="德兴市" zipcode="334000" />
+            <district name="广丰县" zipcode="334000" />
+            <district name="横峰县" zipcode="334000" />
+            <district name="鄱阳县" zipcode="334000" />
+            <district name="铅山县" zipcode="334000" />
+            <district name="上饶县" zipcode="334000" />
+            <district name="万年县" zipcode="334000" />
+            <district name="婺源县" zipcode="334000" />
+            <district name="信州区" zipcode="334000" />
+            <district name="弋阳县" zipcode="334000" />
+            <district name="余干县" zipcode="334000" />
+            <district name="玉山县" zipcode="334000" />
+            <district name="其他" zipcode="334000" />
+        </city>
+        <city name="新余市">
+            <district name="分宜县" zipcode="338000" />
+            <district name="渝水区" zipcode="338000" />
+            <district name="其他" zipcode="338000" />
+        </city>
+        <city name="宜春市">
+            <district name="丰城市" zipcode="336000" />
+            <district name="奉新县" zipcode="336000" />
+            <district name="高安市" zipcode="336000" />
+            <district name="靖安县" zipcode="336000" />
+            <district name="上高县" zipcode="336000" />
+            <district name="铜鼓县" zipcode="336000" />
+            <district name="万载县" zipcode="336000" />
+            <district name="宜丰县" zipcode="336000" />
+            <district name="袁州区" zipcode="336000" />
+            <district name="樟树市" zipcode="336000" />
+            <district name="其他" zipcode="336000" />
+        </city>
+        <city name="鹰潭市">
+            <district name="贵溪市" zipcode="335000" />
+            <district name="余江县" zipcode="335000" />
+            <district name="月湖区" zipcode="335000" />
+            <district name="其他" zipcode="335000" />
+        </city>
+    </province>
+    <province name="辽宁省">
+        <city name="鞍山市">
+            <district name="海城市" zipcode="114000" />
+            <district name="立山区" zipcode="114000" />
+            <district name="千山区" zipcode="114000" />
+            <district name="台安县" zipcode="114000" />
+            <district name="铁东区" zipcode="114000" />
+            <district name="铁西区" zipcode="114000" />
+            <district name="岫岩满族自治县" zipcode="114000" />
+            <district name="其他" zipcode="114000" />
+        </city>
+        <city name="本溪市">
+            <district name="本溪满族自治县" zipcode="117000" />
+            <district name="桓仁满族自治县" zipcode="117000" />
+            <district name="明山区" zipcode="117000" />
+            <district name="南芬区" zipcode="117000" />
+            <district name="平山区" zipcode="117000" />
+            <district name="溪湖区" zipcode="117000" />
+            <district name="其他" zipcode="117000" />
+        </city>
+        <city name="朝阳市">
+            <district name="北票市" zipcode="122000" />
+            <district name="朝阳县" zipcode="122000" />
+            <district name="建平县" zipcode="122000" />
+            <district name="喀喇沁左翼蒙古族自治县" zipcode="122000" />
+            <district name="凌源市" zipcode="122000" />
+            <district name="龙城区" zipcode="122000" />
+            <district name="双塔区" zipcode="122000" />
+            <district name="其他" zipcode="122000" />
+        </city>
+        <city name="大连市">
+            <district name="长海县" zipcode="116000" />
+            <district name="甘井子区" zipcode="116000" />
+            <district name="金州区" zipcode="116000" />
+            <district name="旅顺口区" zipcode="116000" />
+            <district name="普兰店市" zipcode="116000" />
+            <district name="沙河口区" zipcode="116000" />
+            <district name="瓦房店市" zipcode="116000" />
+            <district name="西岗区" zipcode="116000" />
+            <district name="中山区" zipcode="116000" />
+            <district name="庄河市" zipcode="116000" />
+            <district name="其他" zipcode="116000" />
+        </city>
+        <city name="丹东市">
+            <district name="东港市" zipcode="118000" />
+            <district name="凤城市" zipcode="118000" />
+            <district name="宽甸满族自治县" zipcode="118000" />
+            <district name="元宝区" zipcode="118000" />
+            <district name="振安区" zipcode="118000" />
+            <district name="振兴区" zipcode="118000" />
+            <district name="其他" zipcode="118000" />
+        </city>
+        <city name="抚顺市">
+            <district name="东洲区" zipcode="113000" />
+            <district name="抚顺县" zipcode="113000" />
+            <district name="清原满族自治县" zipcode="113000" />
+            <district name="顺城区" zipcode="113000" />
+            <district name="望花区" zipcode="113000" />
+            <district name="新宾满族自治县" zipcode="113000" />
+            <district name="新抚区" zipcode="113000" />
+            <district name="其他" zipcode="113000" />
+        </city>
+        <city name="阜新市">
+            <district name="阜新蒙古族自治县" zipcode="123000" />
+            <district name="海州区" zipcode="123000" />
+            <district name="清河门区" zipcode="123000" />
+            <district name="太平区" zipcode="123000" />
+            <district name="细河区" zipcode="123000" />
+            <district name="新邱区" zipcode="123000" />
+            <district name="彰武县" zipcode="123000" />
+            <district name="其他" zipcode="123000" />
+        </city>
+        <city name="葫芦岛市">
+            <district name="建昌县" zipcode="125000" />
+            <district name="连山区" zipcode="125000" />
+            <district name="龙港区" zipcode="125000" />
+            <district name="南票区" zipcode="125000" />
+            <district name="绥中县" zipcode="125000" />
+            <district name="兴城市" zipcode="125000" />
+            <district name="其他" zipcode="125000" />
+        </city>
+        <city name="锦州市">
+            <district name="北镇市" zipcode="121000" />
+            <district name="古塔区" zipcode="121000" />
+            <district name="黑山县" zipcode="121000" />
+            <district name="凌海市" zipcode="121000" />
+            <district name="凌河区" zipcode="121000" />
+            <district name="太和区" zipcode="121000" />
+            <district name="义县" zipcode="121000" />
+            <district name="其他" zipcode="121000" />
+        </city>
+        <city name="辽阳市">
+            <district name="白塔区" zipcode="111000" />
+            <district name="灯塔市" zipcode="111000" />
+            <district name="弓长岭区" zipcode="111000" />
+            <district name="宏伟区" zipcode="111000" />
+            <district name="辽阳县" zipcode="111000" />
+            <district name="太子河区" zipcode="111000" />
+            <district name="文圣区" zipcode="111000" />
+            <district name="其他" zipcode="111000" />
+        </city>
+        <city name="盘锦市">
+            <district name="大洼县" zipcode="124000" />
+            <district name="盘山县" zipcode="124000" />
+            <district name="双台子区" zipcode="124000" />
+            <district name="兴隆台区" zipcode="124000" />
+            <district name="其他" zipcode="124000" />
+        </city>
+        <city name="沈阳市">
+            <district name="大东区" zipcode="110000" />
+            <district name="东陵区" zipcode="110000" />
+            <district name="法库县" zipcode="110000" />
+            <district name="和平区" zipcode="110000" />
+            <district name="皇姑区" zipcode="110000" />
+            <district name="康平县" zipcode="110000" />
+            <district name="辽中县" zipcode="110000" />
+            <district name="沈北新区" zipcode="110000" />
+            <district name="沈河区" zipcode="110000" />
+            <district name="苏家屯区" zipcode="110000" />
+            <district name="铁西区" zipcode="110000" />
+            <district name="新民市" zipcode="110000" />
+            <district name="于洪区" zipcode="110000" />
+            <district name="其他" zipcode="110000" />
+        </city>
+        <city name="铁岭市">
+            <district name="昌图县" zipcode="112000" />
+            <district name="调兵山市" zipcode="112000" />
+            <district name="开原市" zipcode="112000" />
+            <district name="清河区" zipcode="112000" />
+            <district name="铁岭县" zipcode="112000" />
+            <district name="西丰县" zipcode="112000" />
+            <district name="银州区" zipcode="112000" />
+            <district name="其他" zipcode="112000" />
+        </city>
+        <city name="营口市">
+            <district name="鲅鱼圈区" zipcode="115000" />
+            <district name="大石桥市" zipcode="115000" />
+            <district name="盖州市" zipcode="115000" />
+            <district name="老边区" zipcode="115000" />
+            <district name="西市区" zipcode="115000" />
+            <district name="站前区" zipcode="115000" />
+            <district name="其他" zipcode="115000" />
+        </city>
+    </province>
+    <province name="内蒙古自治区">
+        <city name="阿拉善盟">
+            <district name="阿拉善右旗" zipcode="750300" />
+            <district name="阿拉善左旗" zipcode="750300" />
+            <district name="额济纳旗" zipcode="750300" />
+            <district name="其他" zipcode="750300" />
+        </city>
+        <city name="巴彦淖尔市">
+            <district name="磴口县" zipcode="014400" />
+            <district name="杭锦后旗" zipcode="014400" />
+            <district name="临河区" zipcode="014400" />
+            <district name="乌拉特后旗" zipcode="014400" />
+            <district name="乌拉特前旗" zipcode="014400" />
+            <district name="乌拉特中旗" zipcode="014400" />
+            <district name="五原县" zipcode="014400" />
+            <district name="其他" zipcode="14400" />
+        </city>
+        <city name="包头市">
+            <district name="白云鄂博矿区" zipcode="014000" />
+            <district name="达尔罕茂明安联合旗" zipcode="014000" />
+            <district name="东河区" zipcode="014000" />
+            <district name="固阳县" zipcode="014000" />
+            <district name="九原区" zipcode="014000" />
+            <district name="昆都仑区" zipcode="014000" />
+            <district name="青山区" zipcode="014000" />
+            <district name="石拐区" zipcode="014000" />
+            <district name="土默特右旗" zipcode="014000" />
+            <district name="其他" zipcode="14000" />
+        </city>
+        <city name="赤峰市">
+            <district name="阿鲁科尔沁旗" zipcode="024000" />
+            <district name="敖汉旗" zipcode="024000" />
+            <district name="巴林右旗" zipcode="024000" />
+            <district name="巴林左旗" zipcode="024000" />
+            <district name="红山区" zipcode="024000" />
+            <district name="喀喇沁旗" zipcode="024000" />
+            <district name="克什克腾旗" zipcode="024000" />
+            <district name="林西县" zipcode="024000" />
+            <district name="宁城县" zipcode="024000" />
+            <district name="松山区" zipcode="024000" />
+            <district name="翁牛特旗" zipcode="024000" />
+            <district name="元宝山区" zipcode="024000" />
+            <district name="其他" zipcode="24000" />
+        </city>
+        <city name="鄂尔多斯市">
+            <district name="达拉特旗" zipcode="010300" />
+            <district name="东胜区" zipcode="010300" />
+            <district name="鄂托克旗" zipcode="010300" />
+            <district name="鄂托克前旗" zipcode="010300" />
+            <district name="杭锦旗" zipcode="010300" />
+            <district name="乌审旗" zipcode="010300" />
+            <district name="伊金霍洛旗" zipcode="010300" />
+            <district name="准格尔旗" zipcode="010300" />
+            <district name="其他" zipcode="10300" />
+        </city>
+        <city name="呼和浩特市">
+            <district name="和林格尔县" zipcode="010000" />
+            <district name="回民区" zipcode="010000" />
+            <district name="清水河县" zipcode="010000" />
+            <district name="赛罕区" zipcode="010000" />
+            <district name="土默特左旗" zipcode="010000" />
+            <district name="托克托县" zipcode="010000" />
+            <district name="武川县" zipcode="010000" />
+            <district name="新城区" zipcode="010000" />
+            <district name="玉泉区" zipcode="010000" />
+            <district name="其他" zipcode="10000" />
+        </city>
+        <city name="呼伦贝尔市">
+            <district name="阿荣旗" zipcode="021000" />
+            <district name="陈巴尔虎旗" zipcode="021000" />
+            <district name="额尔古纳市" zipcode="021000" />
+            <district name="鄂伦春自治旗" zipcode="021000" />
+            <district name="鄂温克族自治旗" zipcode="021000" />
+            <district name="根河市" zipcode="021000" />
+            <district name="海拉尔区" zipcode="021000" />
+            <district name="满洲里市" zipcode="021000" />
+            <district name="莫力达瓦达斡尔族自治旗" zipcode="021000" />
+            <district name="新巴尔虎右旗" zipcode="021000" />
+            <district name="新巴尔虎左旗" zipcode="021000" />
+            <district name="牙克石市" zipcode="021000" />
+            <district name="扎兰屯市" zipcode="021000" />
+            <district name="其他" zipcode="21000" />
+        </city>
+        <city name="通辽市">
+            <district name="霍林郭勒市" zipcode="028000" />
+            <district name="开鲁县" zipcode="028000" />
+            <district name="科尔沁区" zipcode="028000" />
+            <district name="科尔沁左翼后旗" zipcode="028000" />
+            <district name="科尔沁左翼中旗" zipcode="028000" />
+            <district name="库伦旗" zipcode="028000" />
+            <district name="奈曼旗" zipcode="028000" />
+            <district name="扎鲁特旗" zipcode="028000" />
+            <district name="其他" zipcode="28000" />
+        </city>
+        <city name="乌海市">
+            <district name="海勃湾区" zipcode="016000" />
+            <district name="海南区" zipcode="016000" />
+            <district name="乌达区" zipcode="016000" />
+            <district name="其他" zipcode="16000" />
+        </city>
+        <city name="乌兰察布市">
+            <district name="察哈尔右翼后旗" zipcode="012000" />
+            <district name="察哈尔右翼前旗" zipcode="012000" />
+            <district name="察哈尔右翼中旗" zipcode="012000" />
+            <district name="丰镇市" zipcode="012000" />
+            <district name="化德县" zipcode="012000" />
+            <district name="集宁区" zipcode="012000" />
+            <district name="凉城县" zipcode="012000" />
+            <district name="商都县" zipcode="012000" />
+            <district name="四子王旗" zipcode="012000" />
+            <district name="兴和县" zipcode="012000" />
+            <district name="卓资县" zipcode="012000" />
+            <district name="其他" zipcode="12000" />
+        </city>
+        <city name="锡林郭勒盟">
+            <district name="阿巴嘎旗" zipcode="011100" />
+            <district name="东乌珠穆沁旗" zipcode="011100" />
+            <district name="多伦县" zipcode="011100" />
+            <district name="二连浩特市" zipcode="011100" />
+            <district name="苏尼特右旗" zipcode="011100" />
+            <district name="苏尼特左旗" zipcode="011100" />
+            <district name="太仆寺旗" zipcode="011100" />
+            <district name="西乌珠穆沁旗" zipcode="011100" />
+            <district name="锡林浩特市" zipcode="011100" />
+            <district name="镶黄旗" zipcode="011100" />
+            <district name="正蓝旗" zipcode="011100" />
+            <district name="正镶白旗" zipcode="011100" />
+            <district name="其他" zipcode="11100" />
+        </city>
+        <city name="兴安盟">
+            <district name="阿尔山市" zipcode="137400" />
+            <district name="科尔沁右翼前旗" zipcode="137400" />
+            <district name="科尔沁右翼中旗" zipcode="137400" />
+            <district name="突泉县" zipcode="137400" />
+            <district name="乌兰浩特市" zipcode="137400" />
+            <district name="扎赉特旗" zipcode="137400" />
+            <district name="其他" zipcode="137400" />
+        </city>
+    </province>
+    <province name="宁夏回族自治区">
+        <city name="固原市">
+            <district name="泾源县" zipcode="756000" />
+            <district name="隆德县" zipcode="756000" />
+            <district name="彭阳县" zipcode="756000" />
+            <district name="西吉县" zipcode="756000" />
+            <district name="原州区" zipcode="756000" />
+            <district name="其他" zipcode="756000" />
+        </city>
+        <city name="石嘴山市">
+            <district name="大武口区" zipcode="753000" />
+            <district name="惠农区" zipcode="753000" />
+            <district name="平罗县" zipcode="753000" />
+            <district name="其他" zipcode="753000" />
+        </city>
+        <city name="吴忠市">
+            <district name="利通区" zipcode="751100" />
+            <district name="青铜峡市" zipcode="751100" />
+            <district name="同心县" zipcode="751100" />
+            <district name="盐池县" zipcode="751100" />
+            <district name="其他" zipcode="751100" />
+        </city>
+        <city name="银川市">
+            <district name="贺兰县" zipcode="750000" />
+            <district name="金凤区" zipcode="750000" />
+            <district name="灵武市" zipcode="750000" />
+            <district name="西夏区" zipcode="750000" />
+            <district name="兴庆区" zipcode="750000" />
+            <district name="永宁县" zipcode="750000" />
+            <district name="其他" zipcode="750000" />
+        </city>
+        <city name="中卫市">
+            <district name="海原县" zipcode="751700" />
+            <district name="沙坡头区" zipcode="751700" />
+            <district name="中宁县" zipcode="751700" />
+            <district name="其他" zipcode="751700" />
+        </city>
+    </province>
+    <province name="青海省">
+        <city name="果洛藏族自治州">
+            <district name="班玛县" zipcode="814000" />
+            <district name="达日县" zipcode="814000" />
+            <district name="甘德县" zipcode="814000" />
+            <district name="久治县" zipcode="814000" />
+            <district name="玛多县" zipcode="814000" />
+            <district name="玛沁县" zipcode="814000" />
+            <district name="其他" zipcode="814000" />
+        </city>
+        <city name="海北藏族自治州">
+            <district name="刚察县" zipcode="812200" />
+            <district name="海晏县" zipcode="812200" />
+            <district name="门源回族自治县" zipcode="812200" />
+            <district name="祁连县" zipcode="812200" />
+            <district name="其他" zipcode="812200" />
+        </city>
+        <city name="海东地区">
+            <district name="互助土族自治县" zipcode="810600" />
+            <district name="化隆回族自治县" zipcode="810600" />
+            <district name="乐都县" zipcode="810600" />
+            <district name="民和回族土族自治县" zipcode="810600" />
+            <district name="平安县" zipcode="810600" />
+            <district name="循化撒拉族自治县" zipcode="810600" />
+            <district name="其他" zipcode="810600" />
+        </city>
+        <city name="海南藏族自治州">
+            <district name="共和县" zipcode="813000" />
+            <district name="贵德县" zipcode="813000" />
+            <district name="贵南县" zipcode="813000" />
+            <district name="同德县" zipcode="813000" />
+            <district name="兴海县" zipcode="813000" />
+            <district name="其他" zipcode="813000" />
+        </city>
+        <city name="海西蒙古族藏族自治州">
+            <district name="大柴旦" zipcode="817000" />
+            <district name="德令哈市" zipcode="817000" />
+            <district name="都兰县" zipcode="817000" />
+            <district name="格尔木市" zipcode="817000" />
+            <district name="冷湖" zipcode="817000" />
+            <district name="茫崖" zipcode="817000" />
+            <district name="天峻县" zipcode="817000" />
+            <district name="乌兰县" zipcode="817000" />
+            <district name="其他" zipcode="817000" />
+        </city>
+        <city name="黄南藏族自治州">
+            <district name="河南蒙古族自治县" zipcode="811300" />
+            <district name="尖扎县" zipcode="811300" />
+            <district name="同仁县" zipcode="811300" />
+            <district name="泽库县" zipcode="811300" />
+            <district name="其他" zipcode="811300" />
+        </city>
+        <city name="西宁市">
+            <district name="城北区" zipcode="810000" />
+            <district name="城东区" zipcode="810000" />
+            <district name="城西区" zipcode="810000" />
+            <district name="城中区" zipcode="810000" />
+            <district name="大通回族土族自治县" zipcode="810000" />
+            <district name="湟源县" zipcode="810000" />
+            <district name="湟中县" zipcode="810000" />
+            <district name="其他" zipcode="810000" />
+        </city>
+        <city name="玉树藏族自治州">
+            <district name="称多县" zipcode="815000" />
+            <district name="囊谦县" zipcode="815000" />
+            <district name="曲麻莱县" zipcode="815000" />
+            <district name="玉树县" zipcode="815000" />
+            <district name="杂多县" zipcode="815000" />
+            <district name="治多县" zipcode="815000" />
+            <district name="其他" zipcode="815000" />
+        </city>
+    </province>
+    <province name="山东省">
+        <city name="滨州市">
+            <district name="滨城区" zipcode="256600" />
+            <district name="博兴县" zipcode="256600" />
+            <district name="惠民县" zipcode="256600" />
+            <district name="无棣县" zipcode="256600" />
+            <district name="阳信县" zipcode="256600" />
+            <district name="沾化县" zipcode="256600" />
+            <district name="邹平县" zipcode="256600" />
+            <district name="其他" zipcode="256600" />
+        </city>
+        <city name="德州市">
+            <district name="德城区" zipcode="253000" />
+            <district name="乐陵市" zipcode="253000" />
+            <district name="临邑县" zipcode="253000" />
+            <district name="陵县" zipcode="253000" />
+            <district name="宁津县" zipcode="253000" />
+            <district name="平原县" zipcode="253000" />
+            <district name="齐河县" zipcode="253000" />
+            <district name="庆云县" zipcode="253000" />
+            <district name="武城县" zipcode="253000" />
+            <district name="夏津县" zipcode="253000" />
+            <district name="禹城市" zipcode="253000" />
+            <district name="其他" zipcode="253000" />
+        </city>
+        <city name="东营市">
+            <district name="东营区" zipcode="257000" />
+            <district name="广饶县" zipcode="257000" />
+            <district name="河口区" zipcode="257000" />
+            <district name="垦利县" zipcode="257000" />
+            <district name="利津县" zipcode="257000" />
+            <district name="其他" zipcode="257000" />
+        </city>
+        <city name="菏泽市">
+            <district name="曹县" zipcode="274000" />
+            <district name="成武县" zipcode="274000" />
+            <district name="单县" zipcode="274000" />
+            <district name="定陶县" zipcode="274000" />
+            <district name="东明县" zipcode="274000" />
+            <district name="巨野县" zipcode="274000" />
+            <district name="鄄城县" zipcode="274000" />
+            <district name="牡丹区" zipcode="274000" />
+            <district name="郓城县" zipcode="274000" />
+            <district name="其他" zipcode="274000" />
+        </city>
+        <city name="济南市">
+            <district name="长清区" zipcode="250000" />
+            <district name="槐荫区" zipcode="250000" />
+            <district name="济阳县" zipcode="250000" />
+            <district name="历城区" zipcode="250000" />
+            <district name="历下区" zipcode="250000" />
+            <district name="平阴县" zipcode="250000" />
+            <district name="商河县" zipcode="250000" />
+            <district name="市中区" zipcode="250000" />
+            <district name="天桥区" zipcode="250000" />
+            <district name="章丘市" zipcode="250000" />
+            <district name="其他" zipcode="250000" />
+        </city>
+        <city name="济宁市">
+            <district name="嘉祥县" zipcode="272100" />
+            <district name="金乡县" zipcode="272100" />
+            <district name="梁山县" zipcode="272100" />
+            <district name="曲阜市" zipcode="272100" />
+            <district name="任城区" zipcode="272100" />
+            <district name="市中区" zipcode="272100" />
+            <district name="泗水县" zipcode="272100" />
+            <district name="微山县" zipcode="272100" />
+            <district name="汶上县" zipcode="272100" />
+            <district name="兖州市" zipcode="272100" />
+            <district name="鱼台县" zipcode="272100" />
+            <district name="邹城市" zipcode="272100" />
+            <district name="其他" zipcode="272100" />
+        </city>
+        <city name="莱芜市">
+            <district name="钢城区" zipcode="271100" />
+            <district name="莱城区" zipcode="271100" />
+            <district name="其他" zipcode="271100" />
+        </city>
+        <city name="聊城市">
+            <district name="茌平县" zipcode="252000" />
+            <district name="东阿县" zipcode="252000" />
+            <district name="东昌府区" zipcode="252000" />
+            <district name="高唐县" zipcode="252000" />
+            <district name="冠县" zipcode="252000" />
+            <district name="临清市" zipcode="252000" />
+            <district name="莘县" zipcode="252000" />
+            <district name="阳谷县" zipcode="252000" />
+            <district name="其他" zipcode="252000" />
+        </city>
+        <city name="临沂市">
+            <district name="苍山县" zipcode="276000" />
+            <district name="费县" zipcode="276000" />
+            <district name="河东区" zipcode="276000" />
+            <district name="莒南县" zipcode="276000" />
+            <district name="兰山区" zipcode="276000" />
+            <district name="临沭县" zipcode="276000" />
+            <district name="罗庄区" zipcode="276000" />
+            <district name="蒙阴县" zipcode="276000" />
+            <district name="平邑县" zipcode="276000" />
+            <district name="郯城县" zipcode="276000" />
+            <district name="沂南县" zipcode="276000" />
+            <district name="沂水县" zipcode="276000" />
+            <district name="其他" zipcode="276000" />
+        </city>
+        <city name="青岛市">
+            <district name="城阳区" zipcode="266000" />
+            <district name="黄岛区" zipcode="266000" />
+            <district name="即墨市" zipcode="266000" />
+            <district name="胶南市" zipcode="266000" />
+            <district name="胶州市" zipcode="266000" />
+            <district name="莱西市" zipcode="266000" />
+            <district name="崂山区" zipcode="266000" />
+            <district name="李沧区" zipcode="266000" />
+            <district name="平度市" zipcode="266000" />
+            <district name="市北区" zipcode="266000" />
+            <district name="市南区" zipcode="266000" />
+            <district name="四方区" zipcode="266000" />
+            <district name="其他" zipcode="266000" />
+        </city>
+        <city name="日照市">
+            <district name="东港区" zipcode="276800" />
+            <district name="莒县" zipcode="276800" />
+            <district name="岚山区" zipcode="276800" />
+            <district name="五莲县" zipcode="276800" />
+            <district name="其他" zipcode="276800" />
+        </city>
+        <city name="泰安市">
+            <district name="岱岳区" zipcode="271000" />
+            <district name="东平县" zipcode="271000" />
+            <district name="肥城市" zipcode="271000" />
+            <district name="宁阳县" zipcode="271000" />
+            <district name="泰山区" zipcode="271000" />
+            <district name="新泰市" zipcode="271000" />
+            <district name="其他" zipcode="271000" />
+        </city>
+        <city name="威海市">
+            <district name="环翠区" zipcode="265700" />
+            <district name="荣成市" zipcode="265700" />
+            <district name="乳山市" zipcode="265700" />
+            <district name="文登市" zipcode="265700" />
+            <district name="其他" zipcode="265700" />
+        </city>
+        <city name="潍坊市">
+            <district name="安丘市" zipcode="261000" />
+            <district name="昌乐县" zipcode="261000" />
+            <district name="昌邑市" zipcode="261000" />
+            <district name="坊子区" zipcode="261000" />
+            <district name="高密市" zipcode="261000" />
+            <district name="寒亭区" zipcode="261000" />
+            <district name="奎文区" zipcode="261000" />
+            <district name="临朐县" zipcode="261000" />
+            <district name="青州市" zipcode="261000" />
+            <district name="寿光市" zipcode="261000" />
+            <district name="潍城区" zipcode="261000" />
+            <district name="诸城市" zipcode="261000" />
+            <district name="其他" zipcode="261000" />
+        </city>
+        <city name="烟台市">
+            <district name="长岛县" zipcode="264000" />
+            <district name="福山区" zipcode="264000" />
+            <district name="海阳市" zipcode="264000" />
+            <district name="开发区" zipcode="264000" />
+            <district name="莱山区" zipcode="264000" />
+            <district name="莱阳市" zipcode="264000" />
+            <district name="莱州市" zipcode="264000" />
+            <district name="龙口市" zipcode="264000" />
+            <district name="牟平区" zipcode="264000" />
+            <district name="蓬莱市" zipcode="264000" />
+            <district name="栖霞市" zipcode="264000" />
+            <district name="招远市" zipcode="264000" />
+            <district name="芝罘区" zipcode="264000" />
+            <district name="其他" zipcode="264000" />
+        </city>
+        <city name="枣庄市">
+            <district name="山亭区" zipcode="277100" />
+            <district name="市中区" zipcode="277100" />
+            <district name="台儿庄区" zipcode="277100" />
+            <district name="滕州市" zipcode="277100" />
+            <district name="薛城区" zipcode="277100" />
+            <district name="峄城区" zipcode="277100" />
+            <district name="其他" zipcode="277100" />
+        </city>
+        <city name="淄博市">
+            <district name="博山区" zipcode="255000" />
+            <district name="高青县" zipcode="255000" />
+            <district name="桓台县" zipcode="255000" />
+            <district name="临淄区" zipcode="255000" />
+            <district name="沂源县" zipcode="255000" />
+            <district name="张店区" zipcode="255000" />
+            <district name="周村区" zipcode="255000" />
+            <district name="淄川区" zipcode="255000" />
+            <district name="其他" zipcode="255000" />
+        </city>
+    </province>
+    <province name="山西省">
+        <city name="长治市">
+            <district name="长治县" zipcode="046000" />
+            <district name="长子县" zipcode="046000" />
+            <district name="城区" zipcode="046000" />
+            <district name="壶关县" zipcode="046000" />
+            <district name="郊区" zipcode="046000" />
+            <district name="黎城县" zipcode="046000" />
+            <district name="潞城市" zipcode="046000" />
+            <district name="平顺县" zipcode="046000" />
+            <district name="沁县" zipcode="046000" />
+            <district name="沁源县" zipcode="046000" />
+            <district name="屯留县" zipcode="046000" />
+            <district name="武乡县" zipcode="046000" />
+            <district name="襄垣县" zipcode="046000" />
+            <district name="其他" zipcode="46000" />
+        </city>
+        <city name="大同市">
+            <district name="城区" zipcode="037000" />
+            <district name="大同县" zipcode="037000" />
+            <district name="广灵县" zipcode="037000" />
+            <district name="浑源县" zipcode="037000" />
+            <district name="矿区" zipcode="037000" />
+            <district name="灵丘县" zipcode="037000" />
+            <district name="南郊区" zipcode="037000" />
+            <district name="天镇县" zipcode="037000" />
+            <district name="新荣区" zipcode="037000" />
+            <district name="阳高县" zipcode="037000" />
+            <district name="左云县" zipcode="037000" />
+            <district name="其他" zipcode="37000" />
+        </city>
+        <city name="晋城市">
+            <district name="城区" zipcode="048000" />
+            <district name="高平市" zipcode="048000" />
+            <district name="陵川县" zipcode="048000" />
+            <district name="沁水县" zipcode="048000" />
+            <district name="阳城县" zipcode="048000" />
+            <district name="泽州县" zipcode="048000" />
+            <district name="其他" zipcode="48000" />
+        </city>
+        <city name="晋中市">
+            <district name="和顺县" zipcode="030600" />
+            <district name="介休市" zipcode="030600" />
+            <district name="灵石县" zipcode="030600" />
+            <district name="平遥县" zipcode="030600" />
+            <district name="祁县" zipcode="030600" />
+            <district name="寿阳县" zipcode="030600" />
+            <district name="太谷县" zipcode="030600" />
+            <district name="昔阳县" zipcode="030600" />
+            <district name="榆次区" zipcode="030600" />
+            <district name="榆社县" zipcode="030600" />
+            <district name="左权县" zipcode="030600" />
+            <district name="其他" zipcode="30600" />
+        </city>
+        <city name="临汾市">
+            <district name="安泽县" zipcode="041000" />
+            <district name="大宁县" zipcode="041000" />
+            <district name="汾西县" zipcode="041000" />
+            <district name="浮山县" zipcode="041000" />
+            <district name="古县" zipcode="041000" />
+            <district name="洪洞县" zipcode="041000" />
+            <district name="侯马市" zipcode="041000" />
+            <district name="霍州市" zipcode="041000" />
+            <district name="吉县" zipcode="041000" />
+            <district name="蒲县" zipcode="041000" />
+            <district name="曲沃县" zipcode="041000" />
+            <district name="隰县" zipcode="041000" />
+            <district name="乡宁县" zipcode="041000" />
+            <district name="襄汾县" zipcode="041000" />
+            <district name="尧都区" zipcode="041000" />
+            <district name="翼城县" zipcode="041000" />
+            <district name="永和县" zipcode="041000" />
+            <district name="其他" zipcode="41000" />
+        </city>
+        <city name="吕梁市">
+            <district name="方山县" zipcode="030500" />
+            <district name="汾阳市" zipcode="030500" />
+            <district name="交城县" zipcode="030500" />
+            <district name="交口县" zipcode="030500" />
+            <district name="岚县" zipcode="030500" />
+            <district name="离石区" zipcode="030500" />
+            <district name="临县" zipcode="030500" />
+            <district name="柳林县" zipcode="030500" />
+            <district name="石楼县" zipcode="030500" />
+            <district name="文水县" zipcode="030500" />
+            <district name="孝义市" zipcode="030500" />
+            <district name="兴县" zipcode="030500" />
+            <district name="中阳县" zipcode="030500" />
+            <district name="其他" zipcode="30500" />
+        </city>
+        <city name="朔州市">
+            <district name="怀仁县" zipcode="036000" />
+            <district name="平鲁区" zipcode="036000" />
+            <district name="山阴县" zipcode="036000" />
+            <district name="朔城区" zipcode="036000" />
+            <district name="应县" zipcode="036000" />
+            <district name="右玉县" zipcode="036000" />
+            <district name="其他" zipcode="36000" />
+        </city>
+        <city name="太原市">
+            <district name="古交市" zipcode="030000" />
+            <district name="尖草坪区" zipcode="030000" />
+            <district name="晋源区" zipcode="030000" />
+            <district name="娄烦县" zipcode="030000" />
+            <district name="清徐县" zipcode="030000" />
+            <district name="万柏林区" zipcode="030000" />
+            <district name="小店区" zipcode="030000" />
+            <district name="杏花岭区" zipcode="030000" />
+            <district name="阳曲县" zipcode="030000" />
+            <district name="迎泽区" zipcode="030000" />
+            <district name="其他" zipcode="30000" />
+        </city>
+        <city name="忻州市">
+            <district name="保德县" zipcode="034000" />
+            <district name="代县" zipcode="034000" />
+            <district name="定襄县" zipcode="034000" />
+            <district name="繁峙县" zipcode="034000" />
+            <district name="河曲县" zipcode="034000" />
+            <district name="静乐县" zipcode="034000" />
+            <district name="岢岚县" zipcode="034000" />
+            <district name="宁武县" zipcode="034000" />
+            <district name="偏关县" zipcode="034000" />
+            <district name="神池县" zipcode="034000" />
+            <district name="五台县" zipcode="034000" />
+            <district name="五寨县" zipcode="034000" />
+            <district name="忻府区" zipcode="034000" />
+            <district name="原平市" zipcode="034000" />
+            <district name="其他" zipcode="34000" />
+        </city>
+        <city name="阳泉市">
+            <district name="城区" zipcode="045000" />
+            <district name="郊区" zipcode="045000" />
+            <district name="矿区" zipcode="045000" />
+            <district name="平定县" zipcode="045000" />
+            <district name="盂县" zipcode="045000" />
+            <district name="其他" zipcode="45000" />
+        </city>
+        <city name="运城市">
+            <district name="河津市" zipcode="044000" />
+            <district name="稷山县" zipcode="044000" />
+            <district name="绛县" zipcode="044000" />
+            <district name="临猗县" zipcode="044000" />
+            <district name="平陆县" zipcode="044000" />
+            <district name="芮城县" zipcode="044000" />
+            <district name="万荣县" zipcode="044000" />
+            <district name="闻喜县" zipcode="044000" />
+            <district name="夏县" zipcode="044000" />
+            <district name="新绛县" zipcode="044000" />
+            <district name="盐湖区" zipcode="044000" />
+            <district name="永济市" zipcode="044000" />
+            <district name="垣曲县" zipcode="044000" />
+            <district name="其他" zipcode="44000" />
+        </city>
+    </province>
+    <province name="陕西省">
+        <city name="安康市">
+            <district name="白河县" zipcode="725000" />
+            <district name="汉滨区" zipcode="725000" />
+            <district name="汉阴县" zipcode="725000" />
+            <district name="岚皋县" zipcode="725000" />
+            <district name="宁陕县" zipcode="725000" />
+            <district name="平利县" zipcode="725000" />
+            <district name="石泉县" zipcode="725000" />
+            <district name="旬阳县" zipcode="725000" />
+            <district name="镇坪县" zipcode="725000" />
+            <district name="紫阳县" zipcode="725000" />
+            <district name="其他" zipcode="725000" />
+        </city>
+        <city name="宝鸡市">
+            <district name="陈仓区" zipcode="721000" />
+            <district name="凤县" zipcode="721000" />
+            <district name="凤翔县" zipcode="721000" />
+            <district name="扶风县" zipcode="721000" />
+            <district name="金台区" zipcode="721000" />
+            <district name="麟游县" zipcode="721000" />
+            <district name="陇县" zipcode="721000" />
+            <district name="眉县" zipcode="721000" />
+            <district name="岐山县" zipcode="721000" />
+            <district name="千阳县" zipcode="721000" />
+            <district name="太白县" zipcode="721000" />
+            <district name="渭滨区" zipcode="721000" />
+            <district name="其他" zipcode="721000" />
+        </city>
+        <city name="汉中市">
+            <district name="城固县" zipcode="723000" />
+            <district name="佛坪县" zipcode="723000" />
+            <district name="汉台区" zipcode="723000" />
+            <district name="留坝县" zipcode="723000" />
+            <district name="略阳县" zipcode="723000" />
+            <district name="勉县" zipcode="723000" />
+            <district name="南郑县" zipcode="723000" />
+            <district name="宁强县" zipcode="723000" />
+            <district name="西乡县" zipcode="723000" />
+            <district name="洋县" zipcode="723000" />
+            <district name="镇巴县" zipcode="723000" />
+            <district name="其他" zipcode="723000" />
+        </city>
+        <city name="商洛市">
+            <district name="丹凤县" zipcode="726000" />
+            <district name="洛南县" zipcode="726000" />
+            <district name="山阳县" zipcode="726000" />
+            <district name="商南县" zipcode="726000" />
+            <district name="商州区" zipcode="726000" />
+            <district name="镇安县" zipcode="726000" />
+            <district name="柞水县" zipcode="726000" />
+            <district name="其他" zipcode="726000" />
+        </city>
+        <city name="铜川市">
+            <district name="王益区" zipcode="727000" />
+            <district name="耀州区" zipcode="727000" />
+            <district name="宜君县" zipcode="727000" />
+            <district name="印台区" zipcode="727000" />
+            <district name="其他" zipcode="727000" />
+        </city>
+        <city name="渭南市">
+            <district name="白水县" zipcode="714000" />
+            <district name="澄城县" zipcode="714000" />
+            <district name="大荔县" zipcode="714000" />
+            <district name="富平县" zipcode="714000" />
+            <district name="韩城市" zipcode="714000" />
+            <district name="合阳县" zipcode="714000" />
+            <district name="华县" zipcode="714000" />
+            <district name="华阴市" zipcode="714000" />
+            <district name="临渭区" zipcode="714000" />
+            <district name="蒲城县" zipcode="714000" />
+            <district name="潼关县" zipcode="714000" />
+            <district name="其他" zipcode="714000" />
+        </city>
+        <city name="西安市">
+            <district name="灞桥区" zipcode="710000" />
+            <district name="碑林区" zipcode="710000" />
+            <district name="长安区" zipcode="710000" />
+            <district name="高陵县" zipcode="710000" />
+            <district name="户县" zipcode="710000" />
+            <district name="蓝田县" zipcode="710000" />
+            <district name="莲湖区" zipcode="710000" />
+            <district name="临潼区" zipcode="710000" />
+            <district name="未央区" zipcode="710000" />
+            <district name="新城区" zipcode="710000" />
+            <district name="阎良区" zipcode="710000" />
+            <district name="雁塔区" zipcode="710000" />
+            <district name="周至县" zipcode="710000" />
+            <district name="其他" zipcode="710000" />
+        </city>
+        <city name="咸阳市">
+            <district name="彬县" zipcode="712000" />
+            <district name="长武县" zipcode="712000" />
+            <district name="淳化县" zipcode="712000" />
+            <district name="泾阳县" zipcode="712000" />
+            <district name="礼泉县" zipcode="712000" />
+            <district name="乾县" zipcode="712000" />
+            <district name="秦都区" zipcode="712000" />
+            <district name="三原县" zipcode="712000" />
+            <district name="渭城区" zipcode="712000" />
+            <district name="武功县" zipcode="712000" />
+            <district name="兴平市" zipcode="712000" />
+            <district name="旬邑县" zipcode="712000" />
+            <district name="杨凌区" zipcode="712000" />
+            <district name="永寿县" zipcode="712000" />
+            <district name="其他" zipcode="712000" />
+        </city>
+        <city name="延安市">
+            <district name="安塞县" zipcode="716000" />
+            <district name="宝塔区" zipcode="716000" />
+            <district name="富县" zipcode="716000" />
+            <district name="甘泉县" zipcode="716000" />
+            <district name="黄陵县" zipcode="716000" />
+            <district name="黄龙县" zipcode="716000" />
+            <district name="洛川县" zipcode="716000" />
+            <district name="延长县" zipcode="716000" />
+            <district name="延川县" zipcode="716000" />
+            <district name="宜川县" zipcode="716000" />
+            <district name="志丹县" zipcode="716000" />
+            <district name="子长县" zipcode="716000" />
+            <district name="其他" zipcode="716000" />
+        </city>
+        <city name="榆林市">
+            <district name="定边县" zipcode="719000" />
+            <district name="府谷县" zipcode="719000" />
+            <district name="横山县" zipcode="719000" />
+            <district name="佳县" zipcode="719000" />
+            <district name="靖边县" zipcode="719000" />
+            <district name="米脂县" zipcode="719000" />
+            <district name="清涧县" zipcode="719000" />
+            <district name="神木县" zipcode="719000" />
+            <district name="绥德县" zipcode="719000" />
+            <district name="吴堡县" zipcode="719000" />
+            <district name="榆阳区" zipcode="719000" />
+            <district name="子洲县" zipcode="719000" />
+            <district name="其他" zipcode="719000" />
+        </city>
+    </province>
+    <province name="上海市">
+        <city name="上海市">
+            <district name="宝山区" zipcode="200000" />
+            <district name="长宁区" zipcode="200000" />
+            <district name="崇明县" zipcode="200000" />
+            <district name="奉贤区" zipcode="200000" />
+            <district name="虹口区" zipcode="200000" />
+            <district name="黄浦区" zipcode="200000" />
+            <district name="嘉定区" zipcode="200000" />
+            <district name="金山区" zipcode="200000" />
+            <district name="静安区" zipcode="200000" />
+            <district name="卢湾区" zipcode="200000" />
+            <district name="闵行区" zipcode="200000" />
+            <district name="南汇区" zipcode="200000" />
+            <district name="浦东新区" zipcode="200000" />
+            <district name="普陀区" zipcode="200000" />
+            <district name="青浦区" zipcode="200000" />
+            <district name="松江区" zipcode="200000" />
+            <district name="徐汇区" zipcode="200000" />
+            <district name="杨浦区" zipcode="200000" />
+            <district name="闸北区" zipcode="200000" />
+            <district name="其他" zipcode="200000" />
+        </city>
+    </province>
+    <province name="四川省">
+        <city name="阿坝藏族羌族自治州">
+            <district name="阿坝县" zipcode="624000" />
+            <district name="黑水县" zipcode="624000" />
+            <district name="红原县" zipcode="624000" />
+            <district name="金川县" zipcode="624000" />
+            <district name="九寨沟县" zipcode="624000" />
+            <district name="理县" zipcode="624000" />
+            <district name="马尔康县" zipcode="624000" />
+            <district name="茂县" zipcode="624000" />
+            <district name="壤塘县" zipcode="624000" />
+            <district name="若尔盖县" zipcode="624000" />
+            <district name="松潘县" zipcode="624000" />
+            <district name="汶川县" zipcode="624000" />
+            <district name="小金县" zipcode="624000" />
+            <district name="其他" zipcode="624000" />
+        </city>
+        <city name="巴中市">
+            <district name="巴州区" zipcode="636600" />
+            <district name="南江县" zipcode="636600" />
+            <district name="平昌县" zipcode="636600" />
+            <district name="通江县" zipcode="636600" />
+            <district name="其他" zipcode="636600" />
+        </city>
+        <city name="成都市">
+            <district name="成华区" zipcode="610000" />
+            <district name="崇州市" zipcode="610000" />
+            <district name="大邑县" zipcode="610000" />
+            <district name="都江堰市" zipcode="610000" />
+            <district name="金牛区" zipcode="610000" />
+            <district name="金堂县" zipcode="610000" />
+            <district name="锦江区" zipcode="610000" />
+            <district name="龙泉驿区" zipcode="610000" />
+            <district name="彭州市" zipcode="610000" />
+            <district name="郫县" zipcode="610000" />
+            <district name="蒲江县" zipcode="610000" />
+            <district name="青白江区" zipcode="610000" />
+            <district name="青羊区" zipcode="610000" />
+            <district name="邛崃市" zipcode="610000" />
+            <district name="双流县" zipcode="610000" />
+            <district name="温江区" zipcode="610000" />
+            <district name="武侯区" zipcode="610000" />
+            <district name="新都区" zipcode="610000" />
+            <district name="新津县" zipcode="610000" />
+            <district name="其他" zipcode="610000" />
+        </city>
+        <city name="达州市">
+            <district name="达县" zipcode="635000" />
+            <district name="大竹县" zipcode="635000" />
+            <district name="开江县" zipcode="635000" />
+            <district name="渠县" zipcode="635000" />
+            <district name="通川区" zipcode="635000" />
+            <district name="万源市" zipcode="635000" />
+            <district name="宣汉县" zipcode="635000" />
+            <district name="其他" zipcode="635000" />
+        </city>
+        <city name="德阳市">
+            <district name="广汉市" zipcode="618000" />
+            <district name="旌阳区" zipcode="618000" />
+            <district name="罗江县" zipcode="618000" />
+            <district name="绵竹市" zipcode="618000" />
+            <district name="什邡市" zipcode="618000" />
+            <district name="中江县" zipcode="618000" />
+            <district name="其他" zipcode="618000" />
+        </city>
+        <city name="甘孜藏族自治州">
+            <district name="巴塘县" zipcode="626000" />
+            <district name="白玉县" zipcode="626000" />
+            <district name="丹巴县" zipcode="626000" />
+            <district name="道孚县" zipcode="626000" />
+            <district name="稻城县" zipcode="626000" />
+            <district name="得荣县" zipcode="626000" />
+            <district name="德格县" zipcode="626000" />
+            <district name="甘孜县" zipcode="626000" />
+            <district name="九龙县" zipcode="626000" />
+            <district name="康定县" zipcode="626000" />
+            <district name="理塘县" zipcode="626000" />
+            <district name="泸定县" zipcode="626000" />
+            <district name="炉霍县" zipcode="626000" />
+            <district name="色达县" zipcode="626000" />
+            <district name="石渠县" zipcode="626000" />
+            <district name="乡城县" zipcode="626000" />
+            <district name="新龙县" zipcode="626000" />
+            <district name="雅江县" zipcode="626000" />
+            <district name="其他" zipcode="626000" />
+        </city>
+        <city name="广安市">
+            <district name="广安区" zipcode="638500" />
+            <district name="华蓥市" zipcode="638500" />
+            <district name="邻水县" zipcode="638500" />
+            <district name="武胜县" zipcode="638500" />
+            <district name="岳池县" zipcode="638500" />
+            <district name="其他" zipcode="638500" />
+        </city>
+        <city name="广元市">
+            <district name="苍溪县" zipcode="628000" />
+            <district name="朝天区" zipcode="628000" />
+            <district name="剑阁县" zipcode="628000" />
+            <district name="利州区" zipcode="628000" />
+            <district name="青川县" zipcode="628000" />
+            <district name="旺苍县" zipcode="628000" />
+            <district name="元坝区" zipcode="628000" />
+            <district name="其他" zipcode="628000" />
+        </city>
+        <city name="乐山市">
+            <district name="峨边彝族自治县" zipcode="614000" />
+            <district name="峨眉山市" zipcode="614000" />
+            <district name="夹江县" zipcode="614000" />
+            <district name="犍为县" zipcode="614000" />
+            <district name="金口河区" zipcode="614000" />
+            <district name="井研县" zipcode="614000" />
+            <district name="马边彝族自治县" zipcode="614000" />
+            <district name="沐川县" zipcode="614000" />
+            <district name="沙湾区" zipcode="614000" />
+            <district name="市中区" zipcode="614000" />
+            <district name="五通桥区" zipcode="614000" />
+            <district name="其他" zipcode="614000" />
+        </city>
+        <city name="凉山彝族自治州">
+            <district name="布拖县" zipcode="615000" />
+            <district name="德昌县" zipcode="615000" />
+            <district name="甘洛县" zipcode="615000" />
+            <district name="会东县" zipcode="615000" />
+            <district name="会理县" zipcode="615000" />
+            <district name="金阳县" zipcode="615000" />
+            <district name="雷波县" zipcode="615000" />
+            <district name="美姑县" zipcode="615000" />
+            <district name="冕宁县" zipcode="615000" />
+            <district name="木里藏族自治县" zipcode="615000" />
+            <district name="宁南县" zipcode="615000" />
+            <district name="普格县" zipcode="615000" />
+            <district name="西昌市" zipcode="615000" />
+            <district name="喜德县" zipcode="615000" />
+            <district name="盐源县" zipcode="615000" />
+            <district name="越西县" zipcode="615000" />
+            <district name="昭觉县" zipcode="615000" />
+            <district name="其他" zipcode="615000" />
+        </city>
+        <city name="泸州市">
+            <district name="古蔺县" zipcode="646000" />
+            <district name="合江县" zipcode="646000" />
+            <district name="江阳区" zipcode="646000" />
+            <district name="龙马潭区" zipcode="646000" />
+            <district name="泸县" zipcode="646000" />
+            <district name="纳溪区" zipcode="646000" />
+            <district name="叙永县" zipcode="646000" />
+            <district name="其他" zipcode="646000" />
+        </city>
+        <city name="眉山市">
+            <district name="丹棱县" zipcode="620000" />
+            <district name="东坡区" zipcode="620000" />
+            <district name="洪雅县" zipcode="620000" />
+            <district name="彭山县" zipcode="620000" />
+            <district name="青神县" zipcode="620000" />
+            <district name="仁寿县" zipcode="620000" />
+            <district name="其他" zipcode="620000" />
+        </city>
+        <city name="绵阳市">
+            <district name="安县" zipcode="621000" />
+            <district name="北川羌族自治县" zipcode="621000" />
+            <district name="涪城区" zipcode="621000" />
+            <district name="江油市" zipcode="621000" />
+            <district name="平武县" zipcode="621000" />
+            <district name="三台县" zipcode="621000" />
+            <district name="盐亭县" zipcode="621000" />
+            <district name="游仙区" zipcode="621000" />
+            <district name="梓潼县" zipcode="621000" />
+            <district name="其他" zipcode="621000" />
+        </city>
+        <city name="内江市">
+            <district name="东兴区" zipcode="641000" />
+            <district name="隆昌县" zipcode="641000" />
+            <district name="市中区" zipcode="641000" />
+            <district name="威远县" zipcode="641000" />
+            <district name="资中县" zipcode="641000" />
+            <district name="其他" zipcode="641000" />
+        </city>
+        <city name="南充市">
+            <district name="高坪区" zipcode="637000" />
+            <district name="嘉陵区" zipcode="637000" />
+            <district name="阆中市" zipcode="637000" />
+            <district name="南部县" zipcode="637000" />
+            <district name="蓬安县" zipcode="637000" />
+            <district name="顺庆区" zipcode="637000" />
+            <district name="西充县" zipcode="637000" />
+            <district name="仪陇县" zipcode="637000" />
+            <district name="营山县" zipcode="637000" />
+            <district name="其他" zipcode="637000" />
+        </city>
+        <city name="攀枝花市">
+            <district name="东区" zipcode="617000" />
+            <district name="米易县" zipcode="617000" />
+            <district name="仁和区" zipcode="617000" />
+            <district name="西区" zipcode="617000" />
+            <district name="盐边县" zipcode="617000" />
+            <district name="其他" zipcode="617000" />
+        </city>
+        <city name="遂宁市">
+            <district name="安居区" zipcode="629000" />
+            <district name="船山区" zipcode="629000" />
+            <district name="大英县" zipcode="629000" />
+            <district name="蓬溪县" zipcode="629000" />
+            <district name="射洪县" zipcode="629000" />
+            <district name="其他" zipcode="629000" />
+        </city>
+        <city name="雅安市">
+            <district name="宝兴县" zipcode="625000" />
+            <district name="汉源县" zipcode="625000" />
+            <district name="芦山县" zipcode="625000" />
+            <district name="名山县" zipcode="625000" />
+            <district name="石棉县" zipcode="625000" />
+            <district name="天全县" zipcode="625000" />
+            <district name="荥经县" zipcode="625000" />
+            <district name="雨城区" zipcode="625000" />
+            <district name="其他" zipcode="625000" />
+        </city>
+        <city name="宜宾市">
+            <district name="长宁县" zipcode="644000" />
+            <district name="翠屏区" zipcode="644000" />
+            <district name="高县" zipcode="644000" />
+            <district name="珙县" zipcode="644000" />
+            <district name="江安县" zipcode="644000" />
+            <district name="筠连县" zipcode="644000" />
+            <district name="南溪县" zipcode="644000" />
+            <district name="屏山县" zipcode="644000" />
+            <district name="兴文县" zipcode="644000" />
+            <district name="宜宾县" zipcode="644000" />
+            <district name="其他" zipcode="644000" />
+        </city>
+        <city name="资阳市">
+            <district name="安岳县" zipcode="641300" />
+            <district name="简阳市" zipcode="641300" />
+            <district name="乐至县" zipcode="641300" />
+            <district name="雁江区" zipcode="641300" />
+            <district name="其他" zipcode="641300" />
+        </city>
+        <city name="自贡市">
+            <district name="大安区" zipcode="643000" />
+            <district name="富顺县" zipcode="643000" />
+            <district name="贡井区" zipcode="643000" />
+            <district name="荣县" zipcode="643000" />
+            <district name="沿滩区" zipcode="643000" />
+            <district name="自流井区" zipcode="643000" />
+            <district name="其他" zipcode="643000" />
+        </city>
+    </province>
+    <province name="天津市">
+        <city name="天津市">
+            <district name="宝坻区" zipcode="100000" />
+            <district name="北辰区" zipcode="100000" />
+            <district name="大港区" zipcode="100000" />
+            <district name="东丽区" zipcode="100000" />
+            <district name="汉沽区" zipcode="100000" />
+            <district name="和平区" zipcode="100000" />
+            <district name="河北区" zipcode="100000" />
+            <district name="河东区" zipcode="100000" />
+            <district name="河西区" zipcode="100000" />
+            <district name="红桥区" zipcode="100000" />
+            <district name="蓟县" zipcode="100000" />
+            <district name="津南区" zipcode="100000" />
+            <district name="静海县" zipcode="100000" />
+            <district name="南开区" zipcode="100000" />
+            <district name="宁河县" zipcode="100000" />
+            <district name="塘沽区" zipcode="100000" />
+            <district name="武清区" zipcode="100000" />
+            <district name="西青区" zipcode="100000" />
+            <district name="其他" zipcode="100000" />
+        </city>
+    </province>
+    <province name="西藏自治区">
+        <city name="阿里地区">
+            <district name="措勤县" zipcode="859000" />
+            <district name="噶尔县" zipcode="859000" />
+            <district name="改则县" zipcode="859000" />
+            <district name="革吉县" zipcode="859000" />
+            <district name="普兰县" zipcode="859000" />
+            <district name="日土县" zipcode="859000" />
+            <district name="札达县" zipcode="859000" />
+            <district name="其他" zipcode="859000" />
+        </city>
+        <city name="昌都地区">
+            <district name="八宿县" zipcode="854000" />
+            <district name="边坝县" zipcode="854000" />
+            <district name="察雅县" zipcode="854000" />
+            <district name="昌都县" zipcode="854000" />
+            <district name="丁青县" zipcode="854000" />
+            <district name="贡觉县" zipcode="854000" />
+            <district name="江达县" zipcode="854000" />
+            <district name="类乌齐县" zipcode="854000" />
+            <district name="洛隆县" zipcode="854000" />
+            <district name="芒康县" zipcode="854000" />
+            <district name="左贡县" zipcode="854000" />
+            <district name="其他" zipcode="854000" />
+        </city>
+        <city name="拉萨市">
+            <district name="达孜县" zipcode="850000" />
+            <district name="当雄县" zipcode="850000" />
+            <district name="堆龙德庆县" zipcode="850000" />
+            <district name="林周县" zipcode="850000" />
+            <district name="墨竹工卡县" zipcode="850000" />
+            <district name="尼木县" zipcode="850000" />
+            <district name="曲水县" zipcode="850000" />
+            <district name="其他" zipcode="850000" />
+        </city>
+        <city name="林芝地区">
+            <district name="波密县" zipcode="860100" />
+            <district name="察隅县" zipcode="860100" />
+            <district name="工布江达县" zipcode="860100" />
+            <district name="朗县" zipcode="860100" />
+            <district name="林芝县" zipcode="860100" />
+            <district name="米林县" zipcode="860100" />
+            <district name="墨脱县" zipcode="860100" />
+            <district name="其他" zipcode="860100" />
+        </city>
+        <city name="那曲地区">
+            <district name="安多县" zipcode="852000" />
+            <district name="巴青县" zipcode="852000" />
+            <district name="班戈县" zipcode="852000" />
+            <district name="比如县" zipcode="852000" />
+            <district name="嘉黎县" zipcode="852000" />
+            <district name="那曲县" zipcode="852000" />
+            <district name="尼玛县" zipcode="852000" />
+            <district name="聂荣县" zipcode="852000" />
+            <district name="申扎县" zipcode="852000" />
+            <district name="索县" zipcode="852000" />
+            <district name="其他" zipcode="852000" />
+        </city>
+        <city name="日喀则地区">
+            <district name="昂仁县" zipcode="857000" />
+            <district name="白朗县" zipcode="857000" />
+            <district name="定结县" zipcode="857000" />
+            <district name="定日县" zipcode="857000" />
+            <district name="岗巴县" zipcode="857000" />
+            <district name="吉隆县" zipcode="857000" />
+            <district name="江孜县" zipcode="857000" />
+            <district name="康马县" zipcode="857000" />
+            <district name="拉孜县" zipcode="857000" />
+            <district name="南木林县" zipcode="857000" />
+            <district name="聂拉木县" zipcode="857000" />
+            <district name="仁布县" zipcode="857000" />
+            <district name="日喀则市" zipcode="857000" />
+            <district name="萨嘎县" zipcode="857000" />
+            <district name="萨迦县" zipcode="857000" />
+            <district name="谢通门县" zipcode="857000" />
+            <district name="亚东县" zipcode="857000" />
+            <district name="仲巴县" zipcode="857000" />
+            <district name="其他" zipcode="857000" />
+        </city>
+        <city name="山南地区">
+            <district name="措美县" zipcode="856000" />
+            <district name="错那县" zipcode="856000" />
+            <district name="贡嘎县" zipcode="856000" />
+            <district name="加查县" zipcode="856000" />
+            <district name="浪卡子县" zipcode="856000" />
+            <district name="隆子县" zipcode="856000" />
+            <district name="洛扎县" zipcode="856000" />
+            <district name="乃东县" zipcode="856000" />
+            <district name="琼结县" zipcode="856000" />
+            <district name="曲松县" zipcode="856000" />
+            <district name="桑日县" zipcode="856000" />
+            <district name="扎囊县" zipcode="856000" />
+            <district name="其他" zipcode="856000" />
+        </city>
+    </province>
+    <province name="新疆维吾尔自治区">
+        <city name="阿克苏地区">
+            <district name="阿克苏市" zipcode="843000" />
+            <district name="阿瓦提县" zipcode="843000" />
+            <district name="拜城县" zipcode="843000" />
+            <district name="柯坪县" zipcode="843000" />
+            <district name="库车县" zipcode="843000" />
+            <district name="沙雅县" zipcode="843000" />
+            <district name="温宿县" zipcode="843000" />
+            <district name="乌什县" zipcode="843000" />
+            <district name="新和县" zipcode="843000" />
+            <district name="其他" zipcode="843000" />
+        </city>
+        <city name="阿勒泰地区">
+            <district name="阿勒泰市" zipcode="836500" />
+            <district name="北屯镇" zipcode="836500" />
+            <district name="布尔津县" zipcode="836500" />
+            <district name="福海县" zipcode="836500" />
+            <district name="富蕴县" zipcode="836500" />
+            <district name="哈巴河县" zipcode="836500" />
+            <district name="吉木乃县" zipcode="836500" />
+            <district name="青河县" zipcode="836500" />
+            <district name="其他" zipcode="836500" />
+        </city>
+        <city name="巴音郭楞蒙古自治州">
+            <district name="博湖县" zipcode="841000" />
+            <district name="和静县" zipcode="841000" />
+            <district name="和硕县" zipcode="841000" />
+            <district name="库尔勒市" zipcode="841000" />
+            <district name="轮台县" zipcode="841000" />
+            <district name="且末县" zipcode="841000" />
+            <district name="若羌县" zipcode="841000" />
+            <district name="尉犁县" zipcode="841000" />
+            <district name="焉耆回族自治县" zipcode="841000" />
+            <district name="其他" zipcode="841000" />
+        </city>
+        <city name="博尔塔拉蒙古自治州">
+            <district name="博乐市" zipcode="833400" />
+            <district name="精河县" zipcode="833400" />
+            <district name="温泉县" zipcode="833400" />
+            <district name="其他" zipcode="833400" />
+        </city>
+        <city name="昌吉回族自治州">
+            <district name="昌吉市" zipcode="831100" />
+            <district name="阜康市" zipcode="831100" />
+            <district name="呼图壁县" zipcode="831100" />
+            <district name="吉木萨尔县" zipcode="831100" />
+            <district name="玛纳斯县" zipcode="831100" />
+            <district name="木垒哈萨克自治县" zipcode="831100" />
+            <district name="奇台县" zipcode="831100" />
+            <district name="五家渠市" zipcode="831100" />
+            <district name="其他" zipcode="831100" />
+        </city>
+        <city name="哈密地区">
+            <district name="巴里坤哈萨克自治县" zipcode="839000" />
+            <district name="哈密市" zipcode="839000" />
+            <district name="伊吾县" zipcode="839000" />
+            <district name="其他" zipcode="839000" />
+        </city>
+        <city name="和田地区">
+            <district name="策勒县" zipcode="848000" />
+            <district name="和田市" zipcode="848000" />
+            <district name="和田县" zipcode="848000" />
+            <district name="洛浦县" zipcode="848000" />
+            <district name="民丰县" zipcode="848000" />
+            <district name="墨玉县" zipcode="848000" />
+            <district name="皮山县" zipcode="848000" />
+            <district name="于田县" zipcode="848000" />
+            <district name="其他" zipcode="848000" />
+        </city>
+        <city name="喀什地区">
+            <district name="巴楚县" zipcode="844000" />
+            <district name="伽师县" zipcode="844000" />
+            <district name="喀什市" zipcode="844000" />
+            <district name="麦盖提县" zipcode="844000" />
+            <district name="莎车县" zipcode="844000" />
+            <district name="疏附县" zipcode="844000" />
+            <district name="疏勒县" zipcode="844000" />
+            <district name="塔什库尔干塔吉克自治县" zipcode="844000" />
+            <district name="叶城县" zipcode="844000" />
+            <district name="英吉沙县" zipcode="844000" />
+            <district name="岳普湖县" zipcode="844000" />
+            <district name="泽普县" zipcode="844000" />
+            <district name="其他" zipcode="844000" />
+        </city>
+        <city name="克拉玛依市">
+            <district name="白碱滩区" zipcode="834000" />
+            <district name="独山子区" zipcode="834000" />
+            <district name="克拉玛依区" zipcode="834000" />
+            <district name="乌尔禾区" zipcode="834000" />
+            <district name="其他" zipcode="834000" />
+        </city>
+        <city name="克孜勒苏柯尔克孜自治州">
+            <district name="阿合奇县" zipcode="845350" />
+            <district name="阿克陶县" zipcode="845350" />
+            <district name="阿图什市" zipcode="845350" />
+            <district name="乌恰县" zipcode="845350" />
+            <district name="其他" zipcode="845350" />
+        </city>
+        <city name="塔城地区">
+            <district name="额敏县" zipcode="834700" />
+            <district name="和布克赛尔蒙古自治县" zipcode="834700" />
+            <district name="沙湾县" zipcode="834700" />
+            <district name="塔城市" zipcode="834700" />
+            <district name="托里县" zipcode="834700" />
+            <district name="乌苏市" zipcode="834700" />
+            <district name="裕民县" zipcode="834700" />
+            <district name="其他" zipcode="834700" />
+        </city>
+        <city name="吐鲁番地区">
+            <district name="鄯善县" zipcode="838000" />
+            <district name="吐鲁番市" zipcode="838000" />
+            <district name="托克逊县" zipcode="838000" />
+            <district name="其他" zipcode="838000" />
+        </city>
+        <city name="乌鲁木齐市">
+            <district name="达坂城区" zipcode="830000" />
+            <district name="米东区" zipcode="830000" />
+            <district name="沙依巴克区" zipcode="830000" />
+            <district name="水磨沟区" zipcode="830000" />
+            <district name="天山区" zipcode="830000" />
+            <district name="头屯河区" zipcode="830000" />
+            <district name="乌鲁木齐县" zipcode="830000" />
+            <district name="新市区" zipcode="830000" />
+            <district name="其他" zipcode="830000" />
+        </city>
+        <city name="伊犁哈萨克自治州">
+            <district name="察布查尔锡伯自治县" zipcode="833200" />
+            <district name="巩留县" zipcode="833200" />
+            <district name="霍城县" zipcode="833200" />
+            <district name="奎屯市" zipcode="833200" />
+            <district name="尼勒克县" zipcode="833200" />
+            <district name="特克斯县" zipcode="833200" />
+            <district name="新源县" zipcode="833200" />
+            <district name="伊宁市" zipcode="833200" />
+            <district name="伊宁县" zipcode="833200" />
+            <district name="昭苏县" zipcode="833200" />
+            <district name="其他" zipcode="833200" />
+        </city>
+        <city name="自治区直辖">
+            <district name="石河子市" zipcode="830000" />
+            <district name="阿拉尔市" zipcode="830000" />
+            <district name="图木舒克市" zipcode="830000" />
+            <district name="五家渠区" zipcode="830000" />
+            <district name="北屯市" zipcode="830000" />
+            <district name="铁门关市" zipcode="830000" />
+            <district name="双河市" zipcode="830000" />
+            <district name="可克达拉市" zipcode="830000" />
+            <district name="昆玉市" zipcode="830000" />
+            <district name="其他" zipcode="830000" />
+        </city>
+    </province>
+    <province name="云南省">
+        <city name="保山市">
+            <district name="伊宁市" zipcode="678000" />
+            <district name="奎屯市" zipcode="678000" />
+            <district name="霍尔果斯市" zipcode="678000" />
+            <district name="伊宁县" zipcode="678000" />
+            <district name="察布查尔县" zipcode="678000" />
+            <district name="霍城县" zipcode="678000" />
+            <district name="巩留县" zipcode="678000" />
+            <district name="新源县" zipcode="678000" />
+            <district name="昭苏县" zipcode="678000" />
+            <district name="特克斯县" zipcode="678000" />
+            <district name="尼勒克县" zipcode="678000" />
+            <district name="其他" zipcode="678000" />
+        </city>
+        <city name="楚雄彝族自治州">
+            <district name="楚雄市" zipcode="675000" />
+            <district name="大姚县" zipcode="675000" />
+            <district name="禄丰县" zipcode="675000" />
+            <district name="牟定县" zipcode="675000" />
+            <district name="南华县" zipcode="675000" />
+            <district name="双柏县" zipcode="675000" />
+            <district name="武定县" zipcode="675000" />
+            <district name="姚安县" zipcode="675000" />
+            <district name="永仁县" zipcode="675000" />
+            <district name="元谋县" zipcode="675000" />
+            <district name="其他" zipcode="675000" />
+        </city>
+        <city name="大理白族自治州">
+            <district name="宾川县" zipcode="671000" />
+            <district name="大理市" zipcode="671000" />
+            <district name="洱源县" zipcode="671000" />
+            <district name="鹤庆县" zipcode="671000" />
+            <district name="剑川县" zipcode="671000" />
+            <district name="弥渡县" zipcode="671000" />
+            <district name="南涧彝族自治县" zipcode="671000" />
+            <district name="巍山彝族回族自治县" zipcode="671000" />
+            <district name="祥云县" zipcode="671000" />
+            <district name="漾濞彝族自治县" zipcode="671000" />
+            <district name="永平县" zipcode="671000" />
+            <district name="云龙县" zipcode="671000" />
+            <district name="其他" zipcode="671000" />
+        </city>
+        <city name="德宏傣族景颇族自治州">
+            <district name="梁河县" zipcode="678400" />
+            <district name="陇川县" zipcode="678400" />
+            <district name="潞西市" zipcode="678400" />
+            <district name="瑞丽市" zipcode="678400" />
+            <district name="盈江县" zipcode="678400" />
+            <district name="其他" zipcode="678400" />
+        </city>
+        <city name="迪庆藏族自治州">
+            <district name="德钦县" zipcode="674400" />
+            <district name="维西傈僳族自治县" zipcode="674400" />
+            <district name="香格里拉县" zipcode="674400" />
+            <district name="其他" zipcode="674400" />
+        </city>
+        <city name="红河哈尼族彝族自治州">
+            <district name="个旧市" zipcode="661400" />
+            <district name="河口瑶族自治县" zipcode="661400" />
+            <district name="红河县" zipcode="661400" />
+            <district name="建水县" zipcode="661400" />
+            <district name="金平苗族瑶族傣族自治县" zipcode="661400" />
+            <district name="开远市" zipcode="661400" />
+            <district name="泸西县" zipcode="661400" />
+            <district name="绿春县" zipcode="661400" />
+            <district name="蒙自县" zipcode="661400" />
+            <district name="弥勒县" zipcode="661400" />
+            <district name="屏边苗族自治县" zipcode="661400" />
+            <district name="石屏县" zipcode="661400" />
+            <district name="元阳县" zipcode="661400" />
+            <district name="其他" zipcode="661400" />
+        </city>
+        <city name="昆明市">
+            <district name="安宁市" zipcode="650000" />
+            <district name="呈贡县" zipcode="650000" />
+            <district name="东川区" zipcode="650000" />
+            <district name="富民县" zipcode="650000" />
+            <district name="官渡区" zipcode="650000" />
+            <district name="晋宁县" zipcode="650000" />
+            <district name="禄劝彝族苗族自治县" zipcode="650000" />
+            <district name="盘龙区" zipcode="650000" />
+            <district name="石林彝族自治县" zipcode="650000" />
+            <district name="嵩明县" zipcode="650000" />
+            <district name="五华区" zipcode="650000" />
+            <district name="西山区" zipcode="650000" />
+            <district name="寻甸回族彝族自治县" zipcode="650000" />
+            <district name="宜良县" zipcode="650000" />
+            <district name="其他" zipcode="650000" />
+        </city>
+        <city name="丽江市">
+            <district name="古城区" zipcode="674100" />
+            <district name="华坪县" zipcode="674100" />
+            <district name="宁蒗彝族自治县" zipcode="674100" />
+            <district name="永胜县" zipcode="674100" />
+            <district name="玉龙纳西族自治县" zipcode="674100" />
+            <district name="其他" zipcode="674100" />
+        </city>
+        <city name="临沧市">
+            <district name="沧源佤族自治县" zipcode="677000" />
+            <district name="凤庆县" zipcode="677000" />
+            <district name="耿马傣族佤族自治县" zipcode="677000" />
+            <district name="临翔区" zipcode="677000" />
+            <district name="双江拉祜族佤族布朗族傣族自治县" zipcode="677000" />
+            <district name="永德县" zipcode="677000" />
+            <district name="云县" zipcode="677000" />
+            <district name="镇康县" zipcode="677000" />
+            <district name="其他" zipcode="677000" />
+        </city>
+        <city name="怒江傈僳族自治州">
+            <district name="福贡县" zipcode="673100" />
+            <district name="贡山独龙族怒族自治县" zipcode="673100" />
+            <district name="兰坪白族普米族自治县" zipcode="673100" />
+            <district name="泸水县" zipcode="673100" />
+            <district name="其他" zipcode="673100" />
+        </city>
+        <city name="普洱市">
+            <district name="江城哈尼族彝族自治县" zipcode="665000" />
+            <district name="景东彝族自治县" zipcode="665000" />
+            <district name="景谷傣族彝族自治县" zipcode="665000" />
+            <district name="澜沧拉祜族自治县" zipcode="665000" />
+            <district name="孟连傣族拉祜族佤族自治县" zipcode="665000" />
+            <district name="墨江哈尼族自治县" zipcode="665000" />
+            <district name="宁洱哈尼族彝族自治县" zipcode="665000" />
+            <district name="思茅区" zipcode="665000" />
+            <district name="西盟佤族自治县" zipcode="665000" />
+            <district name="镇沅彝族哈尼族拉祜族自治县" zipcode="665000" />
+            <district name="其他" zipcode="665000" />
+        </city>
+        <city name="曲靖市">
+            <district name="富源县" zipcode="655000" />
+            <district name="会泽县" zipcode="655000" />
+            <district name="陆良县" zipcode="655000" />
+            <district name="罗平县" zipcode="655000" />
+            <district name="马龙县" zipcode="655000" />
+            <district name="麒麟区" zipcode="655000" />
+            <district name="师宗县" zipcode="655000" />
+            <district name="宣威市" zipcode="655000" />
+            <district name="沾益县" zipcode="655000" />
+            <district name="其他" zipcode="655000" />
+        </city>
+        <city name="文山壮族苗族自治州">
+            <district name="富宁县" zipcode="663000" />
+            <district name="广南县" zipcode="663000" />
+            <district name="麻栗坡县" zipcode="663000" />
+            <district name="马关县" zipcode="663000" />
+            <district name="丘北县" zipcode="663000" />
+            <district name="文山县" zipcode="663000" />
+            <district name="西畴县" zipcode="663000" />
+            <district name="砚山县" zipcode="663000" />
+            <district name="其他" zipcode="663000" />
+        </city>
+        <city name="西双版纳傣族自治州">
+            <district name="景洪市" zipcode="666100" />
+            <district name="勐海县" zipcode="666100" />
+            <district name="勐腊县" zipcode="666100" />
+            <district name="其他" zipcode="666100" />
+        </city>
+        <city name="玉溪市">
+            <district name="澄江县" zipcode="653100" />
+            <district name="峨山彝族自治县" zipcode="653100" />
+            <district name="红塔区" zipcode="653100" />
+            <district name="华宁县" zipcode="653100" />
+            <district name="江川县" zipcode="653100" />
+            <district name="通海县" zipcode="653100" />
+            <district name="新平彝族傣族自治县" zipcode="653100" />
+            <district name="易门县" zipcode="653100" />
+            <district name="元江哈尼族彝族傣族自治县" zipcode="653100" />
+            <district name="其他" zipcode="653100" />
+        </city>
+        <city name="昭通市">
+            <district name="大关县" zipcode="657000" />
+            <district name="鲁甸县" zipcode="657000" />
+            <district name="巧家县" zipcode="657000" />
+            <district name="水富县" zipcode="657000" />
+            <district name="绥江县" zipcode="657000" />
+            <district name="威信县" zipcode="657000" />
+            <district name="盐津县" zipcode="657000" />
+            <district name="彝良县" zipcode="657000" />
+            <district name="永善县" zipcode="657000" />
+            <district name="昭阳区" zipcode="657000" />
+            <district name="镇雄县" zipcode="657000" />
+            <district name="其他" zipcode="657000" />
+        </city>
+    </province>
+    <province name="浙江省">
+        <city name="杭州市">
+            <district name="滨江区" zipcode="310000" />
+            <district name="淳安县" zipcode="310000" />
+            <district name="富阳市" zipcode="310000" />
+            <district name="拱墅区" zipcode="310000" />
+            <district name="建德市" zipcode="310000" />
+            <district name="江干区" zipcode="310000" />
+            <district name="临安市" zipcode="310000" />
+            <district name="上城区" zipcode="310000" />
+            <district name="桐庐县" zipcode="310000" />
+            <district name="西湖区" zipcode="310000" />
+            <district name="下城区" zipcode="310000" />
+            <district name="萧山区" zipcode="310000" />
+            <district name="余杭区" zipcode="310000" />
+            <district name="其他" zipcode="310000" />
+        </city>
+        <city name="湖州市">
+            <district name="安吉县" zipcode="313000" />
+            <district name="长兴县" zipcode="313000" />
+            <district name="德清县" zipcode="313000" />
+            <district name="南浔区" zipcode="313000" />
+            <district name="吴兴区" zipcode="313000" />
+            <district name="其他" zipcode="313000" />
+        </city>
+        <city name="嘉兴市">
+            <district name="海宁市" zipcode="314000" />
+            <district name="海盐县" zipcode="314000" />
+            <district name="嘉善县" zipcode="314000" />
+            <district name="南湖区" zipcode="314000" />
+            <district name="平湖市" zipcode="314000" />
+            <district name="桐乡市" zipcode="314000" />
+            <district name="秀洲区" zipcode="314000" />
+            <district name="其他" zipcode="314000" />
+        </city>
+        <city name="金华市">
+            <district name="东阳市" zipcode="321000" />
+            <district name="金东区" zipcode="321000" />
+            <district name="兰溪市" zipcode="321000" />
+            <district name="磐安县" zipcode="321000" />
+            <district name="浦江县" zipcode="321000" />
+            <district name="武义县" zipcode="321000" />
+            <district name="婺城区" zipcode="321000" />
+            <district name="义乌市" zipcode="321000" />
+            <district name="永康市" zipcode="321000" />
+            <district name="其他" zipcode="321000" />
+        </city>
+        <city name="丽水市">
+            <district name="缙云县" zipcode="323000" />
+            <district name="景宁畲族自治县" zipcode="323000" />
+            <district name="莲都区" zipcode="323000" />
+            <district name="龙泉市" zipcode="323000" />
+            <district name="青田县" zipcode="323000" />
+            <district name="庆元县" zipcode="323000" />
+            <district name="松阳县" zipcode="323000" />
+            <district name="遂昌县" zipcode="323000" />
+            <district name="云和县" zipcode="323000" />
+            <district name="其他" zipcode="323000" />
+        </city>
+        <city name="宁波市">
+            <district name="北仑区" zipcode="315000" />
+            <district name="慈溪市" zipcode="315000" />
+            <district name="奉化市" zipcode="315000" />
+            <district name="海曙区" zipcode="315000" />
+            <district name="江北区" zipcode="315000" />
+            <district name="江东区" zipcode="315000" />
+            <district name="宁海县" zipcode="315000" />
+            <district name="象山县" zipcode="315000" />
+            <district name="鄞州区" zipcode="315000" />
+            <district name="余姚市" zipcode="315000" />
+            <district name="镇海区" zipcode="315000" />
+            <district name="其他" zipcode="315000" />
+        </city>
+        <city name="衢州市">
+            <district name="常山县" zipcode="324000" />
+            <district name="江山市" zipcode="324000" />
+            <district name="开化县" zipcode="324000" />
+            <district name="柯城区" zipcode="324000" />
+            <district name="龙游县" zipcode="324000" />
+            <district name="衢江区" zipcode="324000" />
+            <district name="其他" zipcode="324000" />
+        </city>
+        <city name="绍兴市">
+            <district name="上虞市" zipcode="312000" />
+            <district name="绍兴县" zipcode="312000" />
+            <district name="嵊州市" zipcode="312000" />
+            <district name="新昌县" zipcode="312000" />
+            <district name="越城区" zipcode="312000" />
+            <district name="诸暨市" zipcode="312000" />
+            <district name="其他" zipcode="312000" />
+        </city>
+        <city name="台州市">
+            <district name="黄岩区" zipcode="318000" />
+            <district name="椒江区" zipcode="318000" />
+            <district name="临海市" zipcode="318000" />
+            <district name="路桥区" zipcode="318000" />
+            <district name="三门县" zipcode="318000" />
+            <district name="天台县" zipcode="318000" />
+            <district name="温岭市" zipcode="318000" />
+            <district name="仙居县" zipcode="318000" />
+            <district name="玉环县" zipcode="318000" />
+            <district name="其他" zipcode="318000" />
+        </city>
+        <city name="温州市">
+            <district name="苍南县" zipcode="325000" />
+            <district name="洞头县" zipcode="325000" />
+            <district name="乐清市" zipcode="325000" />
+            <district name="龙湾区" zipcode="325000" />
+            <district name="鹿城区" zipcode="325000" />
+            <district name="瓯海区" zipcode="325000" />
+            <district name="平阳县" zipcode="325000" />
+            <district name="瑞安市" zipcode="325000" />
+            <district name="泰顺县" zipcode="325000" />
+            <district name="文成县" zipcode="325000" />
+            <district name="永嘉县" zipcode="325000" />
+            <district name="其他" zipcode="325000" />
+        </city>
+        <city name="舟山市">
+            <district name="岱山县" zipcode="316000" />
+            <district name="定海区" zipcode="316000" />
+            <district name="普陀区" zipcode="316000" />
+            <district name="嵊泗县" zipcode="316000" />
+            <district name="其他" zipcode="316000" />
+        </city>
+    </province>
+    <province name="重庆市">
+        <city name="重庆市">
+            <district name="巴南区" zipcode="404100" />
+            <district name="北碚区" zipcode="404100" />
+            <district name="璧山县" zipcode="404100" />
+            <district name="长寿区" zipcode="404100" />
+            <district name="城口县" zipcode="404100" />
+            <district name="大渡口区" zipcode="404100" />
+            <district name="大足县" zipcode="404100" />
+            <district name="垫江县" zipcode="404100" />
+            <district name="丰都县" zipcode="404100" />
+            <district name="奉节县" zipcode="404100" />
+            <district name="涪陵区" zipcode="404100" />
+            <district name="合川区" zipcode="404100" />
+            <district name="江北区" zipcode="404100" />
+            <district name="江津区" zipcode="404100" />
+            <district name="九龙坡区" zipcode="404100" />
+            <district name="开县" zipcode="404100" />
+            <district name="梁平县" zipcode="404100" />
+            <district name="南岸区" zipcode="404100" />
+            <district name="南川区" zipcode="404100" />
+            <district name="彭水苗族土家族自治县" zipcode="404100" />
+            <district name="綦江县" zipcode="404100" />
+            <district name="黔江区" zipcode="404100" />
+            <district name="荣昌县" zipcode="404100" />
+            <district name="沙坪坝区" zipcode="404100" />
+            <district name="石柱土家族自治县" zipcode="404100" />
+            <district name="双桥区" zipcode="404100" />
+            <district name="铜梁县" zipcode="404100" />
+            <district name="潼南县" zipcode="404100" />
+            <district name="万盛区" zipcode="404100" />
+            <district name="万州区" zipcode="404100" />
+            <district name="巫山县" zipcode="404100" />
+            <district name="巫溪县" zipcode="404100" />
+            <district name="武隆县" zipcode="404100" />
+            <district name="秀山土家族苗族自治县" zipcode="404100" />
+            <district name="永川区" zipcode="404100" />
+            <district name="酉阳土家族苗族自治县" zipcode="404100" />
+            <district name="渝北区" zipcode="404100" />
+            <district name="渝中区" zipcode="404100" />
+            <district name="云阳县" zipcode="404100" />
+            <district name="忠县" zipcode="404100" />
+            <district name="其他" zipcode="404100" />
+        </city>
+    </province>
+    <province name="香港">
+        <city name="香港特别行政区">
+            <district name="香港市区内" zipcode="999077" />
+            <district name="其他" zipcode="999077" />
+        </city>
+    </province>
+    <province name="澳门">
+        <city name="澳门特别行政区">
+            <district name="澳门市区内" zipcode="999078" />
+            <district name="其他" zipcode="999078" />
+        </city>
+    </province>
+    <province name="台湾">
+        <city name="台北市">
+            <district name="台北市区" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="髙雄市">
+            <district name="髙雄市区" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="基隆市">
+            <district name="基隆市区" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="台中市">
+            <district name="台中市区" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="台南市">
+            <district name="台南市区" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="新竹市">
+            <district name="新竹市区" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="嘉义市">
+            <district name="嘉义市区" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="新北市">
+            <district name="新北市区" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="宜兰县">
+            <district name="宜兰县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="桃园县">
+            <district name="桃园县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="新竹县">
+            <district name="新竹县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="苗栗县">
+            <district name="苗栗县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="彰化县">
+            <district name="彰化县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="南投县">
+            <district name="南投县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="云林县">
+            <district name="云林县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="嘉义县">
+            <district name="嘉义县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="屏东县">
+            <district name="屏东县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="台东县">
+            <district name="台东县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="花莲县">
+            <district name="花莲县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+        <city name="澎湖县">
+            <district name="澎湖县" zipcode="000000" />
+            <district name="其他" zipcode="000000" />
+        </city>
+
+    </province>
+</root>

+ 8 - 0
o2android/app/assets/server.json

@@ -0,0 +1,8 @@
+{
+  "id" : "o2CenterServer",
+  "name" : "dev",
+  "centerHost" : "dev.o2server.io",
+  "centerContext" : "/x_program_center",
+  "centerPort" : 20030,
+  "httpProtocol" : "http"
+}

+ 319 - 0
o2android/app/build.gradle

@@ -0,0 +1,319 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+apply plugin: 'kotlin-kapt'
+apply plugin: 'realm-android'
+
+ext {
+    //定义变量
+    signingConfigKeyAlias = ""
+    signingConfigKeyPassword = ""
+    signingConfigStoreFilePath = ""
+    signingConfigStorePassword = ""
+    jpushAppKeyDebug = ""
+    pgyAppIdDebug = ""
+    baiduAppIdDebug = ""
+    baiduSecretDebug = ""
+    baiduAppKeyDebug = ""
+    jpushAppKeyRelease = ""
+    pgyAppIdRelease = ""
+    baiduAppIdRelease = ""
+    baiduSecretRelease = ""
+    baiduAppKeyRelease = ""
+    jpushIMPassword = ""
+    buglyAppId = ""
+}
+
+
+def loadProperties() {
+    // load properties
+    Properties properties = new Properties()
+    properties.load(project.rootProject.file('local.properties').newDataInputStream())
+
+    project.signingConfigKeyAlias = properties.getProperty("signingConfig.keyAlias")
+    project.signingConfigKeyPassword = properties.getProperty("signingConfig.keyPassword")
+    project.signingConfigStoreFilePath = properties.getProperty("signingConfig.storeFilePath")
+    project.signingConfigStorePassword = properties.getProperty("signingConfig.storePassword")
+    //debug key
+    //极光推送
+    project.jpushAppKeyDebug = properties.getProperty("JPUSH_APPKEY_DEBUG")
+    //蒲公英
+    project.pgyAppIdDebug = properties.getProperty("PGY_APP_ID_DEBUG")
+    //百度
+    project.baiduAppIdDebug = properties.getProperty("BAIDU_APPID_DEBUG")
+    project.baiduSecretDebug = properties.getProperty("BAIDU_SECRET_DEBUG")
+    project.baiduAppKeyDebug = properties.getProperty("BAIDU_APPKEY_DEBUG")
+    //release key
+    project.jpushAppKeyRelease = properties.getProperty("JPUSH_APPKEY_RELEASE")
+    project.pgyAppIdRelease = properties.getProperty("PGY_APP_ID_RELEASE")
+    project.baiduAppIdRelease = properties.getProperty("BAIDU_APPID_RELEASE")
+    project.baiduSecretRelease = properties.getProperty("BAIDU_SECRET_RELEASE")
+    project.baiduAppKeyRelease = properties.getProperty("BAIDU_APPKEY_RELEASE")
+
+    project.jpushIMPassword = properties.getProperty("JM_IM_USER_PASSWORD")
+
+    //bugly
+    project.buglyAppId = properties.getProperty("BUGLY_APPID")
+
+
+}
+
+
+loadProperties()
+
+task printVersionName {
+    def v = project.property("o2.versionName").toString()
+    println( "${v}" )
+}
+
+
+android {
+    compileSdkVersion 26
+    buildToolsVersion "27.0.3"
+    sourceSets {
+        main {
+            jniLibs.srcDir 'libs'
+            assets.srcDirs = ['assets']
+            res.srcDirs = ['src/main/res', 'src/main/res/raw']
+        }
+    }
+    signingConfigs {
+        release {
+            v1SigningEnabled true
+            v2SigningEnabled true
+            keyAlias project.signingConfigKeyAlias
+            keyPassword project.signingConfigKeyPassword
+            storeFile file(project.signingConfigStoreFilePath)
+            storePassword project.signingConfigStorePassword
+        }
+        debug {
+            v1SigningEnabled true
+            v2SigningEnabled true
+            keyAlias 'androiddebugkey'
+            storeFile file('debug.keystore')
+            keyPassword 'android'
+        }
+    }
+
+    defaultConfig {
+        applicationId "net.zoneland.x.bpm.mobile.v1.zoneXBPM"
+        minSdkVersion 19
+        targetSdkVersion 26
+        versionCode project.property("o2.versionCode").toInteger()
+        versionName project.property("o2.versionName").toString()
+        multiDexEnabled true
+        ndk {
+            //选择要添加的对应cpu类型的.so库。
+            abiFilters 'armeabi', 'armeabi-v7a' //, 'arm64-v8a' //, 'x86', 'x86_64'
+            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
+        }
+        multiDexKeepProguard file('multidex_keep_file.pro')
+        vectorDrawables.useSupportLibrary = true
+
+    }
+
+    buildTypes {
+        debug {
+            signingConfig signingConfigs.debug
+            buildConfigField "Boolean", "InnerServer", "false"
+            buildConfigField "Boolean", "LOG_ENABLE", "true"
+            buildConfigField "Boolean", "LOG_FILE", "true"
+            manifestPlaceholders = [JPUSH_PKGNAME: "net.zoneland.x.bpm.mobile.v1.zoneXBPM",
+                                    JPUSH_APPKEY : project.jpushAppKeyDebug,
+                                    JM_IM_USER_PASSWORD : project.jpushIMPassword,
+                                    PGY_APP_ID   : project.pgyAppIdDebug,
+                                    BAIDU_APPID  : project.baiduAppIdDebug,
+                                    BAIDU_SECRET : project.baiduSecretDebug,
+                                    BAIDU_APPKEY : project.baiduAppKeyDebug,
+                                    BUGLY_APPID  : project.buglyAppId]
+        }
+        release {
+            signingConfig signingConfigs.release
+            buildConfigField "Boolean", "InnerServer", "false"
+            buildConfigField "Boolean", "LOG_ENABLE", "false"
+            buildConfigField "Boolean", "LOG_FILE", "true"
+            manifestPlaceholders = [JPUSH_PKGNAME: "net.zoneland.x.bpm.mobile.v1.zoneXBPM",
+                                    JPUSH_APPKEY : project.jpushAppKeyRelease,
+                                    JM_IM_USER_PASSWORD : project.jpushIMPassword,
+                                    PGY_APP_ID   : project.pgyAppIdRelease,
+                                    BAIDU_APPID  : project.baiduAppIdRelease,
+                                    BAIDU_SECRET : project.baiduSecretRelease,
+                                    BAIDU_APPKEY : project.baiduAppKeyRelease,
+                                    BUGLY_APPID  : project.buglyAppId]
+            zipAlignEnabled true     //Zipalign优化
+            minifyEnabled true     //混淆
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+
+            //apk包重命名
+            applicationVariants.all { variant ->
+                variant.outputs.all {
+                    outputFileName = "${variant.productFlavors[0].name}-${variant.versionName}.apk"
+                }
+            }
+
+        }
+    }
+    dataBinding {
+        enabled true
+    }
+    android {
+        lintOptions {
+            abortOnError false
+        }
+    }
+
+    lintOptions {
+        checkReleaseBuilds false
+        abortOnError false
+    }
+    //All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
+    flavorDimensions "type"
+    productFlavors {
+        O2PLATFORM {
+            manifestPlaceholders = [JPUSH_CHANNEL: "pgy"]
+        }
+        huawei {
+            manifestPlaceholders = [JPUSH_CHANNEL: "huawei"]
+        }
+        xiaomi {
+            manifestPlaceholders = [JPUSH_CHANNEL: "xiaomi"]
+        }
+    }
+
+
+}
+
+
+
+buildscript {
+    repositories {
+        mavenCentral()
+    }
+    dependencies {
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
+
+    }
+}
+
+repositories {
+    flatDir {
+        dirs 'libs'
+    }
+}
+
+dependencies {
+
+    //    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    implementation files('libs/o2_auth_sdk.jar')
+    implementation files('libs/BaiduLBS_Android.jar')
+    implementation files('libs/bdasr_V3_20180320_9066860.jar')
+    implementation files('libs/com.baidu.tts_2.3.1.20170808_e39ea89.jar')
+    implementation files('libs/pgyer_sdk_2.2.2.jar')
+    implementation files('libs/zxing.jar')
+    implementation files('libs/picasso-2.5.2.jar')
+    implementation files('libs/pinyin4j-2.5.0.jar')
+    implementation files('libs/universal-image-loader-1.9.5.jar')
+    implementation files('libs/tbs_sdk_thirdapp_v3.2.0.1104_43200.jar')
+    implementation(name: 'material-calendarview-fancy-1.1', ext: 'aar')
+    implementation(name: 'MGLicenseManagerSDK-0.3.1', ext: 'aar')
+    implementation(name: 'MGFaceppSDK-0.5.2', ext: 'aar')
+
+    //kotlin
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+    implementation "org.jetbrains.anko:anko-common:$anko_version"
+
+    //support
+    implementation('com.android.support:support-v4:26.1.0') {
+        force = true
+    }
+    implementation('com.android.support:recyclerview-v7:26.1.0') {
+        exclude module: 'support-v4'
+    }
+    implementation 'com.android.support:appcompat-v7:26.1.0'
+    implementation 'com.android.support:cardview-v7:26.1.0'
+    implementation 'com.android.support:design:26.1.0'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    implementation 'com.android.support:multidex:1.0.3'
+    implementation 'com.github.PhilJay:MPAndroidChart:v2.2.4'
+    implementation('com.github.bumptech.glide:glide:3.7.0') {
+        force = true
+    }
+    implementation 'com.afollestad.material-dialogs:core:0.8.5.9'
+    implementation 'net.muliba.fancyfilepickerlibrary:fancyfilepickerlibrary:3.0.2'
+    implementation 'net.muliba.changeskin:changeskin:1.2.2'
+    implementation 'io.o2oa:signatureview:1.0.0'
+    implementation 'net.zoneland.o2.calendarview:library:1.1.2'
+    implementation 'com.readystatesoftware.systembartint:systembartint:1.0.3'
+    implementation 'com.facebook.shimmer:shimmer:0.1.0@aar'
+    implementation 'com.borax12.materialdaterangepicker:library:1.9'
+    implementation 'com.yanzhenjie:recyclerview-swipe:1.1.4'
+
+    //http
+    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
+    implementation 'com.squareup.retrofit2:converter-gson:2.2.0'
+    implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
+    implementation 'com.squareup.okhttp3:okhttp:3.11.0'
+    implementation 'io.reactivex:rxjava:1.1.6'
+    implementation 'io.reactivex:rxandroid:1.2.1'
+
+    //bugly
+    implementation 'com.tencent.bugly:crashreport:2.6.6'
+
+    //极光推送
+    implementation 'cn.jiguang.sdk:jpush:3.1.2'
+    implementation 'cn.jiguang.sdk:jmessage:2.5.0'
+
+    // 此处以JMessage 2.5.0 版本为例。
+    implementation 'cn.jiguang.sdk:jcore:1.1.9'
+
+    // 此处以JCore 1.1.9 版本为例。
+
+    //im
+    implementation 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
+    implementation 'com.jakewharton:butterknife:8.4.0'
+    kapt 'com.jakewharton:butterknife-compiler:8.4.0'
+    implementation 'com.github.w446108264:AndroidEmoji:1.0.0'
+    implementation 'com.github.chrisbanes.photoview:library:1.2.4'
+    implementation 'com.facebook.fresco:fresco:0.8.1'
+    implementation 'org.greenrobot:eventbus:3.0.0'
+    implementation 'com.contrarywind:Android-PickerView:3.2.4'
+
+    //滚动选择器
+    implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
+
+    //google architecture component
+    def lifecycle_version = "1.1.1"
+
+    // ViewModel and LiveData
+    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
+
+    // alternatively - just ViewModel
+    implementation "android.arch.lifecycle:viewmodel:$lifecycle_version"
+
+    // use -ktx for Kotlin
+
+    // alternatively - just LiveData
+    implementation "android.arch.lifecycle:livedata:$lifecycle_version"
+
+    // alternatively - Lifecycles only (no ViewModel or LiveData).
+
+    //     Support library depends on this lightweight import
+    implementation "android.arch.lifecycle:runtime:$lifecycle_version"
+    annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
+
+    //noinspection GradleDependency
+    kapt "com.android.databinding:compiler:$gradle_version"
+
+    //test
+    testImplementation 'junit:junit:4.12'
+
+}
+
+
+tasks.whenTaskAdded { task ->
+    if (task.name == "lint") {
+        task.enabled = false
+    }
+}
+

BIN
o2android/app/debug.keystore


BIN
o2android/app/libs/BaiduLBS_Android.jar


BIN
o2android/app/libs/MGFaceppSDK-0.5.2.aar


BIN
o2android/app/libs/MGLicenseManagerSDK-0.3.1.aar


BIN
o2android/app/libs/android-logging-log4j-1.0.3.jar


BIN
o2android/app/libs/armeabi-v7a/libBDSpeechDecoder_V1.so


BIN
o2android/app/libs/armeabi-v7a/libBaiduMapSDK_base_v4_3_0.so


BIN
o2android/app/libs/armeabi-v7a/libBaiduMapSDK_map_v4_3_0.so


BIN
o2android/app/libs/armeabi-v7a/libBaiduSpeechSDK.so


BIN
o2android/app/libs/armeabi-v7a/libbdEASRAndroid.so


BIN
o2android/app/libs/armeabi-v7a/libbdSpilWakeup.so


BIN
o2android/app/libs/armeabi-v7a/libbd_easr_s1_merge_normal_20151216.dat.so


BIN
o2android/app/libs/armeabi-v7a/libbd_etts.so


BIN
o2android/app/libs/armeabi-v7a/libbdtts.so


BIN
o2android/app/libs/armeabi-v7a/libgnustl_shared.so


BIN
o2android/app/libs/armeabi-v7a/libjcore119.so


BIN
o2android/app/libs/armeabi-v7a/liblbs.so


BIN
o2android/app/libs/armeabi-v7a/liblocSDK7a.so


BIN
o2android/app/libs/armeabi-v7a/libvad.dnn.so


BIN
o2android/app/libs/armeabi/libBDSpeechDecoder_V1.so


BIN
o2android/app/libs/armeabi/libBaiduMapSDK_base_v4_3_0.so


BIN
o2android/app/libs/armeabi/libBaiduMapSDK_map_v4_3_0.so


BIN
o2android/app/libs/armeabi/libBaiduSpeechSDK.so


BIN
o2android/app/libs/armeabi/libbdEASRAndroid.so


BIN
o2android/app/libs/armeabi/libbdSpilWakeup.so


BIN
o2android/app/libs/armeabi/libbd_easr_s1_merge_normal_20151216.dat.so


BIN
o2android/app/libs/armeabi/libbd_etts.so


BIN
o2android/app/libs/armeabi/libbdtts.so


BIN
o2android/app/libs/armeabi/libgnustl_shared.so


BIN
o2android/app/libs/armeabi/libjcore119.so


BIN
o2android/app/libs/armeabi/liblbs.so


BIN
o2android/app/libs/armeabi/liblocSDK7a.so


BIN
o2android/app/libs/armeabi/libvad.dnn.so


BIN
o2android/app/libs/bdasr_V3_20180320_9066860.jar


BIN
o2android/app/libs/com.baidu.tts_2.3.1.20170808_e39ea89.jar


BIN
o2android/app/libs/gson-2.2.1.jar


BIN
o2android/app/libs/log4j-1.2.17.jar


BIN
o2android/app/libs/material-calendarview-fancy-1.1.aar


BIN
o2android/app/libs/o2_auth_sdk.jar


BIN
o2android/app/libs/pgyer_sdk_2.2.2.jar


BIN
o2android/app/libs/picasso-2.5.2.jar


BIN
o2android/app/libs/pinyin4j-2.5.0.jar


BIN
o2android/app/libs/tbs_sdk_thirdapp_v3.2.0.1104_43200.jar


BIN
o2android/app/libs/universal-image-loader-1.9.5.jar


BIN
o2android/app/libs/zxing.jar


+ 1 - 0
o2android/app/multidex_keep_file.pro

@@ -0,0 +1 @@
+-keep public class com.tencent.bugly.**{*;}

+ 560 - 0
o2android/app/proguard-rules.pro

@@ -0,0 +1,560 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in E:\workApp\Android\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+########################      通用配置    ###################################
+
+#指定代码的压缩级别
+-optimizationpasses 5
+
+#包明不混合大小写
+-dontusemixedcaseclassnames
+
+#不去忽略非公共的库类
+-dontskipnonpubliclibraryclasses
+
+ #优化  不优化输入的类文件
+-dontoptimize
+
+ #预校验
+-dontpreverify
+
+ #混淆时是否记录日志
+-verbose
+
+ # 混淆时所采用的算法
+-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
+
+
+
+# 保持哪些类不被混淆
+-keep public class * extends android.app.Fragment
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+-keep public class com.android.vending.licensing.ILicensingService
+#如果有引用v4包可以添加下面这行
+-keep public class * extends android.support.v4.app.Fragment
+
+#忽略警告
+-ignorewarning
+
+#如果引用了v4或者v7包
+-dontwarn android.support.**
+
+
+####混淆保护自己项目的部分代码以及引用的第三方jar包library-end####
+
+#保持 native 方法不被混淆
+-keepclasseswithmembernames class * {
+    native <methods>;
+}
+
+#保持自定义控件类不被混淆
+-keepclasseswithmembers class * {
+    public <init>(android.content.Context, android.util.AttributeSet);
+}
+
+#保持自定义控件类不被混淆
+-keepclassmembers class * extends android.app.Activity {
+   public void *(android.view.View);
+}
+
+-keep public class * extends android.view.View {
+    public <init>(android.content.Context);
+    public <init>(android.content.Context, android.util.AttributeSet);
+    public <init>(android.content.Context, android.util.AttributeSet, int);
+    public void set*(...);
+}
+
+#保持 Parcelable 不被混淆
+-keep class * implements android.os.Parcelable {
+  public static final android.os.Parcelable$Creator *;
+}
+
+#保持 Serializable 不被混淆
+-keepnames class * implements java.io.Serializable
+
+#保持 Serializable 不被混淆并且enum 类也不被混淆
+-keepclassmembers class * implements java.io.Serializable {
+    static final long serialVersionUID;
+    private static final java.io.ObjectStreamField[] serialPersistentFields;
+    !static !transient <fields>;
+    !private <fields>;
+    !private <methods>;
+    private void writeObject(java.io.ObjectOutputStream);
+    private void readObject(java.io.ObjectInputStream);
+    java.lang.Object writeReplace();
+    java.lang.Object readResolve();
+}
+
+#保持枚举 enum 类不被混淆
+-keepclassmembers enum * {
+  public static **[] values();
+  public static ** valueOf(java.lang.String);
+}
+
+-keepclassmembers class * {
+    public void *ButtonClicked(android.view.View);
+}
+
+#不混淆资源类
+-keepclassmembers class **.R$* {
+    public static <fields>;
+}
+
+#避免混淆泛型 如果混淆报错建议关掉
+#-keepattributes Signature
+
+
+
+#######################     常用第三方模块的混淆选项         ###################################
+#gson
+#如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
+#保护注解
+-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
+# Gson specific classes
+-keep class sun.misc.Unsafe { *; }
+# Application classes that will be serialized/deserialized over Gson
+-keep class com.google.gson.** { *; }
+-keep class com.google.gson.stream.** { *; }
+
+
+#butterknife
+-keep class butterknife.** { *; }
+-dontwarn butterknife.internal.**
+-keep class **$$ViewBinder { *; }
+
+-keepclasseswithmembernames class * {
+    @butterknife.* <fields>;
+}
+
+-keepclasseswithmembernames class * {
+    @butterknife.* <methods>;
+}
+
+
+#Glide
+-keep public class * implements com.bumptech.glide.module.GlideModule
+-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
+  **[] $VALUES;
+  public *;
+}
+-keep class  com.bumptech.glide.** { *; }
+#-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
+
+
+# 如果使用了Gson之类的工具要使被它解析的JavaBean类即实体类不被混淆。
+-keep class net.zoneland.x.bpm.mobile.v1.zoneXBPM.model.** { *; }
+
+#rx
+-keep class rx.** { *; }
+#retrofit
+-keep class retrofit2.** { *; }
+#guava
+-keep class com.google.common.base.** { *; }
+#chart
+-keep class com.github.PhilJay.** { *; }
+#materialdialogs
+-keep class com.afollestad.materialdialogs.** { *; }
+#日历控件 github > material-calendarview
+-keep class com.prolificinteractive.** { *; }
+#pgy
+-dontwarn com.pgyersdk.**
+-keep class com.pgyersdk.** { *; }
+#umeng
+-keep class com.umeng.analytics.** { *; }
+-dontwarn com.umeng.analytics.**
+#log4j
+-keep class org.apache.log4j.** { *; }
+-dontwarn org.apache.log4j.**
+#baidu
+-keep class com.baidu.** {*;}
+-keep class vi.com.** {*;}
+-dontwarn com.baidu.**
+#baidu yuyin
+-keep class com.baidu.speech.**{*;}
+-keep class com.baidu.tts.**{*;}
+-keep class com.baidu.speechsynthesizer.**{*;}
+
+##umeng push
+-dontwarn com.taobao.**
+-dontwarn anet.channel.**
+-dontwarn anetwork.channel.**
+-dontwarn org.android.**
+-dontwarn org.apache.thrift.**
+-dontwarn com.xiaomi.**
+-dontwarn com.huawei.**
+
+-keepattributes *Annotation*
+
+-keep class com.taobao.** {*;}
+-keep class org.android.** {*;}
+-keep class anet.channel.** {*;}
+-keep class com.umeng.** {*;}
+-keep class com.xiaomi.** {*;}
+-keep class com.huawei.** {*;}
+-keep class org.apache.thrift.** {*;}
+
+-keep class com.alibaba.sdk.android.**{*;}
+-keep class com.ut.**{*;}
+-keep class com.ta.**{*;}
+
+-keep public class **.R$*{
+   public static final int *;
+}
+
+#bugly
+-dontwarn com.tencent.bugly.**
+-keep public class com.tencent.bugly.**{*;}
+
+
+#jiguang
+-dontoptimize
+-dontpreverify
+-keepattributes  EnclosingMethod,Signature
+-dontwarn cn.jpush.**
+-keep class cn.jpush.** { *; }
+
+-dontwarn cn.jiguang.**
+-keep class cn.jiguang.** { *; }
+
+ -keepclassmembers class ** {
+     public void onEvent*(**);
+ }
+
+-keep class sj.qqkeyboard.** { *; }
+-keep class com.sj.emoji.** { *; }
+-keep class com.testemticon.** { *; }
+-keep class jiguang.chat.** { *; }
+
+
+#========================gson================================
+-dontwarn com.google.**
+-keep class com.google.gson.** {*;}
+-keep class com.google.code.gson.** {*;}
+
+#========================protobuf================================
+-keep class com.google.protobuf.** {*;}
+
+
+
+#-optimizationpasses 7
+#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
+-dontoptimize
+-dontusemixedcaseclassnames
+-verbose
+-dontskipnonpubliclibraryclasses
+-dontskipnonpubliclibraryclassmembers
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+#-overloadaggressively
+
+# ------------------ Keep LineNumbers and properties ---------------- #
+-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
+# --------------------------------------------------------------------------
+
+# Addidional for x5.sdk classes for apps
+
+-keep class com.tencent.smtt.export.external.**{
+    *;
+}
+
+-keep class com.tencent.tbs.video.interfaces.IUserStateChangedListener {
+	*;
+}
+
+-keep class com.tencent.smtt.sdk.CacheManager {
+	public *;
+}
+
+-keep class com.tencent.smtt.sdk.CookieManager {
+	public *;
+}
+
+-keep class com.tencent.smtt.sdk.WebHistoryItem {
+	public *;
+}
+
+-keep class com.tencent.smtt.sdk.WebViewDatabase {
+	public *;
+}
+
+-keep class com.tencent.smtt.sdk.WebBackForwardList {
+	public *;
+}
+
+-keep public class com.tencent.smtt.sdk.WebView {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.WebView$HitTestResult {
+	public static final <fields>;
+	public java.lang.String getExtra();
+	public int getType();
+}
+
+-keep public class com.tencent.smtt.sdk.WebView$WebViewTransport {
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.WebView$PictureListener {
+	public <fields>;
+	public <methods>;
+}
+
+
+-keepattributes InnerClasses
+
+-keep public enum com.tencent.smtt.sdk.WebSettings$** {
+    *;
+}
+
+-keep public enum com.tencent.smtt.sdk.QbSdk$** {
+    *;
+}
+
+-keep public class com.tencent.smtt.sdk.WebSettings {
+    public *;
+}
+
+
+-keepattributes Signature
+-keep public class com.tencent.smtt.sdk.ValueCallback {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.WebViewClient {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.DownloadListener {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.WebChromeClient {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.WebChromeClient$FileChooserParams {
+	public <fields>;
+	public <methods>;
+}
+
+-keep class com.tencent.smtt.sdk.SystemWebChromeClient{
+	public *;
+}
+# 1. extension interfaces should be apparent
+-keep public class com.tencent.smtt.export.external.extension.interfaces.* {
+	public protected *;
+}
+
+# 2. interfaces should be apparent
+-keep public class com.tencent.smtt.export.external.interfaces.* {
+	public protected *;
+}
+
+-keep public class com.tencent.smtt.sdk.WebViewCallbackClient {
+	public protected *;
+}
+
+-keep public class com.tencent.smtt.sdk.WebStorage$QuotaUpdater {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.WebIconDatabase {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.WebStorage {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.DownloadListener {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.QbSdk {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.QbSdk$PreInitCallback {
+	public <fields>;
+	public <methods>;
+}
+-keep public class com.tencent.smtt.sdk.CookieSyncManager {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.Tbs* {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.utils.LogFileUtils {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.utils.TbsLog {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.utils.TbsLogClient {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.CookieSyncManager {
+	public <fields>;
+	public <methods>;
+}
+
+# Added for game demos
+-keep public class com.tencent.smtt.sdk.TBSGamePlayer {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.TBSGamePlayerClient* {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.TBSGamePlayerClientExtension {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.TBSGamePlayerService* {
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class com.tencent.smtt.utils.Apn {
+	public <fields>;
+	public <methods>;
+}
+-keep class com.tencent.smtt.** {
+	*;
+}
+# end
+
+
+-keep public class com.tencent.smtt.export.external.extension.proxy.ProxyWebViewClientExtension {
+	public <fields>;
+	public <methods>;
+}
+
+-keep class MTT.ThirdAppInfoNew {
+	*;
+}
+
+-keep class com.tencent.mtt.MttTraceEvent {
+	*;
+}
+
+# Game related
+-keep public class com.tencent.smtt.gamesdk.* {
+	public protected *;
+}
+
+-keep public class com.tencent.smtt.sdk.TBSGameBooter {
+        public <fields>;
+        public <methods>;
+}
+
+-keep public class com.tencent.smtt.sdk.TBSGameBaseActivity {
+	public protected *;
+}
+
+-keep public class com.tencent.smtt.sdk.TBSGameBaseActivityProxy {
+	public protected *;
+}
+
+-keep public class com.tencent.smtt.gamesdk.internal.TBSGameServiceClient {
+	public *;
+}
+#---------------------------------------------------------------------------
+
+
+#------------------  下方是android平台自带的排除项,这里不要动         ----------------
+
+-keep public class * extends android.app.Activity{
+	public <fields>;
+	public <methods>;
+}
+
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+
+-keepclassmembers enum * {
+    public static **[] values();
+    public static ** valueOf(java.lang.String);
+}
+
+-keepclasseswithmembers class * {
+	public <init>(android.content.Context, android.util.AttributeSet);
+}
+
+-keepclasseswithmembers class * {
+	public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+
+-keepattributes *Annotation*
+
+-keepclasseswithmembernames class *{
+	native <methods>;
+}
+
+-keep class * implements android.os.Parcelable {
+  public static final android.os.Parcelable$Creator *;
+}
+
+#------------------  下方是共性的排除项目         ----------------
+# 方法名中含有“JNI”字符的,认定是Java Native Interface方法,自动排除
+# 方法名中含有“JRI”字符的,认定是Java Reflection Interface方法,自动排除
+
+-keepclasseswithmembers class * {
+    ... *JNI*(...);
+}
+
+-keepclasseswithmembernames class * {
+	... *JRI*(...);
+}
+
+-keep class **JNI* {*;}
+

+ 26 - 0
o2android/app/src/androidTest/java/net/zoneland/x/bpm/mobile/v1/zoneXBPM/ApplicationTest.java

@@ -0,0 +1,26 @@
+package net.zoneland.x.bpm.mobile.v1.zoneXBPM;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.StringUtil;
+
+/**
+ * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
+ */
+public class ApplicationTest extends ApplicationTestCase<Application> {
+    public ApplicationTest() {
+        super(Application.class);
+    }
+
+    public void testClassUtil() {
+
+        String phone = "853090000";
+        if (StringUtil.isPhoneWithHKandMACAO(phone)) {
+            System.out.print(".............");
+
+        }else  {
+            System.out.print("lllllllllllll");
+        }
+    }
+}

+ 507 - 0
o2android/app/src/main/AndroidManifest.xml

@@ -0,0 +1,507 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="net.zoneland.x.bpm.mobile.v1.zoneXBPM">
+
+    <!-- baidu需要 -->
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
+    <uses-permission android:name="android.permission.GET_TASKS" />
+    <!-- 获取网络状态 -->
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+    <!-- 网络通信 -->
+    <uses-permission android:name="android.permission.INTERNET" />
+    <!-- 获取设备信息 -->
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <!-- 读写sdcard,storage等等 -->
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <!-- 允许程序录制音频 -->
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+    <!-- 拨打电话 -->
+    <uses-permission android:name="android.permission.CALL_PHONE" />
+    <!-- 拍照 -->
+    <uses-permission android:name="android.permission.CAMERA" />
+    <!-- 允许监听启动完成事件 -->
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
+    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
+    <!-- 允许访问震动器 -->
+    <uses-permission android:name="android.permission.VIBRATE" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+    <!-- 选举使用,当应用有删除或者更新时需要重新选举,复用推送通道 -->
+    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
+    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
+    <uses-permission android:name="android.permission.RESTART_PACKAGES" />
+    <!-- 允许task重排序 -->
+    <uses-permission android:name="android.permission.REORDER_TASKS" />
+    <!-- 蓝牙 -->
+    <uses-permission android:name="android.permission.BLUETOOTH" />
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+    <!-- gps -->
+    <uses-feature android:name="android.hardware.location.gps" />
+    <!-- android 8.0 安装未知来源apk的权限问题 -->
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
+
+    <!-- 获取logcat日志 -->
+    <application
+        android:name=".O2App"
+        android:allowBackup="true"
+        android:hardwareAccelerated="true"
+        android:icon="@mipmap/logo"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/logo_round"
+        android:theme="@style/XBPMTheme.NoActionBar">
+        <activity
+            android:name=".app.o2.launch.LaunchActivity"
+            android:label="@string/app_name"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMLauncherTheme">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".app.o2.bind.BindPhoneActivity"
+            android:label="@string/app_name"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMClearActivityTheme" />
+        <activity
+            android:name=".app.o2.login.LoginActivity"
+            android:label="@string/app_name"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMClearActivityTheme"
+            android:windowSoftInputMode="adjustUnspecified|stateHidden" />
+        <activity
+            android:name=".app.o2.main.MainActivity"
+            android:label="@string/app_name"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMClearActivityTheme" />
+        <activity
+            android:name=".app.o2.group.GroupActivity"
+            android:label="@string/title_activity_group"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.person.PersonActivity"
+            android:label="@string/title_activity_person_info"
+            android:screenOrientation="portrait">
+            <intent-filter>
+                <action android:name="o2_person" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".app.o2.organization.NewOrganizationActivity"
+            android:label="@string/title_activity_contact"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.my.MyInfoActivity"
+            android:label="@string/title_activity_my_info"
+            android:screenOrientation="portrait">
+            <intent-filter>
+                <action android:name="o2_my_info" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".app.o2.my.ClipAvatarActivity"
+            android:label="@string/title_activity_clip_avatar"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.security.AccountSecurityActivity"
+            android:label="@string/title_activity_account_security"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.notice.NoticeSettingActivity"
+            android:label="@string/title_activity_notice_setting"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.notice.NoticeSettingHelpActivity"
+            android:label="@string/title_activity_notice_setting"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.about.AboutActivity"
+            android:label="@string/app_about"
+            android:screenOrientation="portrait" />
+        <!-- 扫描二维码 -->
+        <activity
+            android:name=".utils.zxing.activity.CaptureActivity"
+            android:label="@string/str_scan_title"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.scanlogin.ScanLoginActivity"
+            android:label="@string/scan_login_confirm_title"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.process.StartProcessActivity"
+            android:label="@string/title_activity_start_process"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.webview.TaskWebViewActivity"
+            android:label="@string/title_activity_work_web_view"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.webview.TaskCompletedWebViewActivity"
+            android:label="@string/title_activity_work_web_view"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.webview.ReadWebViewActivity"
+            android:label="@string/title_activity_work_web_view"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.webview.ReadCompletedWebViewActivity"
+            android:label="@string/title_activity_work_web_view"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.process.TaskListActivity"
+            android:label="@string/title_activity_task_list"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.process.TaskCompletedListActivity"
+            android:label="@string/title_activity_task_complete"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.process.TaskCompletedSearchActivity"
+            android:label="@string/title_activity_task_complete"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.process.ReadListActivity"
+            android:label="@string/title_activity_read_list"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.process.ReadCompletedListActivity"
+            android:label="@string/title_activity_read_complete"
+            android:screenOrientation="portrait" />
+
+        <!-- bbs -->
+        <activity
+            android:name=".app.bbs.main.BBSMainActivity"
+            android:label="@string/bbs"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMTheme.NoActionBar.Transparent" />
+        <activity
+            android:name=".app.bbs.section.BBSSectionActivity"
+            android:label="@string/title_activity_bbs_section"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.bbs.view.BBSWebViewSubjectActivity"
+            android:label="@string/title_activity_bbs_view"
+            android:screenOrientation="portrait"
+            android:windowSoftInputMode="adjustResize|stateHidden" />
+        <activity
+            android:name=".app.bbs.publish.BBSPublishSubjectActivity"
+            android:label="@string/title_activity_bbs_publish_subject"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.bbs.reply.BBSReplyActivity"
+            android:label="@string/title_activity_bbs_reply"
+            android:screenOrientation="portrait" />
+        <!-- cms -->
+        <activity
+            android:name=".app.cms.index.CMSIndexActivity"
+            android:label="@string/cms"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMTheme.NoActionBar.Transparent" />
+        <activity
+            android:name=".app.cms.application.CMSApplicationActivity"
+            android:label="@string/title_cms_application"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.cms.view.CMSWebViewActivity"
+            android:label="@string/title_cms_view"
+            android:screenOrientation="portrait" />
+
+        <!-- cloud drive -->
+        <activity
+            android:name=".app.clouddrive.CloudDriveActivity"
+            android:label="@string/title_activity_yunpan"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMTheme.NoActionBar.Transparent" />
+        <activity
+            android:name=".app.clouddrive.viewer.PictureViewActivity"
+            android:label="@string/title_activity_picture_viewer"
+            android:screenOrientation="portrait" />
+
+        <!-- meeting -->
+        <activity
+            android:name=".app.meeting.main.MeetingMainActivity"
+            android:label="@string/title_activity_meeting"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMTheme.NoActionBar.Transparent" />
+        <activity
+            android:name=".app.meeting.room.MeetingRoomChooseActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.meeting.apply.MeetingApplyActivity"
+            android:label="@string/title_activity_meeting_create_form"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.meeting.edit.MeetingEditActivity"
+            android:label="@string/title_activity_meeting_edit_form"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.meeting.invited.MeetingDetailInfoActivity"
+            android:label="@string/meeting_detail"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.meeting.reserve.MeetingRoomDetailActivity"
+            android:label="@string/meeting_detail"
+            android:screenOrientation="portrait" />
+        <!-- attendance -->
+        <activity
+            android:name=".app.attendance.main.AttendanceMainActivity"
+            android:label="@string/attendance_check_in_title"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMTheme.NoActionBar.Transparent" />
+        <activity
+            android:name=".app.attendance.list.AttendanceListActivity"
+            android:label="@string/title_activity_attendance"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.attendance.appeal.AttendanceAppealActivity"
+            android:label="@string/title_activity_attendance_appeal"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.attendance.approval.AttendanceAppealApprovalActivity"
+            android:label="@string/title_activity_attendance_appeal_approval"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.attendance.setting.AttendanceLocationSettingActivity"
+            android:label="@string/title_activity_attendance_location_setting"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.main.MyAppActivity"
+            android:label="所有应用"
+            android:screenOrientation="portrait" />
+
+        <!-- ai -->
+        <activity android:name=".app.o2.ai.O2AIActivity"
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait"/>
+
+        <!-- calendar -->
+        <activity
+            android:name=".app.calendar.CalendarMainActivity"
+            android:label="@string/calendar_name"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMTheme.NoActionBar.Transparent" />
+        <activity android:name=".app.calendar.CreateEventActivity" />
+        <activity android:name=".app.calendar.CreateCalendarActivity" />
+        <activity android:name=".app.calendar.CalendarStoreActivity" />
+
+        <!-- portal -->
+        <activity
+            android:name=".app.o2.webview.PortalWebViewActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/XBPMTheme.NoActionBar.Transparent" />
+
+        <!-- 换肤 -->
+        <activity
+            android:name=".app.o2.skin.SkinManagerActivity"
+            android:label="@string/skin_manager"
+            android:screenOrientation="portrait" />
+        <activity android:name=".app.o2.skin.SkinShowActivity" />
+
+        <!-- im -->
+        <activity
+            android:name=".app.o2.openim.IMTribeCreateActivity"
+            android:label="@string/activity_im_tribe_create_label"
+            android:screenOrientation="portrait"
+            android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
+        <activity
+            android:name=".app.o2.openim.IMPersonConfigActivity"
+            android:label="@string/activity_im_person_config_label"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".app.o2.openim.IMTribeInfoActivity"
+            android:label="@string/activity_im_tribe_update_label"
+            android:screenOrientation="portrait" />
+
+        <!-- 蓝牙相关 -->
+        <activity android:name=".app.bluetooth.BlueToothClientActivity" />
+        <activity android:name=".app.bluetooth.BlueToothServerActivity" />
+        <activity android:name=".app.bluetooth.BlueToothBLEClientActivity" />
+        <activity android:name=".app.bluetooth.BlueToothBLEServerActivity" />
+
+        <!-- IM -->
+        <activity
+            android:name="jiguang.chat.activity.ChatActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes" />
+        <activity
+            android:name="jiguang.chat.activity.BrowserViewPagerActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="jiguang.chat.activity.ForwardMsgActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes"
+            android:windowSoftInputMode="adjustResize" />
+        <activity
+            android:name="jiguang.chat.activity.CreateGroupActivity"
+            android:configChanges="orientation|keyboardHidden"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes"
+            android:windowSoftInputMode="adjustPan|stateHidden" />
+        <activity
+            android:name="jiguang.chat.activity.GroupActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes" />
+        <activity
+            android:name="jiguang.chat.activity.MembersInChatActivity"
+            android:configChanges="orientation|keyboardHidden"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes"
+            android:windowSoftInputMode="adjustPan|stateHidden" />
+        <activity
+            android:name="jiguang.chat.activity.SearchContactsActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes"
+            android:windowSoftInputMode="adjustResize" />
+        <activity
+            android:name="jiguang.chat.activity.SearchMoreFriendsActivity"
+            android:configChanges="orientation|keyboardHidden"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes"
+            android:windowSoftInputMode="adjustPan|stateHidden" />
+        <activity
+            android:name="jiguang.chat.activity.SearchMoreGroupActivity"
+            android:configChanges="orientation|keyboardHidden"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes"
+            android:windowSoftInputMode="adjustPan|stateHidden" />
+        <activity
+            android:name="jiguang.chat.activity.ChatDetailActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes" />
+        <activity
+            android:name="jiguang.chat.activity.NickSignActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes" />
+        <activity
+            android:name="jiguang.chat.activity.historyfile.activity.HistoryFileActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes" />
+        <activity
+            android:name="jiguang.chat.activity.DownLoadActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes" />
+        <activity
+            android:name="jiguang.chat.activity.SendFileActivity"
+            android:launchMode="singleInstance"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes" />
+        <activity
+            android:name="jiguang.chat.activity.FriendListActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/IMBaseThemes" />
+        <activity
+            android:name="jiguang.chat.location.activity.MapPickerActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/Theme.AppCompat.Light.DarkActionBar" />
+
+        <!-- ```````````````````service```````````````````` -->
+        <!-- baidu -->
+        <service
+            android:name="com.baidu.location.f"
+            android:enabled="true"
+            android:process=":remote" />
+
+        <meta-data
+            android:name="com.baidu.lbsapi.API_KEY"
+            android:value="${BAIDU_APPKEY}" />
+        <!-- baidu yuyin -->
+        <service
+            android:name="com.baidu.speech.VoiceRecognitionService"
+            android:exported="false" />
+
+        <meta-data
+            android:name="com.baidu.speech.APP_ID"
+            android:value="${BAIDU_APPID}" />
+        <meta-data
+            android:name="com.baidu.speech.API_KEY"
+            android:value="${BAIDU_APPKEY}" />
+        <meta-data
+            android:name="com.baidu.speech.SECRET_KEY"
+            android:value="${BAIDU_SECRET}" />
+
+        <!-- 删除临时文件任务 -->
+        <service
+            android:name=".core.service.ClearTempFileJobService"
+            android:exported="true"
+            android:permission="android.permission.BIND_JOB_SERVICE" />
+        <service
+            android:name=".core.service.CollectLogJobService"
+            android:exported="true"
+            android:permission="android.permission.BIND_JOB_SERVICE" />
+
+        <!-- 下载apk -->
+        <service
+            android:name=".core.service.DownloadAPKService"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="net.zoneland.x.bpm.mobile.v1.zoneXBPM.action.UPDATE" />
+            </intent-filter>
+        </service>
+
+        <!-- 重启应用的service -->
+        <service android:name=".core.service.RestartSelfService" />
+
+        <!-- jpush -->
+        <receiver
+            android:name=".core.receiver.JpushNoticeBroadReceiver"
+            android:enabled="true">
+            <intent-filter>
+                <action android:name="cn.jpush.android.intent.REGISTRATION" />
+                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
+                <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
+
+                <category android:name="net.zoneland.x.bpm.mobile.v1.zoneXBPM" />
+            </intent-filter>
+        </receiver>
+
+        <meta-data android:name="JM_IM_USER_PASSWORD"
+            android:value="${JM_IM_USER_PASSWORD}" />
+
+        <!-- ```````````````````meta```````````````````` -->
+        <!-- 蒲公英 appid -->
+        <meta-data
+            android:name="PGYER_APPID"
+            android:value="${PGY_APP_ID}" />
+
+        <!-- bugly -->
+        <!-- 配置APP ID -->
+        <meta-data
+            android:name="BUGLY_APPID"
+            android:value="${BUGLY_APPID}" />
+        <!-- 配置APP渠道号 -->
+        <meta-data
+            android:name="BUGLY_APP_CHANNEL"
+            android:value="${JPUSH_CHANNEL}" />
+
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="net.zoneland.x.bpm.mobile.v1.zoneXBPM.fileProvider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
+        </provider>
+        <provider
+            android:name="cn.jpush.android.service.DataProvider"
+            android:authorities="net.zoneland.x.bpm.mobile.v1.zoneXBPM.DataProvider"
+            android:exported="true"
+            tools:replace="android:exported, android:authorities" />
+
+        <activity android:name=".app.tbs.FileReaderActivity"></activity>
+    </application>
+
+</manifest>

+ 79 - 0
o2android/app/src/main/java/com/baidu/android/tts/InitConfig.java

@@ -0,0 +1,79 @@
+package com.baidu.android.tts;
+
+import com.baidu.tts.client.SpeechSynthesizerListener;
+import com.baidu.tts.client.TtsMode;
+
+import java.util.Map;
+
+/**
+ * 合成引擎的初始化参数
+ * <p>
+ * Created by fujiayi on 2017/9/13.
+ */
+
+public class InitConfig {
+    /**
+     * appId appKey 和 secretKey。注意如果需要离线合成功能,请在您申请的应用中填写包名。
+     * 本demo的包名是com.baidu.tts.sample,定义在build.gradle中。
+     */
+    private String appId;
+
+    private String appKey;
+
+    private String secretKey;
+
+    /**
+     * 纯在线或者离在线融合
+     */
+    private TtsMode ttsMode;
+
+
+    /**
+     * 初始化的其它参数,用于setParam
+     */
+    private Map<String, String> params;
+
+    /**
+     * 合成引擎的回调
+     */
+    private SpeechSynthesizerListener listener;
+
+    private InitConfig() {
+
+    }
+
+    public InitConfig(String appId, String appKey, String secretKey, TtsMode ttsMode,
+                      Map<String, String> params, SpeechSynthesizerListener listener) {
+        this.appId = appId;
+        this.appKey = appKey;
+        this.secretKey = secretKey;
+        this.ttsMode = ttsMode;
+        this.params = params;
+        this.listener = listener;
+    }
+
+    public SpeechSynthesizerListener getListener() {
+        return listener;
+    }
+
+    public Map<String, String> getParams() {
+        return params;
+    }
+
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public String getAppKey() {
+        return appKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    public TtsMode getTtsMode() {
+        return ttsMode;
+    }
+}

+ 13 - 0
o2android/app/src/main/java/com/baidu/android/tts/MainHandlerConstant.java

@@ -0,0 +1,13 @@
+package com.baidu.android.tts;
+
+/**
+ * Created by fujiayi on 2017/9/13.
+ */
+
+public interface MainHandlerConstant {
+    static final int PRINT = 0;
+    static final int UI_CHANGE_INPUT_TEXT_SELECTION = 1;
+    static final int UI_CHANGE_SYNTHES_TEXT_SELECTION = 2;
+
+    static final int INIT_SUCCESS = 2;
+}

+ 103 - 0
o2android/app/src/main/java/com/baidu/android/tts/MessageListener.java

@@ -0,0 +1,103 @@
+package com.baidu.android.tts;
+
+import android.util.Log;
+
+import com.baidu.tts.client.SpeechError;
+import com.baidu.tts.client.SpeechSynthesizerListener;
+
+/**
+ * SpeechSynthesizerListener 简单地实现,仅仅记录日志
+ * Created by fujiayi on 2017/5/19.
+ */
+
+public class MessageListener implements SpeechSynthesizerListener, MainHandlerConstant {
+    private static final String TAG = "MessageListener";
+
+    /**
+     * 播放开始,每句播放开始都会回调
+     *
+     * @param utteranceId
+     */
+    @Override
+    public void onSynthesizeStart(String utteranceId) {
+        sendMessage("准备开始合成,序列号:" + utteranceId);
+    }
+
+    /**
+     * 语音流 16K采样率 16bits编码 单声道 。
+     *
+     * @param utteranceId
+     * @param bytes       二进制语音 ,注意可能有空data的情况,可以忽略
+     * @param progress    如合成“百度语音问题”这6个字, progress肯定是从0开始,到6结束。 但progress无法和合成到第几个字对应。
+     */
+    @Override
+    public void onSynthesizeDataArrived(String utteranceId, byte[] bytes, int progress) {
+        //  Log.i(TAG, "合成进度回调, progress:" + progress + ";序列号:" + utteranceId );
+    }
+
+    /**
+     * 合成正常结束,每句合成正常结束都会回调,如果过程中出错,则回调onError,不再回调此接口
+     *
+     * @param utteranceId
+     */
+    @Override
+    public void onSynthesizeFinish(String utteranceId) {
+        sendMessage("合成结束回调, 序列号:" + utteranceId);
+    }
+
+    @Override
+    public void onSpeechStart(String utteranceId) {
+        sendMessage("播放开始回调, 序列号:" + utteranceId);
+    }
+
+    /**
+     * 播放进度回调接口,分多次回调
+     *
+     * @param utteranceId
+     * @param progress    如合成“百度语音问题”这6个字, progress肯定是从0开始,到6结束。 但progress无法保证和合成到第几个字对应。
+     */
+    @Override
+    public void onSpeechProgressChanged(String utteranceId, int progress) {
+        //  Log.i(TAG, "播放进度回调, progress:" + progress + ";序列号:" + utteranceId );
+    }
+
+    /**
+     * 播放正常结束,每句播放正常结束都会回调,如果过程中出错,则回调onError,不再回调此接口
+     *
+     * @param utteranceId
+     */
+    @Override
+    public void onSpeechFinish(String utteranceId) {
+        sendMessage("播放结束回调, 序列号:" + utteranceId);
+    }
+
+    /**
+     * 当合成或者播放过程中出错时回调此接口
+     *
+     * @param utteranceId
+     * @param speechError 包含错误码和错误信息
+     */
+    @Override
+    public void onError(String utteranceId, SpeechError speechError) {
+        sendErrorMessage("错误发生:" + speechError.description + ",错误编码:"
+                + speechError.code + ",序列号:" + utteranceId);
+    }
+
+    private void sendErrorMessage(String message) {
+        sendMessage(message, true);
+    }
+
+
+    private void sendMessage(String message) {
+        sendMessage(message, false);
+    }
+    
+    protected void sendMessage(String message, boolean isError) {
+        if (isError) {
+            Log.e(TAG, message);
+        } else {
+            Log.i(TAG, message);
+        }
+
+    }
+}

+ 200 - 0
o2android/app/src/main/java/com/baidu/android/tts/MySyntherizer.java

@@ -0,0 +1,200 @@
+package com.baidu.android.tts;
+
+import android.content.Context;
+import android.util.Log;
+import android.util.Pair;
+
+import com.baidu.tts.auth.AuthInfo;
+import com.baidu.tts.client.SpeechSynthesizeBag;
+import com.baidu.tts.client.SpeechSynthesizer;
+import com.baidu.tts.client.TtsMode;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 该类是对SpeechSynthesizer的封装
+ * <p>
+ * Created by fujiayi on 2017/5/24.
+ */
+
+public class MySyntherizer implements MainHandlerConstant {
+
+    protected SpeechSynthesizer mSpeechSynthesizer;
+    protected Context context;
+
+    private static final String TAG = "NonBlockSyntherizer";
+
+    private static boolean isInitied = false;
+
+    private boolean isCheckFile = true;
+
+    public MySyntherizer(Context context, InitConfig initConfig) {
+        this(context);
+        init(initConfig);
+    }
+
+
+    protected MySyntherizer(Context context) {
+        if (isInitied) {
+            // SpeechSynthesizer.getInstance() 不要连续调用
+            throw new RuntimeException("MySynthesizer 类里面 SpeechSynthesizer还未释放,请勿新建一个新类");
+        }
+        this.context = context;
+        isInitied = true;
+    }
+
+    /**
+     * 注意该方法需要在新线程中调用。且该线程不能结束。详细请参见NonBlockSyntherizer的实现
+     *
+     * @param config
+     * @return
+     */
+    protected boolean init(InitConfig config) {
+
+        sendToUiThread("初始化开始");
+        boolean isMix = config.getTtsMode().equals(TtsMode.MIX);
+        mSpeechSynthesizer = SpeechSynthesizer.getInstance();
+        mSpeechSynthesizer.setContext(context);
+        mSpeechSynthesizer.setSpeechSynthesizerListener(config.getListener());
+
+
+        // 请替换为语音开发者平台上注册应用得到的App ID ,AppKey ,Secret Key ,填写在SynthActivity的开始位置
+        mSpeechSynthesizer.setAppId(config.getAppId());
+        mSpeechSynthesizer.setApiKey(config.getAppKey(), config.getSecretKey());
+
+        if (isMix) {
+
+            // 授权检测接口(只是通过AuthInfo进行检验授权是否成功。选择纯在线可以不必调用auth方法。
+            AuthInfo authInfo = mSpeechSynthesizer.auth(config.getTtsMode());
+            if (!authInfo.isSuccess()) {
+                // 离线授权需要网站上的应用填写包名。本demo的包名是com.baidu.tts.sample,定义在build.gradle中
+                String errorMsg = authInfo.getTtsError().getDetailMessage();
+                sendToUiThread("鉴权失败 =" + errorMsg);
+                return false;
+            } else {
+                sendToUiThread("验证通过,离线正式授权文件存在。");
+            }
+        }
+        setParams(config.getParams());
+        // 初始化tts
+        int result = mSpeechSynthesizer.initTts(config.getTtsMode());
+        if (result != 0) {
+            sendToUiThread("【error】initTts 初始化失败 + errorCode:" + result);
+            return false;
+        }
+        // 此时可以调用 speak和synthesize方法
+        sendToUiThread(INIT_SUCCESS, "合成引擎初始化成功");
+        return true;
+    }
+
+    /**
+     * 合成并播放
+     *
+     * @param text 小于1024 GBK字节,即512个汉字或者字母数字
+     * @return
+     */
+    public int speak(String text) {
+        Log.i(TAG, "speak text:" + text);
+        return mSpeechSynthesizer.speak(text);
+    }
+
+    /**
+     * 合成并播放
+     *
+     * @param text        小于1024 GBK字节,即512个汉字或者字母数字
+     * @param utteranceId 用于listener的回调,默认"0"
+     * @return
+     */
+    public int speak(String text, String utteranceId) {
+        return mSpeechSynthesizer.speak(text, utteranceId);
+    }
+
+    /**
+     * 只合成不播放
+     *
+     * @param text
+     * @return
+     */
+    public int synthesize(String text) {
+        return mSpeechSynthesizer.synthesize(text);
+    }
+
+    public int synthesize(String text, String utteranceId) {
+        return mSpeechSynthesizer.synthesize(text, utteranceId);
+    }
+
+    public int batchSpeak(List<Pair<String, String>> texts) {
+        List<SpeechSynthesizeBag> bags = new ArrayList<SpeechSynthesizeBag>();
+        for (Pair<String, String> pair : texts) {
+            SpeechSynthesizeBag speechSynthesizeBag = new SpeechSynthesizeBag();
+            speechSynthesizeBag.setText(pair.first);
+            if (pair.second != null) {
+                speechSynthesizeBag.setUtteranceId(pair.second);
+            }
+            bags.add(speechSynthesizeBag);
+
+        }
+        return mSpeechSynthesizer.batchSpeak(bags);
+    }
+
+    public void setParams(Map<String, String> params) {
+        if (params != null) {
+            for (Map.Entry<String, String> e : params.entrySet()) {
+                mSpeechSynthesizer.setParam(e.getKey(), e.getValue());
+            }
+        }
+    }
+
+    public int pause() {
+        return mSpeechSynthesizer.pause();
+    }
+
+    public int resume() {
+        return mSpeechSynthesizer.resume();
+    }
+
+    public int stop() {
+        return mSpeechSynthesizer.stop();
+    }
+
+    /**
+     * 引擎在合成时该方法不能调用!!!
+     * 注意 只有 TtsMode.MIX 才可以切换离线发音
+     *
+     * @return
+     */
+    public int loadModel(String modelFilename, String textFilename) {
+        int res  = mSpeechSynthesizer.loadModel(modelFilename, textFilename);
+        sendToUiThread("切换离线发音人成功。");
+        return res;
+    }
+
+    /**
+     * 设置播放音量,默认已经是最大声音
+     * 0.0f为最小音量,1.0f为最大音量
+     *
+     * @param leftVolume  [0-1] 默认1.0f
+     * @param rightVolume [0-1] 默认1.0f
+     */
+    public void setStereoVolume(float leftVolume, float rightVolume) {
+        mSpeechSynthesizer.setStereoVolume(leftVolume, rightVolume);
+    }
+
+    public void release() {
+        mSpeechSynthesizer.stop();
+        mSpeechSynthesizer.release();
+        mSpeechSynthesizer = null;
+        isInitied = false;
+    }
+
+
+    protected void sendToUiThread(String message) {
+        sendToUiThread(PRINT, message);
+    }
+
+    protected void sendToUiThread(int action, String message) {
+        Log.i(TAG, "what:"+action+"message:"+message);
+    }
+}

+ 103 - 0
o2android/app/src/main/java/com/baidu/android/tts/OfflineResource.java

@@ -0,0 +1,103 @@
+package com.baidu.android.tts;
+
+import android.content.Context;
+import android.content.res.AssetManager;
+import android.util.Log;
+
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.FileExtensionHelper;
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.FileUtil;
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.SDCardHelper;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+
+import static android.content.ContentValues.TAG;
+
+
+/**
+ * Created by fujiayi on 2017/5/19.
+ */
+
+public class OfflineResource {
+
+    public static final String VOICE_FEMALE = "F";
+
+    public static final String VOICE_MALE = "M";
+
+
+    public static final String VOICE_DUYY = "Y";
+
+    public static final String VOICE_DUXY = "X";
+
+    private static final String SAMPLE_DIR = "baiduTTS";
+
+    private AssetManager assets;
+    private String destPath;
+
+    private String textFilename;
+    private String modelFilename;
+
+    private static HashMap<String, Boolean> mapInitied = new HashMap<String, Boolean>();
+
+    public OfflineResource(Context context, String voiceType) throws IOException {
+        context = context.getApplicationContext();
+        this.assets = context.getApplicationContext().getAssets();
+        this.destPath = createTmpDir(context);
+        setOfflineVoiceType(voiceType);
+    }
+
+    private String createTmpDir(Context context) {
+        String sampleDir = "baiduASR";
+        String samplePath = FileExtensionHelper.getXBPMBaseFolder() + File.separator + sampleDir;
+        if (!SDCardHelper.INSTANCE.makeDir(samplePath)) {
+            samplePath = context.getExternalFilesDir(sampleDir).getAbsolutePath();
+            if (!SDCardHelper.INSTANCE.makeDir(samplePath)) {
+                //throw new RuntimeException("创建临时目录失败 :" + samplePath);
+            }
+        }
+        return samplePath;
+    }
+
+    public String getModelFilename() {
+        return modelFilename;
+    }
+
+    public String getTextFilename() {
+        return textFilename;
+    }
+
+    public void setOfflineVoiceType(String voiceType) throws IOException {
+        String text = "bd_etts_text.dat";
+        String model;
+        if (VOICE_MALE.equals(voiceType)) {
+            model = "bd_etts_common_speech_m15_mand_eng_high_am-mix_v3.0.0_20170505.dat";
+        } else if (VOICE_FEMALE.equals(voiceType)) {
+            model = "bd_etts_common_speech_f7_mand_eng_high_am-mix_v3.0.0_20170512.dat";
+        } else if (VOICE_DUXY.equals(voiceType)) {
+            model = "bd_etts_common_speech_yyjw_mand_eng_high_am-mix_v3.0.0_20170512.dat";
+        } else if (VOICE_DUYY.equals(voiceType)) {
+            model = "bd_etts_common_speech_as_mand_eng_high_am_v3.0.0_20170516.dat";
+        } else {
+            throw new RuntimeException("voice type is not in list");
+        }
+        textFilename = copyAssetsFile(text);
+        modelFilename = copyAssetsFile(model);
+
+    }
+
+
+    private String copyAssetsFile(String sourceFilename) throws IOException {
+        String destFilename = destPath + "/" + sourceFilename;
+        boolean recover = false;
+        Boolean existed = mapInitied.get(sourceFilename); // 启动时完全覆盖一次
+        if (existed == null || !existed) {
+            recover = true;
+        }
+        FileUtil.INSTANCE.copyFromAssets(assets, sourceFilename, destFilename, recover);
+        Log.i(TAG, "文件复制成功:" + destFilename);
+        return destFilename;
+    }
+
+
+}

+ 69 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/control/ErrorTranslation.java

@@ -0,0 +1,69 @@
+package com.baidu.android.voicedemo.control;
+
+import android.speech.SpeechRecognizer;
+
+/**
+ * Created by fujiayi on 2017/6/14.
+ */
+
+public class ErrorTranslation {
+
+    public static String recogError(int errorCode) {
+        String message;
+        switch (errorCode) {
+            case SpeechRecognizer.ERROR_AUDIO:
+                message = "音频问题";
+                break;
+            case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
+                message = "没有语音输入";
+                break;
+            case SpeechRecognizer.ERROR_CLIENT:
+                message = "其它客户端错误";
+                break;
+            case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
+                message = "权限不足";
+                break;
+            case SpeechRecognizer.ERROR_NETWORK:
+                message = "网络问题";
+                break;
+            case SpeechRecognizer.ERROR_NO_MATCH:
+                message = "没有匹配的识别结果";
+                break;
+            case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
+                message = "引擎忙";
+                break;
+            case SpeechRecognizer.ERROR_SERVER:
+                message = "服务端错误";
+                break;
+            case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
+                message = "连接超时";
+                break;
+            default:
+                message = "未知错误:" + errorCode;
+                break;
+        }
+        return message;
+    }
+
+    public static String wakeupError(int errorCode) {
+        String message = null;
+        switch (errorCode) {
+            case 1:
+                message = "参数错误";
+                break;
+            case 2:
+                message = "网络请求发生错误";
+                break;
+            case 3:
+                message = "服务器数据解析错误";
+                break;
+            case 4:
+                message = "网络不可用";
+                break;
+            default:
+                message = "未知错误:" + errorCode;
+                break;
+        }
+        return message;
+    }
+}

+ 115 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/control/MyRecognizer.java

@@ -0,0 +1,115 @@
+package com.baidu.android.voicedemo.control;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.baidu.android.voicedemo.recognization.IRecogListener;
+import com.baidu.android.voicedemo.recognization.RecogEventAdapter;
+import com.baidu.speech.EventListener;
+import com.baidu.speech.EventManager;
+import com.baidu.speech.EventManagerFactory;
+import com.baidu.speech.asr.SpeechConstant;
+
+import org.json.JSONObject;
+
+import java.util.Map;
+
+/**
+ * Created by fujiayi on 2017/6/13.
+ * EventManager内的方法如send 都可以在主线程中进行,SDK中做过处理
+ */
+
+public class MyRecognizer {
+    /**
+     * SDK 内部核心 EventManager 类
+     */
+    private EventManager asr;
+
+    /**
+     * SDK 内部核心 事件回调类, 用于开发者写自己的识别回调逻辑
+     */
+    private EventListener eventListener;
+
+    private static boolean isOfflineEngineLoaded = false;
+
+    private static boolean isInited = false;
+
+    private static final String TAG = "MyRecognizer";
+
+    /**
+     * 初始化
+     *
+     * @param context
+     * @param recogListener 将EventListener结果做解析的DEMO回调。使用RecogEventAdapter 适配EventListener
+     */
+    public MyRecognizer(Context context, IRecogListener recogListener) {
+        this(context, new RecogEventAdapter(recogListener));
+    }
+
+    /**
+     * 初始化 提供 EventManagerFactory需要的Context和EventListener
+     *
+     * @param context
+     * @param eventListener
+     */
+    public MyRecognizer(Context context, EventListener eventListener) {
+        if (isInited) {
+            Log.e(TAG, "还未调用release(),请勿新建一个新类");
+            throw new RuntimeException("还未调用release(),请勿新建一个新类");
+        }
+        isInited = true;
+        this.eventListener = eventListener;
+        asr = EventManagerFactory.create(context, "asr");
+        asr.registerListener(eventListener);
+    }
+
+    /**
+     * @param params
+     */
+    public void loadOfflineEngine(Map<String, Object> params) {
+        String json = new JSONObject(params).toString();
+        Log.i(TAG + ".Debug", "loadOfflineEngine params:" + json);
+        asr.send(SpeechConstant.ASR_KWS_LOAD_ENGINE, json, null, 0, 0);
+        isOfflineEngineLoaded = true;
+        // 没有ASR_KWS_LOAD_ENGINE这个回调表试失败,如缺少第一次联网时下载的正式授权文件。
+    }
+
+    public void start(Map<String, Object> params) {
+        String json = new JSONObject(params).toString();
+        Log.i(TAG + ".Debug", "asr params(识别参数,反馈请带上此行日志):" + json);
+        asr.send(SpeechConstant.ASR_START, json, null, 0, 0);
+    }
+
+    /**
+     * 提前结束录音等待识别结果。
+     */
+    public void stop() {
+        Log.i(TAG, "停止录音");
+        asr.send(SpeechConstant.ASR_STOP, "{}", null, 0, 0);
+    }
+
+    /**
+     * 取消本次识别,取消后将立即停止不会返回识别结果。
+     * cancel 与stop的区别是 cancel在stop的基础上,完全停止整个识别流程,
+     */
+    public void cancel() {
+        Log.i(TAG, "取消识别");
+        if (asr != null) {
+            asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0);
+        }
+    }
+
+    public void release() {
+        if (asr == null) {
+            return;
+        }
+        cancel();
+        if (isOfflineEngineLoaded) {
+            asr.send(SpeechConstant.ASR_KWS_UNLOAD_ENGINE, null, null, 0, 0);
+            isOfflineEngineLoaded = false;
+        }
+        asr.unregisterListener(eventListener);
+        asr = null;
+        isInited = false;
+    }
+}

+ 144 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/ChainRecogListener.java

@@ -0,0 +1,144 @@
+package com.baidu.android.voicedemo.recognization;
+
+
+import java.util.ArrayList;
+
+/**
+ * Created by fujiayi on 2017/10/18.
+ */
+
+public class ChainRecogListener implements IRecogListener {
+
+    private ArrayList<IRecogListener> listeners;
+
+    public ChainRecogListener() {
+        listeners = new ArrayList<IRecogListener>();
+    }
+
+    public void addListener(IRecogListener listener) {
+        listeners.add(listener);
+    }
+
+    /**
+     * ASR_START 输入事件调用后,引擎准备完毕
+     */
+    @Override
+    public void onAsrReady() {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrReady();
+        }
+    }
+
+    /**
+     * onAsrReady后检查到用户开始说话
+     */
+    @Override
+    public void onAsrBegin() {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrBegin();
+        }
+    }
+
+    /**
+     * 检查到用户开始说话停止,或者ASR_STOP 输入事件调用后,
+     */
+    @Override
+    public void onAsrEnd() {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrEnd();
+        }
+    }
+
+    /**
+     * onAsrBegin 后 随着用户的说话,返回的临时结果
+     *
+     * @param results     可能返回多个结果,请取第一个结果
+     * @param recogResult 完整的结果
+     */
+    @Override
+    public void onAsrPartialResult(String[] results, RecogResult recogResult) {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrPartialResult(results, recogResult);
+        }
+    }
+
+    /**
+     * 最终的识别结果
+     *
+     * @param results     可能返回多个结果,请取第一个结果
+     * @param recogResult 完整的结果
+     */
+    @Override
+    public void onAsrFinalResult(String[] results, RecogResult recogResult) {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrFinalResult(results, recogResult);
+        }
+    }
+
+    @Override
+    public void onAsrFinish(RecogResult recogResult) {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrFinish(recogResult);
+        }
+    }
+
+    @Override
+    public void onAsrFinishError(int errorCode, int subErrorCode, String errorMessage, String descMessage,
+                                 RecogResult recogResult) {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrFinishError(errorCode, subErrorCode, errorMessage, descMessage, recogResult);
+        }
+    }
+
+    /**
+     * 长语音识别结束
+     */
+    @Override
+    public void onAsrLongFinish() {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrLongFinish();
+        }
+    }
+
+    @Override
+    public void onAsrVolume(int volumePercent, int volume) {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrVolume(volumePercent, volume);
+        }
+    }
+
+    @Override
+    public void onAsrAudio(byte[] data, int offset, int length) {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrAudio(data, offset, length);
+        }
+    }
+
+    @Override
+    public void onAsrExit() {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrExit();
+        }
+    }
+
+    @Override
+    public void onAsrOnlineNluResult(String nluResult) {
+        for (IRecogListener listener : listeners) {
+            listener.onAsrOnlineNluResult(nluResult);
+        }
+    }
+
+    @Override
+    public void onOfflineLoaded() {
+        for (IRecogListener listener : listeners) {
+            listener.onOfflineLoaded();
+        }
+    }
+
+    @Override
+    public void onOfflineUnLoaded() {
+        for (IRecogListener listener : listeners) {
+            listener.onOfflineUnLoaded();
+        }
+    }
+}

+ 131 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/CommonRecogParams.java

@@ -0,0 +1,131 @@
+package com.baidu.android.voicedemo.recognization;
+
+import android.app.Activity;
+import android.content.SharedPreferences;
+import android.util.Log;
+
+import com.baidu.speech.asr.SpeechConstant;
+
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R;
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.FileExtensionHelper;
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.utils.SDCardHelper;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by fujiayi on 2017/6/20.
+ */
+
+public class CommonRecogParams {
+
+    protected String samplePath;
+    /**
+     * 字符串格式的参数
+     */
+    protected ArrayList<String> stringParams = new ArrayList<String>();
+
+    /**
+     * int格式的参数
+     */
+    protected ArrayList<String> intParams = new ArrayList<String>();
+
+    /**
+     * bool格式的参数
+     */
+    protected ArrayList<String> boolParams = new ArrayList<String>();
+
+    private static final String TAG = "CommonRecogParams";
+
+    public CommonRecogParams(Activity context) {
+
+        stringParams.addAll(Arrays.asList(
+                SpeechConstant.VAD,
+                SpeechConstant.IN_FILE
+        ));
+        intParams.addAll(Arrays.asList(
+                SpeechConstant.PID,
+                SpeechConstant.VAD_ENDPOINT_TIMEOUT
+        ));
+        boolParams.addAll(Arrays.asList(
+                SpeechConstant.ACCEPT_AUDIO_DATA,
+                SpeechConstant.ACCEPT_AUDIO_VOLUME
+        ));
+        initSamplePath(context);
+    }
+
+    /**
+     * 创建保存OUTFILE的临时目录. 仅用于OUTFILE参数。不使用demo中的OUTFILE参数可忽略此段
+     *
+     * @param context
+     */
+    protected void initSamplePath(Activity context) {
+        String sampleDir = "baiduASR";
+        samplePath = FileExtensionHelper.getXBPMBaseFolder() + File.separator + sampleDir;
+        if (!SDCardHelper.INSTANCE.makeDir(samplePath)) {
+            samplePath = context.getApplication().getExternalFilesDir(sampleDir).getAbsolutePath();
+            if (!SDCardHelper.INSTANCE.makeDir(samplePath)) {
+                throw new RuntimeException("创建临时目录失败 :" + samplePath);
+            }
+        }
+    }
+
+    public Map<String, Object> fetch(SharedPreferences sp) {
+        Map<String, Object> map = new HashMap<String, Object>();
+
+        parseParamArr(sp, map);
+
+        if (sp.getBoolean("_tips_sound", false)) { // 声音回调
+            map.put(SpeechConstant.SOUND_START, R.raw.bdspeech_recognition_start);
+            map.put(SpeechConstant.SOUND_END, R.raw.bdspeech_speech_end);
+            map.put(SpeechConstant.SOUND_SUCCESS, R.raw.bdspeech_recognition_success);
+            map.put(SpeechConstant.SOUND_ERROR, R.raw.bdspeech_recognition_error);
+            map.put(SpeechConstant.SOUND_CANCEL, R.raw.bdspeech_recognition_cancel);
+        }
+
+        if (sp.getBoolean("_outfile", false)) { // 保存录音文件
+            map.put(SpeechConstant.ACCEPT_AUDIO_DATA, true); // 目前必须开启此回掉才嫩保存音频
+            map.put(SpeechConstant.OUT_FILE, samplePath + "/outfile.pcm");
+            Log.i(TAG, "语音录音文件将保存在:" + samplePath + "/outfile.pcm");
+        }
+
+        return map;
+    }
+
+    /**
+     * 根据 stringParams intParams boolParams中定义的参数名称,提取SharedPreferences相关字段
+     *
+     * @param sp
+     * @param map
+     */
+    private void parseParamArr(SharedPreferences sp, Map<String, Object> map) {
+        for (String name : stringParams) {
+            if (sp.contains(name)) {
+                String tmp = sp.getString(name, "").replaceAll(",.*", "").trim();
+                if (null != tmp && !"".equals(tmp)) {
+                    map.put(name, tmp);
+                }
+            }
+        }
+        for (String name : intParams) {
+            if (sp.contains(name)) {
+                String tmp = sp.getString(name, "").replaceAll(",.*", "").trim();
+                if (null != tmp && !"".equals(tmp)) {
+                    map.put(name, Integer.parseInt(tmp));
+                }
+            }
+        }
+        for (String name : boolParams) {
+            if (sp.contains(name)) {
+                boolean res =  sp.getBoolean(name, false);
+                if (res || name.equals(SpeechConstant.ACCEPT_AUDIO_VOLUME)){
+                    map.put(name, res);
+                }
+            }
+        }
+    }
+}
+

+ 61 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/IRecogListener.java

@@ -0,0 +1,61 @@
+package com.baidu.android.voicedemo.recognization;
+
+/**
+ * Created by fujiayi on 2017/6/14.
+ */
+
+public interface IRecogListener {
+
+    /**
+     * ASR_START 输入事件调用后,引擎准备完毕
+     */
+    void onAsrReady();
+
+    /**
+     * onAsrReady后检查到用户开始说话
+     */
+    void onAsrBegin();
+
+    /**
+     * 检查到用户开始说话停止,或者ASR_STOP 输入事件调用后,
+     */
+    void onAsrEnd();
+
+    /**
+     * onAsrBegin 后 随着用户的说话,返回的临时结果
+     *
+     * @param results     可能返回多个结果,请取第一个结果
+     * @param recogResult 完整的结果
+     */
+    void onAsrPartialResult(String[] results, RecogResult recogResult);
+
+    /**
+     * 最终的识别结果
+     *
+     * @param results     可能返回多个结果,请取第一个结果
+     * @param recogResult 完整的结果
+     */
+    void onAsrFinalResult(String[] results, RecogResult recogResult);
+
+    void onAsrFinish(RecogResult recogResult);
+
+    void onAsrFinishError(int errorCode, int subErrorCode, String errorMessage, String descMessage,
+                          RecogResult recogResult);
+
+    /**
+     * 长语音识别结束
+     */
+    void onAsrLongFinish();
+
+    void onAsrVolume(int volumePercent, int volume);
+
+    void onAsrAudio(byte[] data, int offset, int length);
+
+    void onAsrExit();
+
+    void onAsrOnlineNluResult(String nluResult);
+
+    void onOfflineLoaded();
+
+    void onOfflineUnLoaded();
+}

+ 23 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/IStatus.java

@@ -0,0 +1,23 @@
+package com.baidu.android.voicedemo.recognization;
+
+/**
+ * Created by fujiayi on 2017/6/14.
+ */
+
+public interface IStatus {
+
+    int STATUS_NONE = 2;
+
+    int STATUS_READY = 3;
+    int STATUS_SPEAKING = 4;
+    int STATUS_RECOGNITION = 5;
+
+    int STATUS_FINISHED = 6;
+    int STATUS_STOPPED = 10;
+
+    int STATUS_WAITING_READY = 8001;
+    int WHAT_MESSAGE_STATUS = 9001;
+
+    int STATUS_WAKEUP_SUCCESS = 7001;
+    int STATUS_WAKEUP_EXIT = 7003;
+}

+ 158 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/MessageStatusRecogListener.java

@@ -0,0 +1,158 @@
+package com.baidu.android.voicedemo.recognization;
+
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+/**
+ * Created by fujiayi on 2017/6/16.
+ */
+
+public class MessageStatusRecogListener extends StatusRecogListener {
+    private Handler handler;
+
+    private long speechEndTime;
+
+    private boolean needTime = true;
+
+    private static final String TAG = "MesStatusRecogListener";
+
+    public MessageStatusRecogListener(Handler handler) {
+        this.handler = handler;
+    }
+
+
+    @Override
+    public void onAsrReady() {
+        super.onAsrReady();
+        sendStatusMessage("引擎就绪,可以开始说话。");
+    }
+
+    @Override
+    public void onAsrBegin() {
+        super.onAsrBegin();
+        sendStatusMessage("检测到用户说话");
+    }
+
+    @Override
+    public void onAsrEnd() {
+        super.onAsrEnd();
+        speechEndTime = System.currentTimeMillis();
+        sendMessage("检测到用户说话结束");
+    }
+
+    @Override
+    public void onAsrPartialResult(String[] results, RecogResult recogResult) {
+        sendStatusMessage("临时识别结果,结果是“" + results[0] + "”;原始json:" + recogResult.getOrigalJson());
+        super.onAsrPartialResult(results, recogResult);
+    }
+
+    @Override
+    public void onAsrFinalResult(String[] results, RecogResult recogResult) {
+        super.onAsrFinalResult(results, recogResult);
+        String message = "识别结束,结果是”" + results[0] + "”";
+        sendStatusMessage(message + "“;原始json:" + recogResult.getOrigalJson());
+        if (speechEndTime > 0) {
+            long diffTime = System.currentTimeMillis() - speechEndTime;
+            message += ";说话结束到识别结束耗时【" + diffTime + "ms】";
+
+        }
+        speechEndTime = 0;
+        sendMessage(message, status, true);
+    }
+
+    @Override
+    public void onAsrFinishError(int errorCode, int subErrorCode, String errorMessage, String descMessage,
+                                 RecogResult recogResult) {
+        super.onAsrFinishError(errorCode, subErrorCode, errorMessage, descMessage, recogResult);
+        String message = "识别错误, 错误码:" + errorCode + " ," + subErrorCode + " ; " + descMessage;
+        sendStatusMessage(message + ";错误消息:" + errorMessage + ";描述信息:" + descMessage);
+        if (speechEndTime > 0) {
+            long diffTime = System.currentTimeMillis() - speechEndTime;
+            message += "。说话结束到识别结束耗时【" + diffTime + "ms】";
+        }
+        speechEndTime = 0;
+        sendMessage(message, status, true);
+        speechEndTime = 0;
+    }
+
+    @Override
+    public void onAsrOnlineNluResult(String nluResult) {
+        super.onAsrOnlineNluResult(nluResult);
+        if (!nluResult.isEmpty()) {
+            sendStatusMessage("原始语义识别结果json:" + nluResult);
+        }
+    }
+
+    @Override
+    public void onAsrFinish(RecogResult recogResult) {
+        super.onAsrFinish(recogResult);
+        sendStatusMessage("识别一段话结束。如果是长语音的情况会继续识别下段话。");
+
+    }
+
+    /**
+     * 长语音识别结束
+     */
+    @Override
+    public void onAsrLongFinish() {
+        super.onAsrLongFinish();
+        sendStatusMessage("长语音识别结束。");
+    }
+
+
+    /**
+     * 使用离线命令词时,有该回调说明离线语法资源加载成功
+     */
+    @Override
+    public void onOfflineLoaded() {
+        sendStatusMessage("【重要】asr.loaded:离线资源加载成功。没有此回调可能离线语法功能不能使用。");
+    }
+
+    /**
+     * 使用离线命令词时,有该回调说明离线语法资源加载成功
+     */
+    @Override
+    public void onOfflineUnLoaded() {
+        sendStatusMessage(" 离线资源卸载成功。");
+    }
+
+    @Override
+    public void onAsrExit() {
+        super.onAsrExit();
+        sendStatusMessage("识别引擎结束并空闲中");
+    }
+
+    private void sendStatusMessage(String message) {
+        sendMessage(message, status);
+    }
+
+    private void sendMessage(String message) {
+        sendMessage(message, WHAT_MESSAGE_STATUS);
+    }
+
+    private void sendMessage(String message, int what) {
+        sendMessage(message, what, false);
+    }
+
+
+    private void sendMessage(String message, int what, boolean highlight) {
+
+
+        if (needTime && what != STATUS_FINISHED) {
+            message += "  ;time=" + System.currentTimeMillis();
+        }
+        if (handler == null){
+            Log.i(TAG, message );
+            return;
+        }
+        Message msg = Message.obtain();
+        msg.what = what;
+        msg.arg1 = status;
+        if (highlight) {
+            msg.arg2 = 1;
+        }
+        msg.obj = message + "\n";
+        handler.sendMessage(msg);
+    }
+}

+ 114 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/RecogEventAdapter.java

@@ -0,0 +1,114 @@
+package com.baidu.android.voicedemo.recognization;
+
+import android.util.Log;
+
+import com.baidu.android.voicedemo.control.ErrorTranslation;
+import com.baidu.speech.EventListener;
+import com.baidu.speech.asr.SpeechConstant;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Created by fujiayi on 2017/6/14.
+ */
+
+public class RecogEventAdapter implements EventListener {
+
+    private static final String TAG = "RecogEventAdapter";
+
+
+    private IRecogListener listener;
+
+    public RecogEventAdapter(IRecogListener listener) {
+        this.listener = listener;
+    }
+
+    protected String currentJson;
+
+    @Override
+    public void onEvent(String name, String params, byte[] data, int offset, int length) {
+        currentJson = params;
+        String logMessage = "name:" + name + "; params:" + params;
+
+        // logcat 中 搜索RecogEventAdapter,即可以看见下面一行的日志
+        Log.i(TAG, logMessage);
+        if (false) { // 可以调试,不需要后续逻辑
+            return;
+        }
+        if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_LOADED)) {
+            listener.onOfflineLoaded();
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_UNLOADED)) {
+            listener.onOfflineUnLoaded();
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_READY)) {
+            // 引擎准备就绪,可以开始说话
+            listener.onAsrReady();
+
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_BEGIN)) {
+            // 检测到用户的已经开始说话
+            listener.onAsrBegin();
+
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_END)) {
+            // 检测到用户的已经停止说话
+            listener.onAsrEnd();
+
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) {
+            RecogResult recogResult = RecogResult.parseJson(params);
+            // 临时识别结果, 长语音模式需要从此消息中取出结果
+            String[] results = recogResult.getResultsRecognition();
+            if (recogResult.isFinalResult()) {
+                listener.onAsrFinalResult(results, recogResult);
+            } else if (recogResult.isPartialResult()) {
+                listener.onAsrPartialResult(results, recogResult);
+            } else if (recogResult.isNluResult()) {
+                listener.onAsrOnlineNluResult(new String(data, offset, length));
+            }
+
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_FINISH)) {
+            // 识别结束, 最终识别结果或可能的错误
+            RecogResult recogResult = RecogResult.parseJson(params);
+            if (recogResult.hasError()) {
+                int errorCode = recogResult.getError();
+                int subErrorCode = recogResult.getSubError();
+                Log.e(TAG, "asr error:" + params);
+                listener.onAsrFinishError(errorCode, subErrorCode, ErrorTranslation.recogError(errorCode), recogResult.getDesc(), recogResult);
+            } else {
+                listener.onAsrFinish(recogResult);
+            }
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_LONG_SPEECH)) { //长语音
+            listener.onAsrLongFinish();// 长语音
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_EXIT)) {
+            listener.onAsrExit();
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_VOLUME)) {
+            // Logger.info(TAG, "asr volume event:" + params);
+            Volume vol = parseVolumeJson(params);
+            listener.onAsrVolume(vol.volumePercent, vol.volume);
+        } else if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_AUDIO)) {
+            if (data.length != length) {
+                Log.e(TAG, "internal error: asr.audio callback data length is not equal to length param");
+            }
+            listener.onAsrAudio(data, offset, length);
+        }
+    }
+
+
+    private Volume parseVolumeJson(String jsonStr) {
+        Volume vol = new Volume();
+        vol.origalJson = jsonStr;
+        try {
+            JSONObject json = new JSONObject(jsonStr);
+            vol.volumePercent = json.getInt("volume-percent");
+            vol.volume = json.getInt("volume");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return vol;
+    }
+
+    private class Volume {
+        private int volumePercent = -1;
+        private int volume = -1;
+        private String origalJson;
+    }
+
+}

+ 134 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/RecogResult.java

@@ -0,0 +1,134 @@
+package com.baidu.android.voicedemo.recognization;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Created by fujiayi on 2017/6/24.
+ */
+public class RecogResult {
+    private static final int ERROR_NONE = 0;
+
+    private String origalJson;
+    private String[] resultsRecognition;
+    private String origalResult;
+    private String sn; // 日志id, 请求有问题请提问带上sn
+    private String desc;
+    private String resultType;
+    private int error = -1;
+    private int subError = -1;
+
+    public static RecogResult parseJson(String jsonStr) {
+        RecogResult result = new RecogResult();
+        result.setOrigalJson(jsonStr);
+        try {
+            JSONObject json = new JSONObject(jsonStr);
+            int error = json.optInt("error");
+            int subError = json.optInt("sub_error");
+            result.setError(error);
+            result.setDesc(json.optString("desc"));
+            result.setResultType(json.optString("result_type"));
+            result.setSubError(subError);
+            if (error == ERROR_NONE) {
+                result.setOrigalResult(json.getString("origin_result"));
+                JSONArray arr = json.optJSONArray("results_recognition");
+                if (arr != null) {
+                    int size = arr.length();
+                    String[] recogs = new String[size];
+                    for (int i = 0; i < size; i++) {
+                        recogs[i] = arr.getString(i);
+                    }
+                    result.setResultsRecognition(recogs);
+                }
+
+
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        return result;
+    }
+
+    public boolean hasError() {
+        return error != ERROR_NONE;
+    }
+
+    public boolean isFinalResult() {
+        return "final_result".equals(resultType);
+    }
+
+
+    public boolean isPartialResult() {
+        return "partial_result".equals(resultType);
+    }
+
+    public boolean isNluResult() {
+        return "nlu_result".equals(resultType);
+    }
+
+    public String getOrigalJson() {
+        return origalJson;
+    }
+
+    public void setOrigalJson(String origalJson) {
+        this.origalJson = origalJson;
+    }
+
+    public String[] getResultsRecognition() {
+        return resultsRecognition;
+    }
+
+    public void setResultsRecognition(String[] resultsRecognition) {
+        this.resultsRecognition = resultsRecognition;
+    }
+
+    public String getSn() {
+        return sn;
+    }
+
+    public void setSn(String sn) {
+        this.sn = sn;
+    }
+
+    public int getError() {
+        return error;
+    }
+
+    public void setError(int error) {
+        this.error = error;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public String getOrigalResult() {
+        return origalResult;
+    }
+
+    public void setOrigalResult(String origalResult) {
+        this.origalResult = origalResult;
+    }
+
+    public String getResultType() {
+        return resultType;
+    }
+
+    public void setResultType(String resultType) {
+        this.resultType = resultType;
+    }
+
+    public int getSubError() {
+        return subError;
+    }
+
+    public void setSubError(int subError) {
+        this.subError = subError;
+    }
+}

+ 101 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/StatusRecogListener.java

@@ -0,0 +1,101 @@
+package com.baidu.android.voicedemo.recognization;
+
+/**
+ * Created by fujiayi on 2017/6/14.
+ */
+
+import android.util.Log;
+
+public class StatusRecogListener implements IRecogListener, IStatus {
+
+    private static final String TAG = "StatusRecogListener";
+
+    /**
+     * 识别的引擎当前的状态
+     */
+    protected int status = STATUS_NONE;
+
+    @Override
+    public void onAsrReady() {
+        status = STATUS_READY;
+    }
+
+    @Override
+    public void onAsrBegin() {
+        status = STATUS_SPEAKING;
+    }
+
+    @Override
+    public void onAsrEnd() {
+        status = STATUS_RECOGNITION;
+    }
+
+    @Override
+    public void onAsrPartialResult(String[] results, RecogResult recogResult) {
+
+
+    }
+
+    @Override
+    public void onAsrFinalResult(String[] results, RecogResult recogResult) {
+        status = STATUS_FINISHED;
+    }
+
+    @Override
+    public void onAsrFinish(RecogResult recogResult) {
+        status = STATUS_FINISHED;
+    }
+
+
+    @Override
+    public void onAsrFinishError(int errorCode, int subErrorCode, String errorMessage, String descMessage,
+                                 RecogResult recogResult) {
+        status = STATUS_FINISHED;
+    }
+
+    /**
+     * 长语音识别结束
+     */
+    @Override
+    public void onAsrLongFinish() {
+        status = STATUS_FINISHED;
+    }
+
+    @Override
+    public void onAsrVolume(int volumePercent, int volume) {
+        Log.i(TAG, "音量百分比" + volumePercent + " ; 音量" + volume);
+    }
+
+    @Override
+    public void onAsrAudio(byte[] data, int offset, int length) {
+        if (offset != 0 || data.length != length) {
+            byte[] actualData = new byte[length];
+            System.arraycopy(data, 0, actualData, 0, length);
+            data = actualData;
+        }
+
+        Log.i(TAG, "音频数据回调, length:" + data.length);
+    }
+
+    @Override
+    public void onAsrExit() {
+        status = STATUS_NONE;
+    }
+
+    @Override
+    public void onAsrOnlineNluResult(String nluResult) {
+        status = STATUS_FINISHED;
+    }
+
+    @Override
+    public void onOfflineLoaded() {
+
+    }
+
+    @Override
+    public void onOfflineUnLoaded() {
+
+    }
+
+
+}

+ 37 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/all/AllRecogParams.java

@@ -0,0 +1,37 @@
+package com.baidu.android.voicedemo.recognization.all;
+
+import android.app.Activity;
+
+import com.baidu.android.voicedemo.recognization.CommonRecogParams;
+import com.baidu.speech.asr.SpeechConstant;
+
+import java.util.Arrays;
+
+/**
+ * Created by fujiayi on 2017/6/24.
+ */
+
+public class AllRecogParams extends CommonRecogParams {
+
+
+    private static final String TAG = "NluRecogParams";
+
+    public AllRecogParams(Activity context) {
+        super(context);
+        stringParams.addAll(Arrays.asList(
+                SpeechConstant.NLU,
+                "_language",
+                "_model"));
+
+        intParams.addAll(Arrays.asList(
+                SpeechConstant.DECODER,
+                SpeechConstant.PROP));
+
+        boolParams.addAll(Arrays.asList(SpeechConstant.DISABLE_PUNCTUATION, "_nlu_online"));
+
+        // copyOfflineResource(context);
+    }
+
+
+
+}

+ 72 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/inputstream/FileAudioInputStream.java

@@ -0,0 +1,72 @@
+package com.baidu.android.voicedemo.recognization.inputstream;
+
+import android.util.Log;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Created by fujiayi on 2017/11/27.
+ * <p>
+ * 解决大文件的输入问题。
+ */
+
+public class FileAudioInputStream extends InputStream {
+
+    private InputStream in;
+
+    private long nextSleepTime = -1;
+
+    private long totalSleepMs = 0;
+
+    private static final String TAG = "FileAudioInputStream";
+
+    public FileAudioInputStream(String file) throws FileNotFoundException {
+        in = new FileInputStream(file);
+    }
+
+    public FileAudioInputStream(InputStream in) {
+        this.in = in;
+    }
+
+    @Override
+    public int read() throws IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {
+        int bytePerMs = 16000 * 2 / 1000;
+        int count = bytePerMs * 20 ; // 10ms 音频数据
+        if (byteCount < count){
+            count = byteCount;
+        }
+        if (nextSleepTime > 0){
+            try {
+                long sleepMs = nextSleepTime - System.currentTimeMillis() ;
+                if (sleepMs > 0){
+                    Log.i(TAG, "will sleep "+ sleepMs);
+                    Thread.sleep(sleepMs);
+                    totalSleepMs += sleepMs;
+                }
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+        int r = in.read(buffer, byteOffset,  count);
+
+        nextSleepTime = System.currentTimeMillis() +  r/bytePerMs;
+        return r;
+    }
+
+    @Override
+    public void close() throws IOException {
+        super.close();
+        Log.i(TAG, "time sleeped "+ totalSleepMs);
+        if (null != in) {
+            in.close();
+        }
+    }
+}

+ 67 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/inputstream/InFileStream.java

@@ -0,0 +1,67 @@
+package com.baidu.android.voicedemo.recognization.inputstream;
+
+import android.app.Activity;
+import android.util.Log;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Created by fujiayi on 2017/6/20.
+ */
+
+public class InFileStream {
+
+    private static Activity context;
+
+    private static final String TAG = "InFileStream";
+
+    public static void setContext(Activity context) {
+        InFileStream.context = context;
+    }
+
+    private static String filename;
+
+    private static InputStream is;
+
+    public static void reset() {
+        filename = null;
+        is = null;
+    }
+
+    public static void setFileName(String filename) {
+        InFileStream.filename = filename;
+    }
+
+    public static void setInputStream(InputStream is2) {
+        is = is2;
+    }
+
+    public static InputStream create16kStream() {
+        if (is != null) {
+            return new FileAudioInputStream(is);
+        } else if (filename != null) {
+            try {
+                return new FileAudioInputStream(filename);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+        } else {
+            return new FileAudioInputStream(createFileStream());
+        }
+        return null;
+    }
+
+    private static InputStream createFileStream() {
+        InputStream res = null;
+        try {
+            InputStream is = context.getAssets().open("outfile.pcm");
+            Log.i(TAG, "create input stream ok " + is.available());
+            res = new FileAudioInputStream(is);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return res;
+    }
+}

+ 95 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/inputstream/MyMicrophoneInputStream.java

@@ -0,0 +1,95 @@
+package com.baidu.android.voicedemo.recognization.inputstream;
+
+import android.media.AudioFormat;
+import android.media.AudioRecord;
+import android.media.MediaRecorder;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Created by fujiayi on 2017/11/27.
+ */
+
+public class MyMicrophoneInputStream extends InputStream {
+    private static AudioRecord audioRecord;
+
+    private static MyMicrophoneInputStream is;
+
+    private boolean isStarted = false;
+
+    private static final String TAG = "MyMicrophoneInputStream";
+
+    public MyMicrophoneInputStream() {
+
+        if (audioRecord == null) {
+            int bufferSize = AudioRecord.getMinBufferSize(16000,
+                    AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT) * 16;
+            audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
+                    16000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
+        }
+
+
+    }
+
+    public static MyMicrophoneInputStream getInstance() {
+
+        if (is == null) {
+            synchronized (MyMicrophoneInputStream.class) {
+                if (is == null) {
+                    is = new MyMicrophoneInputStream();
+                }
+            }
+        }
+        return is;
+    }
+
+    public void start() {
+        Log.i(TAG, " MyMicrophoneInputStream start recoding!");
+        try {
+            if (audioRecord == null
+                    || audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
+                throw new IllegalStateException(
+                        "startRecording() called on an uninitialized AudioRecord." + (audioRecord == null));
+            }
+            audioRecord.startRecording();
+        }catch(Exception e){
+            Log.e(TAG,e.getClass().getSimpleName(),e);
+        }
+        Log.i(TAG, " MyMicrophoneInputStream start recoding finished");
+    }
+
+    @Override
+    public int read() throws IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int read(@NonNull byte[] b, int off, int len) throws IOException {
+        if (!isStarted) {
+            start(); // 建议在CALLBACK_EVENT_ASR_READY事件中调用。
+            isStarted = true;
+        }
+        try{
+            int count = audioRecord.read(b, off, len);
+            // Log.i(TAG, " MyMicrophoneInputStream read count:" + count);
+            return count;
+        }catch (Exception e){
+            Log.e(TAG, e.getClass().getSimpleName(),e);
+            throw e;
+        }
+
+    }
+
+    @Override
+    public void close() throws IOException {
+        Log.i(TAG, " MyMicrophoneInputStream close");
+        if (audioRecord != null) {
+            audioRecord.stop();
+            // audioRecord.release(); 程序结束别忘记自行释放
+            isStarted = false;
+        }
+    }
+}

+ 53 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/nlu/NluRecogParams.java

@@ -0,0 +1,53 @@
+package com.baidu.android.voicedemo.recognization.nlu;
+
+import android.app.Activity;
+import android.content.SharedPreferences;
+
+import com.baidu.android.voicedemo.recognization.CommonRecogParams;
+import com.baidu.android.voicedemo.recognization.offline.OfflineRecogParams;
+import com.baidu.speech.asr.SpeechConstant;
+
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * Created by fujiayi on 2017/6/24.
+ */
+
+public class NluRecogParams extends CommonRecogParams {
+
+
+    private static final String TAG = "NluRecogParams";
+
+    public NluRecogParams(Activity context) {
+        super(context);
+        stringParams.addAll(Arrays.asList(SpeechConstant.NLU));
+
+        intParams.addAll(Arrays.asList(SpeechConstant.DECODER, SpeechConstant.PROP));
+
+        boolParams.addAll(Arrays.asList("_nlu_online"));
+
+        // copyOfflineResource(context);
+    }
+
+    public Map<String, Object> fetch(SharedPreferences sp) {
+
+        Map<String, Object> map = super.fetch(sp);
+        if (sp.getBoolean("_grammar", false)) {
+            Map<String, Object> offlineParams = OfflineRecogParams.fetchOfflineParams();
+            map.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH,
+                    offlineParams.get(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH));
+
+        }
+        if (sp.getBoolean("_slot_data", false)) {
+            map.putAll(OfflineRecogParams.fetchSlotDataParam());
+        }
+        if (sp.getBoolean("_nlu_online", false)) {
+            map.put("_model", "search");
+        }
+        return map;
+
+    }
+
+
+}

+ 59 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/offline/OfflineRecogParams.java

@@ -0,0 +1,59 @@
+package com.baidu.android.voicedemo.recognization.offline;
+
+import android.app.Activity;
+import android.content.SharedPreferences;
+
+import com.baidu.android.voicedemo.recognization.CommonRecogParams;
+import com.baidu.speech.asr.SpeechConstant;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by fujiayi on 2017/6/13.
+ */
+
+public class OfflineRecogParams extends CommonRecogParams {
+
+    private static final String TAG = "OnlineRecogParams";
+
+    public OfflineRecogParams(Activity context) {
+        super(context);
+    }
+
+
+    public Map<String, Object> fetch(SharedPreferences sp) {
+
+        Map<String, Object> map = super.fetch(sp);
+        map.put(SpeechConstant.DECODER, 2);
+        map.remove(SpeechConstant.PID); // 去除pid,只支持中文
+        return map;
+
+    }
+
+    public static Map<String, Object> fetchOfflineParams() {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put(SpeechConstant.DECODER, 2);
+        map.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets:///baidu_speech_grammar.bsg");
+        map.putAll(fetchSlotDataParam());
+        return map;
+    }
+
+    public static Map<String, Object> fetchSlotDataParam() {
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            JSONObject json = new JSONObject();
+            json.put("name", new JSONArray().put("妈妈").put("老伍"))
+                    .put("appname", new JSONArray().put("手百").put("度秘"));
+            map.put(SpeechConstant.SLOT_DATA, json);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+}

+ 34 - 0
o2android/app/src/main/java/com/baidu/android/voicedemo/recognization/online/OnlineRecogParams.java

@@ -0,0 +1,34 @@
+package com.baidu.android.voicedemo.recognization.online;
+
+import android.app.Activity;
+
+import com.baidu.android.voicedemo.recognization.CommonRecogParams;
+import com.baidu.speech.asr.SpeechConstant;
+
+import java.util.Arrays;
+
+/**
+ * Created by fujiayi on 2017/6/13.
+ */
+
+public class OnlineRecogParams extends CommonRecogParams {
+
+
+    private static final String TAG = "OnlineRecogParams";
+
+    public OnlineRecogParams(Activity context) {
+        super(context);
+
+        stringParams.addAll(Arrays.asList(
+                "_language", // 用于生成PID参数
+                "_model" // 用于生成PID参数
+        ));
+
+        intParams.addAll(Arrays.asList(SpeechConstant.PROP));
+
+        boolParams.addAll(Arrays.asList(SpeechConstant.DISABLE_PUNCTUATION));
+
+    }
+
+
+}

+ 364 - 0
o2android/app/src/main/java/com/bigkoo/convenientbanner/ConvenientBanner.java

@@ -0,0 +1,364 @@
+package com.bigkoo.convenientbanner;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Build;
+import android.support.v4.view.ViewPager;
+import android.support.v4.view.ViewPager.PageTransformer;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+
+import com.bigkoo.convenientbanner.adapter.CBPageAdapter;
+import com.bigkoo.convenientbanner.holder.CBViewHolderCreator;
+import com.bigkoo.convenientbanner.listener.CBPageChangeListener;
+import com.bigkoo.convenientbanner.listener.OnItemClickListener;
+import com.bigkoo.convenientbanner.transformer.ScaleYTransformer;
+import com.bigkoo.convenientbanner.view.CBLoopViewPager;
+
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 页面翻转控件,极方便的广告栏
+ * 支持无限循环,自动翻页,翻页特效
+ * @author Sai 支持自动翻页
+ */
+public class ConvenientBanner<T> extends LinearLayout {
+    private List<T> mDatas;
+    private int[] page_indicatorId;
+    private ArrayList<ImageView> mPointViews = new ArrayList<ImageView>();
+    private CBPageChangeListener pageChangeListener;
+    private ViewPager.OnPageChangeListener onPageChangeListener;
+    private CBPageAdapter pageAdapter;
+    private CBLoopViewPager viewPager;
+    private ViewPagerScroller scroller;
+    private ViewGroup loPageTurningPoint;
+    private long autoTurningTime;
+    private boolean turning;
+    private boolean canTurn = false;
+    private boolean manualPageable = true;
+    private boolean canLoop = true;
+    private boolean coverMode = false;
+    public enum PageIndicatorAlign{
+        ALIGN_PARENT_LEFT,ALIGN_PARENT_RIGHT,CENTER_HORIZONTAL
+    }
+    private AdSwitchTask adSwitchTask ;
+
+    public ConvenientBanner(Context context) {
+        super(context);
+        init(context);
+    }
+
+    public ConvenientBanner(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ConvenientBanner);
+        canLoop = a.getBoolean(R.styleable.ConvenientBanner_canLoop,true);
+        coverMode = a.getBoolean(R.styleable.ConvenientBanner_coverMode,false);
+        a.recycle();
+        init(context);
+    }
+
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    public ConvenientBanner(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ConvenientBanner);
+        canLoop = a.getBoolean(R.styleable.ConvenientBanner_canLoop,true);
+        coverMode = a.getBoolean(R.styleable.ConvenientBanner_coverMode,false);
+        a.recycle();
+        init(context);
+    }
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public ConvenientBanner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ConvenientBanner);
+        canLoop = a.getBoolean(R.styleable.ConvenientBanner_canLoop,true);
+        coverMode = a.getBoolean(R.styleable.ConvenientBanner_coverMode,false);
+        a.recycle();
+        init(context);
+    }
+
+    private void init(Context context) {
+        View hView;
+        if (coverMode){
+            hView = LayoutInflater.from(context).inflate(
+                    R.layout.include_viewpager_cover_mode, this, true);
+        }else {
+            hView = LayoutInflater.from(context).inflate(
+                    R.layout.include_viewpager, this, true);
+        }
+        viewPager = (CBLoopViewPager) hView.findViewById(R.id.cbLoopViewPager);
+        loPageTurningPoint = (ViewGroup) hView
+                .findViewById(R.id.loPageTurningPoint);
+        initViewPagerScroll();
+
+        adSwitchTask = new AdSwitchTask(this);
+    }
+
+    static class AdSwitchTask implements Runnable {
+
+        private final WeakReference<ConvenientBanner> reference;
+
+        AdSwitchTask(ConvenientBanner convenientBanner) {
+            this.reference = new WeakReference<ConvenientBanner>(convenientBanner);
+        }
+
+        @Override
+        public void run() {
+            ConvenientBanner convenientBanner = reference.get();
+
+            if(convenientBanner != null){
+                if (convenientBanner.viewPager != null && convenientBanner.turning) {
+                    int page = convenientBanner.viewPager.getCurrentItem() + 1;
+                    convenientBanner.viewPager.setCurrentItem(page);
+                    convenientBanner.postDelayed(convenientBanner.adSwitchTask, convenientBanner.autoTurningTime);
+                }
+            }
+        }
+    }
+
+    public ConvenientBanner setPages(CBViewHolderCreator holderCreator,List<T> datas){
+        this.mDatas = datas;
+        if (coverMode){
+            viewPager.setPageTransformer(false,new ScaleYTransformer());
+        }
+        pageAdapter = new CBPageAdapter(holderCreator,mDatas);
+        viewPager.setAdapter(pageAdapter,canLoop);
+
+        if (page_indicatorId != null)
+            setPageIndicator(page_indicatorId);
+        return this;
+    }
+
+    /**
+     * 通知数据变化
+     * 如果只是增加数据建议使用 notifyDataSetAdd()
+     */
+    public void notifyDataSetChanged(){
+        viewPager.getAdapter().notifyDataSetChanged();
+        if (page_indicatorId != null)
+            setPageIndicator(page_indicatorId);
+    }
+
+    /**
+     * 设置底部指示器是否可见
+     *
+     * @param visible
+     */
+    public ConvenientBanner setPointViewVisible(boolean visible) {
+        loPageTurningPoint.setVisibility(visible ? View.VISIBLE : View.GONE);
+        return this;
+    }
+
+    /**
+     * 底部指示器资源图片
+     *
+     * @param page_indicatorId
+     */
+    public ConvenientBanner setPageIndicator(int[] page_indicatorId) {
+        loPageTurningPoint.removeAllViews();
+        mPointViews.clear();
+        this.page_indicatorId = page_indicatorId;
+        if(mDatas==null)return this;
+        for (int count = 0; count < mDatas.size(); count++) {
+            // 翻页指示的点
+            ImageView pointView = new ImageView(getContext());
+            pointView.setPadding(5, 0, 5, 0);
+            if (mPointViews.isEmpty())
+                pointView.setImageResource(page_indicatorId[1]);
+            else
+                pointView.setImageResource(page_indicatorId[0]);
+            mPointViews.add(pointView);
+            loPageTurningPoint.addView(pointView);
+        }
+        pageChangeListener = new CBPageChangeListener(mPointViews,
+                page_indicatorId);
+        viewPager.setOnPageChangeListener(pageChangeListener);
+        pageChangeListener.onPageSelected(viewPager.getRealItem());
+        if(onPageChangeListener != null)pageChangeListener.setOnPageChangeListener(onPageChangeListener);
+
+        return this;
+    }
+
+    /**
+     * 指示器的方向
+     * @param align  三个方向:居左 (RelativeLayout.ALIGN_PARENT_LEFT),居中 (RelativeLayout.CENTER_HORIZONTAL),居右 (RelativeLayout.ALIGN_PARENT_RIGHT)
+     * @return
+     */
+    public ConvenientBanner setPageIndicatorAlign(PageIndicatorAlign align) {
+        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) loPageTurningPoint.getLayoutParams();
+        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, align == PageIndicatorAlign.ALIGN_PARENT_LEFT ? RelativeLayout.TRUE : 0);
+        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, align == PageIndicatorAlign.ALIGN_PARENT_RIGHT ? RelativeLayout.TRUE : 0);
+        layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, align == PageIndicatorAlign.CENTER_HORIZONTAL ? RelativeLayout.TRUE : 0);
+        loPageTurningPoint.setLayoutParams(layoutParams);
+        return this;
+    }
+
+    /***
+     * 是否开启了翻页
+     * @return
+     */
+    public boolean isTurning() {
+        return turning;
+    }
+
+    /***
+     * 开始翻页
+     * @param autoTurningTime 自动翻页时间
+     * @return
+     */
+    public ConvenientBanner startTurning(long autoTurningTime) {
+        //如果是正在翻页的话先停掉
+        if(turning){
+            stopTurning();
+        }
+        //设置可以翻页并开启翻页
+        canTurn = true;
+        this.autoTurningTime = autoTurningTime;
+        turning = true;
+        postDelayed(adSwitchTask, autoTurningTime);
+        return this;
+    }
+
+    public void stopTurning() {
+        turning = false;
+        removeCallbacks(adSwitchTask);
+    }
+
+    /**
+     * 自定义翻页动画效果
+     *
+     * @param transformer
+     * @return
+     */
+    public ConvenientBanner setPageTransformer(PageTransformer transformer) {
+        viewPager.setPageTransformer(true, transformer);
+        return this;
+    }
+
+
+    /**
+     * 设置ViewPager的滑动速度
+     * */
+    private void initViewPagerScroll() {
+        try {
+            Field mScroller = null;
+            mScroller = ViewPager.class.getDeclaredField("mScroller");
+            mScroller.setAccessible(true);
+            scroller = new ViewPagerScroller(
+                    viewPager.getContext());
+            mScroller.set(viewPager, scroller);
+
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalArgumentException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public boolean isManualPageable() {
+        return viewPager.isCanScroll();
+    }
+
+    public void setManualPageable(boolean manualPageable) {
+        viewPager.setCanScroll(manualPageable);
+    }
+
+    //触碰控件的时候,翻页应该停止,离开的时候如果之前是开启了翻页的话则重新启动翻页
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+
+        int action = ev.getAction();
+        if (action == MotionEvent.ACTION_UP||action == MotionEvent.ACTION_CANCEL||action == MotionEvent.ACTION_OUTSIDE) {
+            // 开始翻页
+            if (canTurn)startTurning(autoTurningTime);
+        } else if (action == MotionEvent.ACTION_DOWN) {
+            // 停止翻页
+            if (canTurn)stopTurning();
+        }
+        return super.dispatchTouchEvent(ev);
+    }
+
+    //获取当前的页面index
+    public int getCurrentItem(){
+        if (viewPager!=null) {
+            return viewPager.getRealItem();
+        }
+        return -1;
+    }
+    //设置当前的页面index
+    public void setcurrentitem(int index){
+        if (viewPager!=null) {
+            viewPager.setCurrentItem(index);
+        }
+    }
+
+    public ViewPager.OnPageChangeListener getOnPageChangeListener() {
+        return onPageChangeListener;
+    }
+
+    /**
+     * 设置翻页监听器
+     * @param onPageChangeListener
+     * @return
+     */
+    public ConvenientBanner setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
+        this.onPageChangeListener = onPageChangeListener;
+        //如果有默认的监听器(即是使用了默认的翻页指示器)则把用户设置的依附到默认的上面,否则就直接设置
+        if(pageChangeListener != null)pageChangeListener.setOnPageChangeListener(onPageChangeListener);
+        else viewPager.setOnPageChangeListener(onPageChangeListener);
+        return this;
+    }
+
+    public boolean isCanLoop() {
+        return viewPager.isCanLoop();
+    }
+
+    /**
+     * 监听item点击
+     * @param onItemClickListener
+     */
+    public ConvenientBanner setOnItemClickListener(OnItemClickListener onItemClickListener) {
+        if (onItemClickListener == null) {
+            viewPager.setOnItemClickListener(null);
+            return this;
+        }
+        viewPager.setOnItemClickListener(onItemClickListener);
+        return this;
+    }
+
+    /**
+     * 设置ViewPager的滚动速度
+     * @param scrollDuration
+     */
+    public void setScrollDuration(int scrollDuration){
+        scroller.setScrollDuration(scrollDuration);
+    }
+
+    public int getScrollDuration() {
+        return scroller.getScrollDuration();
+    }
+
+    public CBLoopViewPager getViewPager() {
+        return viewPager;
+    }
+
+    public void setCanLoop(boolean canLoop) {
+        this.canLoop = canLoop;
+        viewPager.setCanLoop(canLoop);
+    }
+
+}

+ 49 - 0
o2android/app/src/main/java/com/bigkoo/convenientbanner/ViewPagerScroller.java

@@ -0,0 +1,49 @@
+package com.bigkoo.convenientbanner;
+
+import android.content.Context;
+import android.view.animation.Interpolator;
+import android.widget.Scroller;
+
+public class ViewPagerScroller extends Scroller {
+	private int mScrollDuration = 800;// 滑动速度,值越大滑动越慢,滑动太快会使3d效果不明显
+	private boolean zero;
+
+	public ViewPagerScroller(Context context) {
+		super(context);
+	}
+
+	public ViewPagerScroller(Context context, Interpolator interpolator) {
+		super(context, interpolator);
+	}
+
+	public ViewPagerScroller(Context context, Interpolator interpolator,
+			boolean flywheel) {
+		super(context, interpolator, flywheel);
+	}
+
+	@Override
+	public void startScroll(int startX, int startY, int dx, int dy, int duration) {
+		super.startScroll(startX, startY, dx, dy, zero ? 0 : mScrollDuration);
+	}
+
+	@Override
+	public void startScroll(int startX, int startY, int dx, int dy) {
+		super.startScroll(startX, startY, dx, dy, zero ? 0 : mScrollDuration);
+	}
+
+	public int getScrollDuration() {
+		return mScrollDuration;
+	}
+
+	public void setScrollDuration(int scrollDuration) {
+		this.mScrollDuration = scrollDuration;
+	}
+
+	public boolean isZero() {
+		return zero;
+	}
+
+	public void setZero(boolean zero) {
+		this.zero = zero;
+	}
+}

+ 107 - 0
o2android/app/src/main/java/com/bigkoo/convenientbanner/adapter/CBPageAdapter.java

@@ -0,0 +1,107 @@
+package com.bigkoo.convenientbanner.adapter;
+
+import android.support.v4.view.PagerAdapter;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.bigkoo.convenientbanner.holder.CBViewHolderCreator;
+import com.bigkoo.convenientbanner.holder.Holder;
+import com.bigkoo.convenientbanner.view.CBLoopViewPager;
+
+import net.zoneland.x.bpm.mobile.v1.zoneXBPM.R;
+
+import java.util.List;
+
+/**
+ * Created by Sai on 15/7/29.
+ */
+public class CBPageAdapter<T> extends PagerAdapter {
+    protected List<T> mDatas;
+    protected CBViewHolderCreator holderCreator;
+//    private View.OnClickListener onItemClickListener;
+    private boolean canLoop = true;
+    private CBLoopViewPager viewPager;
+    private final int MULTIPLE_COUNT = 300;
+
+    public int toRealPosition(int position) {
+        int realCount = getRealCount();
+        if (realCount == 0)
+            return 0;
+        int realPosition = position % realCount;
+        return realPosition;
+    }
+
+    @Override
+    public int getCount() {
+        return canLoop ? getRealCount()*MULTIPLE_COUNT : getRealCount();
+    }
+
+    public int getRealCount() {
+        return mDatas == null ? 0 : mDatas.size();
+    }
+
+    @Override
+    public Object instantiateItem(ViewGroup container, int position) {
+        int realPosition = toRealPosition(position);
+
+        View view = getView(realPosition, null, container);
+//        if(onItemClickListener != null) view.setOnClickListener(onItemClickListener);
+        container.addView(view);
+        return view;
+    }
+
+    @Override
+    public void destroyItem(ViewGroup container, int position, Object object) {
+        View view = (View) object;
+        container.removeView(view);
+    }
+
+    @Override
+    public void finishUpdate(ViewGroup container) {
+        int position = viewPager.getCurrentItem();
+        if (position == 0) {
+            position = viewPager.getFristItem();
+        } else if (position == getCount() - 1) {
+            position = viewPager.getLastItem();
+        }
+        try {
+            viewPager.setCurrentItem(position, false);
+        }catch (IllegalStateException e){}
+    }
+
+    @Override
+    public boolean isViewFromObject(View view, Object object) {
+        return view == object;
+    }
+
+    public void setCanLoop(boolean canLoop) {
+        this.canLoop = canLoop;
+    }
+
+    public void setViewPager(CBLoopViewPager viewPager) {
+        this.viewPager = viewPager;
+    }
+
+    public CBPageAdapter(CBViewHolderCreator holderCreator, List<T> datas) {
+        this.holderCreator = holderCreator;
+        this.mDatas = datas;
+    }
+
+    public View getView(int position, View view, ViewGroup container) {
+        Holder holder = null;
+        if (view == null) {
+            holder = (Holder) holderCreator.createHolder();
+            view = holder.createView(container.getContext());
+            view.setTag(R.id.cb_item_tag, holder);
+        } else {
+            holder = (Holder<T>) view.getTag(R.id.cb_item_tag);
+        }
+        if (mDatas != null && !mDatas.isEmpty())
+            holder.UpdateUI(container.getContext(), position, mDatas.get(position));
+        return view;
+    }
+
+//    public void setOnItemClickListener(View.OnClickListener onItemClickListener) {
+//        this.onItemClickListener = onItemClickListener;
+//    }
+}

+ 10 - 0
o2android/app/src/main/java/com/bigkoo/convenientbanner/holder/CBViewHolderCreator.java

@@ -0,0 +1,10 @@
+package com.bigkoo.convenientbanner.holder;
+/**
+ * @ClassName :  ViewHolderCreator 
+ * @Description : 
+ * @Author Sai
+ * @Date 2014年11月30日 下午3:29:34
+ */
+public interface CBViewHolderCreator<Holder> {
+	public Holder createHolder();
+}

+ 14 - 0
o2android/app/src/main/java/com/bigkoo/convenientbanner/holder/Holder.java

@@ -0,0 +1,14 @@
+package com.bigkoo.convenientbanner.holder;
+
+/**
+ * Created by Sai on 15/12/14.
+ * @param <T> 任何你指定的对象
+ */
+
+import android.content.Context;
+import android.view.View;
+
+public interface Holder<T>{
+    View createView(Context context);
+    void UpdateUI(Context context,int position,T data);
+}

+ 45 - 0
o2android/app/src/main/java/com/bigkoo/convenientbanner/listener/CBPageChangeListener.java

@@ -0,0 +1,45 @@
+package com.bigkoo.convenientbanner.listener;
+
+import android.support.v4.view.ViewPager;
+import android.widget.ImageView;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Sai on 15/7/29.
+ * 翻页指示器适配器
+ */
+public class CBPageChangeListener implements ViewPager.OnPageChangeListener {
+    private ArrayList<ImageView> pointViews;
+    private int[] page_indicatorId;
+    private ViewPager.OnPageChangeListener onPageChangeListener;
+    public CBPageChangeListener(ArrayList<ImageView> pointViews,int page_indicatorId[]){
+        this.pointViews=pointViews;
+        this.page_indicatorId = page_indicatorId;
+    }
+    @Override
+    public void onPageScrollStateChanged(int state) {
+        if(onPageChangeListener != null)onPageChangeListener.onPageScrollStateChanged(state);
+    }
+
+    @Override
+    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+        if(onPageChangeListener != null)onPageChangeListener.onPageScrolled(position,positionOffset,positionOffsetPixels);
+    }
+
+    @Override
+    public void onPageSelected(int index) {
+        for (int i = 0; i < pointViews.size(); i++) {
+            pointViews.get(index).setImageResource(page_indicatorId[1]);
+            if (index != i) {
+                pointViews.get(i).setImageResource(page_indicatorId[0]);
+            }
+        }
+        if(onPageChangeListener != null)onPageChangeListener.onPageSelected(index);
+
+    }
+
+    public void setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
+        this.onPageChangeListener = onPageChangeListener;
+    }
+}

+ 8 - 0
o2android/app/src/main/java/com/bigkoo/convenientbanner/listener/OnItemClickListener.java

@@ -0,0 +1,8 @@
+package com.bigkoo.convenientbanner.listener;
+
+/**
+ * Created by Sai on 15/11/13.
+ */
+public interface OnItemClickListener {
+    public void onItemClick(int position);
+}

+ 26 - 0
o2android/app/src/main/java/com/bigkoo/convenientbanner/transformer/ScaleYTransformer.java

@@ -0,0 +1,26 @@
+package com.bigkoo.convenientbanner.transformer;
+
+import android.support.v4.view.ViewPager;
+import android.view.View;
+
+/**
+ * Created by fancyLou on 2017/12/18.
+ * Copyright © 2017 O2. All rights reserved.
+ */
+
+public class ScaleYTransformer implements ViewPager.PageTransformer {
+    private static final float MIN_SCALE = 0.9F;
+    @Override
+    public void transformPage(View page, float position) {
+        if(position < -1){
+            page.setScaleY(MIN_SCALE);
+        }else if(position<= 1){
+            //
+            float scale = Math.max(MIN_SCALE,1 - Math.abs(position));
+            page.setScaleY(scale);
+
+        }else{
+            page.setScaleY(MIN_SCALE);
+        }
+    }
+}

+ 168 - 0
o2android/app/src/main/java/com/bigkoo/convenientbanner/view/CBLoopViewPager.java

@@ -0,0 +1,168 @@
+package com.bigkoo.convenientbanner.view;
+
+import android.content.Context;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+import com.bigkoo.convenientbanner.adapter.CBPageAdapter;
+import com.bigkoo.convenientbanner.listener.OnItemClickListener;
+
+
+public class CBLoopViewPager extends ViewPager {
+    OnPageChangeListener mOuterPageChangeListener;
+    private OnItemClickListener onItemClickListener;
+    private CBPageAdapter mAdapter;
+
+    private boolean isCanScroll = true;
+    private boolean canLoop = true;
+
+    public void setAdapter(PagerAdapter adapter, boolean canLoop) {
+        mAdapter = (CBPageAdapter) adapter;
+        mAdapter.setCanLoop(canLoop);
+        mAdapter.setViewPager(this);
+        super.setAdapter(mAdapter);
+
+        setCurrentItem(getFristItem(), false);
+    }
+
+    public int getFristItem() {
+        return canLoop ? mAdapter.getRealCount() : 0;
+    }
+
+    public int getLastItem() {
+        return mAdapter.getRealCount() - 1;
+    }
+
+    public boolean isCanScroll() {
+        return isCanScroll;
+    }
+
+    public void setCanScroll(boolean isCanScroll) {
+        this.isCanScroll = isCanScroll;
+    }
+
+    private float oldX = 0, newX = 0;
+    private static final float sens = 5;
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        if (isCanScroll) {
+            if (onItemClickListener != null) {
+                switch (ev.getAction()) {
+                    case MotionEvent.ACTION_DOWN:
+                        oldX = ev.getX();
+                        break;
+
+                    case MotionEvent.ACTION_UP:
+                        newX = ev.getX();
+                        if (Math.abs(oldX - newX) < sens) {
+                            onItemClickListener.onItemClick((getRealItem()));
+                        }
+                        oldX = 0;
+                        newX = 0;
+                        break;
+                }
+            }
+            return super.onTouchEvent(ev);
+        } else
+            return false;
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        if (isCanScroll)
+            return super.onInterceptTouchEvent(ev);
+        else
+            return false;
+    }
+
+    public CBPageAdapter getAdapter() {
+        return mAdapter;
+    }
+
+    public int getRealItem() {
+        return mAdapter != null ? mAdapter.toRealPosition(super.getCurrentItem()) : 0;
+    }
+
+    @Override
+    public void setOnPageChangeListener(OnPageChangeListener listener) {
+        mOuterPageChangeListener = listener;
+    }
+
+
+    public CBLoopViewPager(Context context) {
+        super(context);
+        init();
+    }
+
+    public CBLoopViewPager(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    private void init() {
+        super.setOnPageChangeListener(onPageChangeListener);
+    }
+
+    private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {
+        private float mPreviousPosition = -1;
+
+        @Override
+        public void onPageSelected(int position) {
+            int realPosition = mAdapter.toRealPosition(position);
+            if (mPreviousPosition != realPosition) {
+                mPreviousPosition = realPosition;
+                if (mOuterPageChangeListener != null) {
+                    mOuterPageChangeListener.onPageSelected(realPosition);
+                }
+            }
+        }
+
+        @Override
+        public void onPageScrolled(int position, float positionOffset,
+                                   int positionOffsetPixels) {
+            int realPosition = position;
+
+            if (mOuterPageChangeListener != null) {
+                if (realPosition != mAdapter.getRealCount() - 1) {
+                    mOuterPageChangeListener.onPageScrolled(realPosition,
+                            positionOffset, positionOffsetPixels);
+                } else {
+                    if (positionOffset > .5) {
+                        mOuterPageChangeListener.onPageScrolled(0, 0, 0);
+                    } else {
+                        mOuterPageChangeListener.onPageScrolled(realPosition,
+                                0, 0);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void onPageScrollStateChanged(int state) {
+            if (mOuterPageChangeListener != null) {
+                mOuterPageChangeListener.onPageScrollStateChanged(state);
+            }
+        }
+    };
+
+    public boolean isCanLoop() {
+        return canLoop;
+    }
+
+    public void setCanLoop(boolean canLoop) {
+        this.canLoop = canLoop;
+        if (canLoop == false) {
+            setCurrentItem(getRealItem(), false);
+        }
+        if (mAdapter == null) return;
+        mAdapter.setCanLoop(canLoop);
+        mAdapter.notifyDataSetChanged();
+    }
+
+    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
+        this.onItemClickListener = onItemClickListener;
+    }
+}

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff