Browse Source

first commit

樊春春 3 years ago
commit
496aeb93b1
76 changed files with 3870 additions and 0 deletions
  1. 10 0
      .gitignore
  2. 3 0
      .idea/.gitignore
  3. BIN
      .idea/caches/build_file_checksums.ser
  4. 29 0
      .idea/codeStyles/Project.xml
  5. 6 0
      .idea/compiler.xml
  6. 20 0
      .idea/gradle.xml
  7. 40 0
      .idea/jarRepositories.xml
  8. 52 0
      .idea/misc.xml
  9. 13 0
      .idea/runConfigurations.xml
  10. 1 0
      app/.gitignore
  11. 34 0
      app/build.gradle
  12. BIN
      app/libs/Amap_2DMap_V5.2.0_20170627.jar
  13. BIN
      app/libs/android-async-http-1.4.6.jar
  14. 21 0
      app/proguard-rules.pro
  15. BIN
      app/release/app-release.apk
  16. 1 0
      app/release/output.json
  17. 26 0
      app/src/androidTest/java/com/ahau/againstpestinfo/ExampleInstrumentedTest.java
  18. 75 0
      app/src/main/AndroidManifest.xml
  19. 74 0
      app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/AsyncProcessor.java
  20. 36 0
      app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/HttpCallback.java
  21. 85 0
      app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/HttpHelper.java
  22. 13 0
      app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/ICallback.java
  23. 16 0
      app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/IHttpProcessor.java
  24. 160 0
      app/src/main/java/com/ahau/againstpestinfo/activity/LoginActivity.java
  25. 611 0
      app/src/main/java/com/ahau/againstpestinfo/activity/SearchActivity.java
  26. 78 0
      app/src/main/java/com/ahau/againstpestinfo/adapter/simpleArrayAdapter.java
  27. 46 0
      app/src/main/java/com/ahau/againstpestinfo/base/MyApplication.java
  28. 22 0
      app/src/main/java/com/ahau/againstpestinfo/bean/AreaidBean.java
  29. 20 0
      app/src/main/java/com/ahau/againstpestinfo/bean/ResearchPeopleBean.java
  30. 166 0
      app/src/main/java/com/ahau/againstpestinfo/domain/MyMarkerCluster.java
  31. 64 0
      app/src/main/java/com/ahau/againstpestinfo/domain/PestEnitityList.java
  32. 178 0
      app/src/main/java/com/ahau/againstpestinfo/domain/PestEntity.java
  33. 25 0
      app/src/main/java/com/ahau/againstpestinfo/model/ISearchModel.java
  34. 61 0
      app/src/main/java/com/ahau/againstpestinfo/model/ISearchModelImpl.java
  35. 26 0
      app/src/main/java/com/ahau/againstpestinfo/presenter/BasePresenter.java
  36. 55 0
      app/src/main/java/com/ahau/againstpestinfo/presenter/ISearchPresenter.java
  37. 52 0
      app/src/main/java/com/ahau/againstpestinfo/utils/FileCache.java
  38. 218 0
      app/src/main/java/com/ahau/againstpestinfo/utils/ImageLoaderUtils.java
  39. 70 0
      app/src/main/java/com/ahau/againstpestinfo/utils/LoginUtils.java
  40. 110 0
      app/src/main/java/com/ahau/againstpestinfo/utils/MemoryCache.java
  41. 49 0
      app/src/main/java/com/ahau/againstpestinfo/utils/Settings.java
  42. 12 0
      app/src/main/java/com/ahau/againstpestinfo/utils/URLUtils.java
  43. 423 0
      app/src/main/java/com/ahau/againstpestinfo/utils/Utils.java
  44. 36 0
      app/src/main/java/com/ahau/againstpestinfo/view/BaseActivity.java
  45. 15 0
      app/src/main/java/com/ahau/againstpestinfo/view/ISearchView.java
  46. BIN
      app/src/main/res/drawable-hdpi/marker_cluster_10.png
  47. BIN
      app/src/main/res/drawable-hdpi/marker_cluster_100.png
  48. BIN
      app/src/main/res/drawable-hdpi/marker_cluster_20.png
  49. BIN
      app/src/main/res/drawable-hdpi/marker_cluster_30.png
  50. BIN
      app/src/main/res/drawable-hdpi/marker_cluster_50.png
  51. BIN
      app/src/main/res/drawable-hdpi/password.png
  52. BIN
      app/src/main/res/drawable-hdpi/phone.png
  53. 106 0
      app/src/main/res/layout/activity_login.xml
  54. 364 0
      app/src/main/res/layout/activity_search.xml
  55. 21 0
      app/src/main/res/layout/my_car_cluster_view.xml
  56. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  57. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  58. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  59. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  60. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  61. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  62. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  63. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  64. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  65. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  66. 6 0
      app/src/main/res/values/colors.xml
  67. 3 0
      app/src/main/res/values/strings.xml
  68. 12 0
      app/src/main/res/values/styles.xml
  69. 4 0
      app/src/main/res/xml/network_security_config.xml
  70. 27 0
      build.gradle
  71. 13 0
      gradle.properties
  72. BIN
      gradle/wrapper/gradle-wrapper.jar
  73. 5 0
      gradle/wrapper/gradle-wrapper.properties
  74. 172 0
      gradlew
  75. 84 0
      gradlew.bat
  76. 1 0
      settings.gradle

+ 10 - 0
.gitignore

@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

BIN
.idea/caches/build_file_checksums.ser


+ 29 - 0
.idea/codeStyles/Project.xml

@@ -0,0 +1,29 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <Objective-C-extensions>
+      <file>
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
+      </file>
+      <class>
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
+      </class>
+      <extensions>
+        <pair source="cpp" header="h" fileNamingConvention="NONE" />
+        <pair source="c" header="h" fileNamingConvention="NONE" />
+      </extensions>
+    </Objective-C-extensions>
+  </code_scheme>
+</component>

+ 6 - 0
.idea/compiler.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <bytecodeTargetLevel target="1.8" />
+  </component>
+</project>

+ 20 - 0
.idea/gradle.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="testRunner" value="PLATFORM" />
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+          </set>
+        </option>
+        <option name="resolveModulePerSourceSet" value="false" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 40 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="BintrayJCenter" />
+      <option name="name" value="BintrayJCenter" />
+      <option name="url" value="https://jcenter.bintray.com/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="Google" />
+      <option name="name" value="Google" />
+      <option name="url" value="https://dl.google.com/dl/android/maven2/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="$USER_HOME$/Library/Android/sdk/extras/m2repository" />
+      <option name="name" value="$USER_HOME$/Library/Android/sdk/extras/m2repository" />
+      <option name="url" value="file:$USER_HOME$/Library/Android/sdk/extras/m2repository" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="$USER_HOME$/Library/Android/sdk/extras/android/m2repository" />
+      <option name="name" value="$USER_HOME$/Library/Android/sdk/extras/android/m2repository" />
+      <option name="url" value="file:$USER_HOME$/Library/Android/sdk/extras/android/m2repository/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="$USER_HOME$/Library/Android/sdk/extras/google/m2repository" />
+      <option name="name" value="$USER_HOME$/Library/Android/sdk/extras/google/m2repository" />
+      <option name="url" value="file:$USER_HOME$/Library/Android/sdk/extras/google/m2repository" />
+    </remote-repository>
+  </component>
+</project>

+ 52 - 0
.idea/misc.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="NullableNotNullManager">
+    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
+    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
+    <option name="myNullables">
+      <value>
+        <list size="14">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
+          <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
+          <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
+          <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
+          <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
+          <item index="7" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
+          <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
+          <item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
+          <item index="11" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
+          <item index="12" class="java.lang.String" itemvalue="io.reactivex.annotations.Nullable" />
+          <item index="13" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.Nullable" />
+        </list>
+      </value>
+    </option>
+    <option name="myNotNulls">
+      <value>
+        <list size="13">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
+          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
+          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+          <item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
+          <item index="6" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
+          <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
+          <item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
+          <item index="10" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
+          <item index="11" class="java.lang.String" itemvalue="io.reactivex.annotations.NonNull" />
+          <item index="12" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.NonNull" />
+        </list>
+      </value>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>

+ 13 - 0
.idea/runConfigurations.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>

+ 1 - 0
app/.gitignore

@@ -0,0 +1 @@
+/build

+ 34 - 0
app/build.gradle

@@ -0,0 +1,34 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 28
+    defaultConfig {
+        multiDexEnabled true
+        applicationId "com.ahau.againstpestinfo"
+        minSdkVersion 15
+        targetSdkVersion 28
+        versionCode 1
+        versionName "1.0"
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+dependencies {
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    implementation 'com.android.support:appcompat-v7:28.0.0-alpha3'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    implementation 'org.apache.httpcomponents:httpcore:4.4.10'
+    implementation 'com.google.code.gson:gson:2.8.5'
+    api("cn.qqtheme.framework:WheelPicker:1.1.2") {
+        exclude group: 'com.android.support', module: 'support-v4'
+    }
+
+}

BIN
app/libs/Amap_2DMap_V5.2.0_20170627.jar


BIN
app/libs/android-async-http-1.4.6.jar


+ 21 - 0
app/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# 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 *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

BIN
app/release/app-release.apk


+ 1 - 0
app/release/output.json

@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]

+ 26 - 0
app/src/androidTest/java/com/ahau/againstpestinfo/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.ahau.againstpestinfo;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getTargetContext();
+
+        assertEquals("com.ahau.againstpestinfo", appContext.getPackageName());
+    }
+}

+ 75 - 0
app/src/main/AndroidManifest.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.ahau.againstpestinfo">
+
+	<uses-permission android:name="android.permission.GET_ACCOUNTS" />
+    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
+    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
+    </uses-permission>
+
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
+    </uses-permission>
+    <uses-permission android:name="android.permission.INTERNET" >
+    </uses-permission>
+    <permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
+    <permission android:name="android.permission.WRITE_APN_SETTINGS"></permission>
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
+    </uses-permission>
+    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" >
+    </uses-permission>
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_GPS" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.READ_CONTACTS" />
+    <uses-permission android:name="android.permission.CALL_PHONE" />
+    <uses-permission android:name="android.permission.READ_SMS" />
+    <uses-permission android:name="android.permission.SEND_SMS" />
+    <!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? -->
+    <uses-permission android:name="android.permission.GET_TASKS" />
+    <uses-permission android:name="android.permission.CAMERA" >
+    </uses-permission>
+    <uses-permission android:name="android.permission.RECORD_AUDIO" >
+    </uses-permission>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
+    </uses-permission>
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
+    <permission android:name="android.permission.WRITE_SETTINGS" />
+    <!-- 来电消音 -->
+    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
+    </uses-permission>
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+
+    <application
+    	android:name=".base.MyApplication"
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme"
+
+        android:usesCleartextTraffic="true"
+        android:networkSecurityConfig="@xml/network_security_config">
+        <meta-data
+            android:name="com.amap.api.v2.apikey"
+            android:value="a8ad41a1f80f8885057acc9c99144e06"/>
+
+        <activity android:name=".activity.LoginActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".activity.SearchActivity" />
+
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
+    </application>
+
+</manifest>

+ 74 - 0
app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/AsyncProcessor.java

@@ -0,0 +1,74 @@
+package com.ahau.againstpestinfo.HttpProcessor;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.loopj.android.http.AsyncHttpClient;
+import com.loopj.android.http.AsyncHttpResponseHandler;
+
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+
+import java.util.Map;
+
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/6
+ */
+
+public class AsyncProcessor implements IHttpProcessor {
+
+    public static final String TAG = "AsyncProcessor";
+
+    Context  mContext;
+    @Override
+    public void post(String url, Map<String, Object> params, final ICallback callback) {
+
+        // 创建异步请求端对象
+        AsyncHttpClient client = new AsyncHttpClient();
+
+        // 发送get请求对象
+        client.post(mContext,url, (HttpEntity) params,"application/json", new AsyncHttpResponseHandler() {
+            @Override
+            public void onSuccess(int i, Header[] headers, byte[] bytes) {
+                String result = new String(bytes);
+                callback.onSuccess(result);
+            }
+
+            @Override
+            public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
+                callback.onSuccess(throwable.toString());
+            }
+        });
+
+    }
+
+    @Override
+    public void get(String url, Map<String, Object> params, final ICallback callback) {
+
+        // 创建异步请求端对象
+        AsyncHttpClient client = new AsyncHttpClient();
+
+        // 发送get请求对象
+        client.get(url, new AsyncHttpResponseHandler() {
+
+
+            @Override
+                    public void onSuccess(int i, Header[] headers, byte[] bytes) {
+                        String result = new String(bytes);
+                        Log.i(TAG, "请求成功" + result);
+                        callback.onSuccess(result);
+                    }
+
+                    @Override
+                    public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
+                        Log.i(TAG, "请求异常" + throwable.toString());
+                        callback.onSuccess(throwable.toString());
+                    }
+                }
+        );
+    }
+}

+ 36 - 0
app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/HttpCallback.java

@@ -0,0 +1,36 @@
+package com.ahau.againstpestinfo.HttpProcessor;
+
+import com.google.gson.Gson;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/3
+ */
+
+public abstract class HttpCallback<Result> implements ICallback {
+    @Override
+    public void onSuccess(String result) {
+        Gson gson = new Gson();
+        Class<?> clz = analysisClassInfo(this);
+        Result objResult = (Result) gson.fromJson(result, clz);
+        onSuccess(objResult);
+    }
+
+    public abstract void onSuccess(Result result);
+
+    private Class<?> analysisClassInfo(Object object) {
+        Type getType = object.getClass().getGenericSuperclass();
+        Type[] params = ((ParameterizedType)getType).getActualTypeArguments();
+        return (Class<?>) params[0];
+    }
+
+    @Override
+    public void onFailure(String e) {
+
+    }
+}

+ 85 - 0
app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/HttpHelper.java

@@ -0,0 +1,85 @@
+package com.ahau.againstpestinfo.HttpProcessor;
+
+import android.util.Log;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 注释:代理模式的代理
+ *
+ * @author fanchunchun
+ * @date 2018/4/3
+ */
+
+public class HttpHelper implements IHttpProcessor{
+    private static IHttpProcessor mIHttpProcessor = null;
+    private Map<String, Object> mParams;
+    private static HttpHelper _instance;
+
+    private HttpHelper() {
+        mParams = new HashMap<>();
+    }
+
+
+    /**
+     * 单例设计模式
+     * @return
+     */
+    public static  HttpHelper obtain() {
+        synchronized (HttpHelper.class) {
+            if (_instance == null) {
+                _instance = new HttpHelper();
+            }
+        }
+        return _instance;
+    }
+
+    public static void  init(IHttpProcessor httpProcessor) {
+        mIHttpProcessor = httpProcessor;
+    }
+
+    @Override
+    public void post(String url, Map<String, Object> params, ICallback callback) {
+        final String finalUrl = appendParams(url, params);
+        mIHttpProcessor.post(finalUrl, params,callback);
+    }
+
+    @Override
+    public void get(String url, Map<String, Object> params, ICallback callback) {
+        final String finalUrl = appendParams(url, params);
+        mIHttpProcessor.get(finalUrl, params, callback);
+    }
+
+    private String appendParams(String url, Map<String, Object> params) {
+        if (params == null || params.isEmpty()) {
+            return url;
+        }
+
+        StringBuilder urlBuilder = new StringBuilder(url);
+        if (urlBuilder.indexOf("?")<= 0) {
+            urlBuilder.append("?");
+        }else {
+            if (!urlBuilder.toString().endsWith("?")) {
+                urlBuilder.append("&");
+            }
+        }
+        for (Map.Entry<String, Object> entry : params.entrySet()) {
+            urlBuilder.append(entry.getKey()).append("=").append(encode(entry.getValue().toString()));
+        }
+        return urlBuilder.toString();
+    }
+
+    //URI不允许有空格等字符,如果参数值有空格,需要此方法转换
+    private static String encode(String str) {
+        try {
+            return URLEncoder.encode(str, "utf-8");
+        } catch (UnsupportedEncodingException e) {
+            //针对不支持的编码时报错,utf-8应该是支持的
+            Log.e("参数转码异常", e.toString());
+            throw new RuntimeException(e);
+        }
+    }
+}

+ 13 - 0
app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/ICallback.java

@@ -0,0 +1,13 @@
+package com.ahau.againstpestinfo.HttpProcessor;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/3
+ */
+
+public interface ICallback {
+    void onSuccess(String result);
+    void onFailure(String e);
+}

+ 16 - 0
app/src/main/java/com/ahau/againstpestinfo/HttpProcessor/IHttpProcessor.java

@@ -0,0 +1,16 @@
+package com.ahau.againstpestinfo.HttpProcessor;
+
+import java.util.Map;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/3
+ */
+
+public interface IHttpProcessor {
+    //网络访问: Post, get, Del, Update, put
+    void post(String url, Map<String, Object> params, ICallback callback);
+    void get(String url, Map<String, Object> params, ICallback callback);
+}

+ 160 - 0
app/src/main/java/com/ahau/againstpestinfo/activity/LoginActivity.java

@@ -0,0 +1,160 @@
+package com.ahau.againstpestinfo.activity;
+
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.Toast;
+import com.ahau.againstpestinfo.HttpProcessor.HttpCallback;
+import com.ahau.againstpestinfo.HttpProcessor.HttpHelper;
+import com.ahau.againstpestinfo.R;
+import com.ahau.againstpestinfo.utils.LoginUtils;
+import com.ahau.againstpestinfo.utils.URLUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
+    private Button loginbtn, registerbtn;
+    private String username, password;
+    private Boolean isrem;
+    private CheckBox remembercb;
+    private EditText usernameET, passwordET;
+    private String userinfo_url;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+
+        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
+        // 锁定屏幕
+        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_login);
+
+        intiViews();
+    }
+
+
+    @Override
+    public void onClick(View v) {
+
+        switch (v.getId()) {
+            case R.id.login:
+                if (loginIssuccess()) {
+                    Toast.makeText(LoginActivity.this, "正在登录,请稍等!", Toast.LENGTH_SHORT).show();
+                    //dologin(); //不需要验证用户名,密码
+                    login();
+                }
+                break;
+            default:
+                break;
+
+        }
+    }
+
+    private void intiViews() {
+        // TODO Auto-generated method stub
+        loginbtn = (Button) findViewById(R.id.login);
+        usernameET = (EditText) findViewById(R.id.username);
+        passwordET = (EditText) findViewById(R.id.pwd);
+        remembercb = (CheckBox) findViewById(R.id.remcb);
+        loginbtn.setOnClickListener(this);
+
+        //账户名密码的回显
+        Map<String, String> map = LoginUtils.getUtil(getApplicationContext());
+        if (map != null) {
+            String username = (String) map.get("username");
+            String password = (String) map.get("password");
+
+            usernameET.setText(username);
+            passwordET.setText(password);
+
+            remembercb.setChecked(true);
+
+        }
+    }
+
+
+    private boolean loginIssuccess() {
+
+        username = usernameET.getText().toString();
+        password = passwordET.getText().toString();
+        isrem = remembercb.isChecked();
+
+        if (TextUtils.isEmpty(username)) {
+            // 用户输入用户名为空
+            Toast.makeText(LoginActivity.this, "用户名不能为空!", Toast.LENGTH_SHORT).show();
+            return false;
+        } else if (TextUtils.isEmpty(password)) {
+            // 密码不能为空
+            Toast.makeText(LoginActivity.this, "密码不能为空!", Toast.LENGTH_SHORT).show();
+            return false;
+        }
+
+        LoginUtils.saveUtil(getApplicationContext(), username, password);
+
+        return true;
+
+    }
+
+
+    private void login() {
+        /**
+         * AsyncHttpClient client = new AsyncHttpClient();
+         * client.get("http://www.google.com", new AsyncHttpResponseHandler() {
+         *
+         * @Override public void onSuccess(String response) {
+         * System.out.println(response); } });
+         */
+        getUserinfo(username, password);
+    }
+
+    private void getUserinfo(String username, String password) {
+
+        userinfo_url = URLUtils.defaultUrl + "/login?username=" + username + "&password="
+                + password;
+
+        System.out.println(URLUtils.defaultUrl + "/login?username=" + username + "&password="
+                + password);
+        // 服务器端写的是doGet()方法,因此此处必须是get请求,如果利用post请求,OnFailure()方法error会报错
+        Map<String, Object> params = new HashMap<>();
+        HttpHelper.obtain().get(userinfo_url, params, new HttpCallback<String>() {
+            @Override
+            public void onSuccess(String s) {
+                if (!TextUtils.isEmpty(s)) {
+                    JSONObject jsonObject;
+                    try {
+                        jsonObject = new JSONObject(s);
+
+                        String status = jsonObject.getString("status");
+                        if (status.equals("false")) {
+                            System.out.println("denglushibai");
+                            Toast.makeText(LoginActivity.this, " 用户名或密码输入错误,请重新登录!", Toast.LENGTH_SHORT).show();
+                        } else if (status.equals("true")) {
+                            dologin();
+
+                        }
+                    } catch (JSONException e) {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    }
+                }
+            }
+        });
+    }
+    public void dologin() {
+        Intent intent = new Intent();
+        intent.setClass(LoginActivity.this, SearchActivity.class);
+        startActivity(intent);
+    }
+}

+ 611 - 0
app/src/main/java/com/ahau/againstpestinfo/activity/SearchActivity.java

@@ -0,0 +1,611 @@
+package com.ahau.againstpestinfo.activity;
+
+import android.app.Activity;
+import android.graphics.Point;
+import android.os.Bundle;
+import android.os.Handler;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.ahau.againstpestinfo.R;
+import com.ahau.againstpestinfo.domain.MyMarkerCluster;
+import com.ahau.againstpestinfo.domain.PestEnitityList;
+import com.ahau.againstpestinfo.domain.PestEntity;
+import com.ahau.againstpestinfo.presenter.ISearchPresenter;
+import com.ahau.againstpestinfo.utils.ImageLoaderUtils;
+import com.ahau.againstpestinfo.utils.URLUtils;
+import com.ahau.againstpestinfo.view.BaseActivity;
+import com.ahau.againstpestinfo.view.ISearchView;
+import com.amap.api.maps2d.AMap;
+import com.amap.api.maps2d.CameraUpdateFactory;
+import com.amap.api.maps2d.Projection;
+import com.amap.api.maps2d.SupportMapFragment;
+import com.amap.api.maps2d.UiSettings;
+import com.amap.api.maps2d.model.BitmapDescriptorFactory;
+import com.amap.api.maps2d.model.CameraPosition;
+import com.amap.api.maps2d.model.LatLng;
+import com.amap.api.maps2d.model.Marker;
+import com.amap.api.maps2d.model.MarkerOptions;
+import com.loopj.android.http.AsyncHttpClient;
+import com.loopj.android.http.AsyncHttpResponseHandler;
+
+import org.apache.http.Header;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import cn.qqtheme.framework.picker.DatePicker;
+import cn.qqtheme.framework.picker.OptionPicker;
+
+
+/**
+ * @author
+ */
+
+
+public class SearchActivity extends BaseActivity<ISearchView, ISearchPresenter<ISearchView>> implements ISearchView, AMap.OnCameraChangeListener {
+
+    private TextView sp_peoplesearch;
+    private TextView tv_dates;
+    private TextView tv_areaids;
+    boolean first = true;
+    private Activity mActivity;
+
+
+    private Button searchbtn;
+    private RelativeLayout rl_marker;
+    private ImageView iv_img, iv_img2;
+    private ImageLoaderUtils imageLoader;
+    private TextView tv_pestname, tv_pestgrade, tv_date, tv_areaid, tv_researchpeople, tv_remark, closemaker;
+    private List<PestEntity> pestlist = new ArrayList<PestEntity>();
+    private String pestgetUrl, pestdescribeUrl;
+
+    private ArrayList<MarkerOptions> markerOptionsList = new ArrayList<MarkerOptions>();// 所有的marker
+    private ArrayList<MarkerOptions> markerOptionsListInView = new ArrayList<MarkerOptions>();// 视野内的marker
+    private AMap aMap;
+    private UiSettings mUiSettings;
+    private int height;// 屏幕高度(px)
+    private int width;// 屏幕宽度(px)
+    Handler timeHandler = new Handler() {
+        @Override
+        public void handleMessage(android.os.Message msg) {
+            super.handleMessage(msg);
+            switch (msg.what) {
+                case 0:
+                    // 更新markers
+                    resetMarks();
+                    break;
+            }
+        }
+    };
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_search);
+
+        DisplayMetrics dm = new DisplayMetrics();
+        getWindowManager().getDefaultDisplay().getMetrics(dm);
+        width = dm.widthPixels; // 获取屏幕高度 宽度等信息 为点聚合做准备
+        height = dm.heightPixels;
+        init();
+
+        initView();
+        initOverlay();
+        isearchPresenter.fetch();
+
+        mActivity = this;
+
+        tv_dates.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Calendar calendar = Calendar.getInstance();
+                DatePicker picker = new DatePicker(mActivity);
+                picker.setRange(2000, 2030);
+                picker.setSelectedItem(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH));
+                picker.setOnDatePickListener(new DatePicker.OnYearMonthDayPickListener() {
+                    @Override
+                    public void onDatePicked(String year, String month, String day) {
+                        //String sData = year + "-" + month + "-" + day;
+                        tv_dates.setText(year + "-" + month + "-" + day);
+                    }
+                });
+                picker.show();
+            }
+        });
+
+
+        //地图
+        AMap.OnMarkerClickListener markerClickListener = new AMap.OnMarkerClickListener() {
+            // marker 对象被点击时回调的接口 // 返回 true则表示接口已响应事件,否则返回false
+
+            @Override
+            public boolean onMarkerClick(Marker marker) {
+
+                int i = Integer.parseInt(marker.getTitle());
+
+
+                PestEntity infoUtil = pestlist.get(i);
+                getpestdescribe(infoUtil.getId()); // 将信息显示在界面上
+
+                // 将布局显示出来
+                rl_marker.setVisibility(View.VISIBLE);
+                return false;
+
+            }
+        };
+        // 绑定 Marker 被点击事件
+        aMap.setOnMarkerClickListener(markerClickListener);
+
+
+        searchbtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                initdata(sp_peoplesearch.getText().toString(), tv_dates.getText().toString(),tv_areaids.getText().toString());
+            }
+        });
+        closemaker.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                rl_marker.setVisibility(View.GONE);
+            }
+        });
+
+    }
+
+
+    private void initView() {
+        rl_marker = findViewById(R.id.My_bottomLO);
+        sp_peoplesearch = findViewById(R.id.sp_peoplesearch);
+        tv_dates = findViewById(R.id.tv_dates);
+        tv_areaids = findViewById(R.id.tv_areaids);
+        searchbtn = findViewById(R.id.searchbtn);
+
+
+        //显示详细信息
+        iv_img = rl_marker.findViewById(R.id.iv_img);
+        iv_img2 = rl_marker.findViewById(R.id.iv_img2);
+        tv_pestname = rl_marker.findViewById(R.id.tv_pestname);
+        tv_pestgrade = rl_marker.findViewById(R.id.tv_pestgrade);
+        tv_date = rl_marker.findViewById(R.id.tv_date);
+        tv_areaid = rl_marker.findViewById(R.id.tv_areaid);
+        tv_researchpeople = rl_marker.findViewById(R.id.tv_researchpeople);
+        tv_remark = rl_marker.findViewById(R.id.tv_remark);
+        closemaker = rl_marker.findViewById(R.id.close);
+
+    }
+
+    @Override
+    protected ISearchPresenter<ISearchView> createPresenter() {
+        return new ISearchPresenter<>();
+    }
+
+    /**
+     * 姓名模块
+     *
+     * @param researName
+     */
+    @Override
+    public void setResearName(final List<String> researName) {
+
+        sp_peoplesearch.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                OptionPicker picker = new OptionPicker(SearchActivity.this, researName.toArray(new String[researName.size()]));
+                picker.setOffset(2);
+                picker.setSelectedIndex(1);
+                picker.setTextSize(20);
+                picker.setOnOptionPickListener(new OptionPicker.OnOptionPickListener() {
+                    @Override
+                    public void onOptionPicked(String option) {
+                        sp_peoplesearch.setText(option);
+                    }
+                });
+                picker.show();
+            }
+        });
+
+
+        /*researName.add("请选择");
+        simpleArrayAdapter<String> adapter = new simpleArrayAdapter<String>(this, android.R.layout.simple_list_item_1, researName);
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        sp_peoplesearch.setAdapter(adapter);
+        sp_peoplesearch.setSelection(researName.size() - 1, true);
+
+
+        *//**选项选择监听*//*
+        sp_peoplesearch.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                if (first) {
+                    view.setVisibility(View.INVISIBLE);
+
+                }
+                first = false;
+                Toast.makeText(SearchActivity.this, "点击了" + researName.get(position), Toast.LENGTH_SHORT).show();
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+
+            }
+        });*/
+
+    }
+
+    @Override
+    public void setAreaid(final List<String> areaid) {
+        tv_areaids.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                OptionPicker picker = new OptionPicker(SearchActivity.this, areaid.toArray(new String[areaid.size()]));
+                picker.setOffset(2);
+                picker.setSelectedIndex(1);
+                picker.setTextSize(20);
+                picker.setOnOptionPickListener(new OptionPicker.OnOptionPickListener() {
+                    @Override
+                    public void onOptionPicked(String option) {
+                        tv_areaids.setText(option);
+                    }
+                });
+                picker.show();
+            }
+        });
+    }
+
+
+    /**
+     * 初始化AMap对象
+     */
+    private void init() {
+        if (aMap == null) {
+
+            aMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map_view)).getMap();
+            setUpMap();
+            mUiSettings = aMap.getUiSettings();
+            mUiSettings.setAllGesturesEnabled(true);
+            //mUiSettings.setTiltGesturesEnabled(false);// 禁用倾斜手势。
+            //mUiSettings.setRotateGesturesEnabled(false);// 禁用旋转手势。
+        }
+
+    }
+
+    public void initOverlay() {
+        initdata("", "","");
+    }
+
+    private void setUpMap() {
+        //aMap.setOnCameraChangeListener(this);
+        //addMarkers();// 聚合测试点添加
+    }
+
+
+    public void addOverlay(List<PestEntity> infos2) {
+        // 清空地图
+        aMap.clear();
+        // 创建marker的显示图标
+        // BitmapDescriptor bitmap =
+        // BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
+        LatLng latLng = null;
+        Marker marker;
+        markerOptionsList.clear();
+        // OverlayOptions options;
+        if ((infos2 != null) && infos2.size() > 0) {
+            for (int i = 0; i < infos2.size(); i++) {
+
+                PestEntity info = infos2.get(i);
+                // 获取经纬度
+                latLng = new LatLng(Double.valueOf(info.getLatitude()), Double.valueOf(info.getLongitude()));
+
+			/*
+             * CoordinateConverter converter = new CoordinateConverter(); //
+			 * 将GPS设备采集的原始GPS坐标转换成百度坐标 converter.from(CoordType.GPS);
+			 * converter.coord(latLng); // latLng待转换坐标 LatLng desLatLng =
+			 * converter.convert();
+			 */
+
+                // 设置marker
+                markerOptionsList.add(new MarkerOptions().position(latLng).title("" + i)
+                        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
+
+			/*
+             * options = new MarkerOptions().position(desLatLng)// 设置位置
+			 * .icon(bitmap)// 设置图标样式 .zIndex(9); // 设置marker所在层级
+			 *
+			 * // 添加marker marker = (Marker) mBaiduMap.addOverlay(options); //
+			 * 使用marker携带info信息,当点击事件的时候可以通过marker获得info信息
+			 */
+                // Bundle bundle = new Bundle();
+                // info必须实现序列化接口
+                // bundle.putSerializable("info",info);
+                // marker.setExtraInfo(bundle);
+            }
+            if (markerOptionsList != null) {
+                for (MarkerOptions mp : markerOptionsList) {
+                    marker = aMap.addMarker(mp);
+
+                }
+            }
+
+            aMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
+            aMap.moveCamera(CameraUpdateFactory.zoomTo(10));
+
+        }
+
+
+        // 将地图显示在最后一个marker的位置
+        /*
+		 * MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
+		 * mBaiduMap.setMapStatus(msu);
+		 */
+    }
+
+
+    public void initdata(String researchpeople, String date, String areaid) {
+
+        getpestList(researchpeople, date, areaid);
+
+    }
+
+    private void getpestList(String researchpeople, String date, String areaid) {
+        String pestgeturl = "";
+        if (researchpeople.isEmpty() && date.isEmpty() && areaid.isEmpty()) {
+            pestgeturl = URLUtils.AgainPestUrl + "/pestinfolist";
+        }
+        if (!researchpeople.isEmpty() && !date.isEmpty() &&areaid.isEmpty()) {
+            pestgeturl = URLUtils.AgainPestUrl + "/pestinfolist?researchpeople=" + researchpeople + "&date=" + date;
+        }
+
+
+        if (!researchpeople.isEmpty() && date.isEmpty() && areaid.isEmpty()) {
+            pestgeturl = URLUtils.AgainPestUrl + "/pestinfolist?researchpeople=" + researchpeople;
+        }
+        if (researchpeople.isEmpty() && !date.isEmpty() && areaid.isEmpty()) {
+            pestgeturl = URLUtils.AgainPestUrl + "/pestinfolist?date=" + date;
+        }
+        if (researchpeople.isEmpty() && date.isEmpty() && !areaid.isEmpty()) {
+            pestgeturl = URLUtils.AgainPestUrl + "/pestinfolist?adressid=" + areaid;
+        }
+
+        if (!researchpeople.isEmpty() && !date.isEmpty() && areaid.isEmpty()) {
+            pestgeturl = URLUtils.AgainPestUrl + "/pestinfolist?researchpeople=" + researchpeople + "&date=" + date;
+        }
+        if (researchpeople.isEmpty() && !date.isEmpty() && !areaid.isEmpty()) {
+            pestgeturl = URLUtils.AgainPestUrl + "/pestinfolist?date=" + date + "&adressid=" + areaid;
+        }
+        if (!researchpeople.isEmpty() && date.isEmpty() && !areaid.isEmpty()) {
+            pestgeturl = URLUtils.AgainPestUrl + "/pestinfolist?adressid=" + areaid + "&researchpeople=" + researchpeople;
+        }
+
+        if (!TextUtils.isEmpty(pestgeturl)) {
+
+            pestgetUrl = pestgeturl;
+            AsyncHttpClient client = new AsyncHttpClient();
+            client.get(pestgetUrl, pestlistgetAsyncHttpResponseHandler);
+        }
+    }
+
+    AsyncHttpResponseHandler pestlistgetAsyncHttpResponseHandler = new AsyncHttpResponseHandler() {
+
+        int getDataCount = 1;
+
+        @Override
+        public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
+
+            if (getDataCount > 3) {
+            } else {
+                AsyncHttpClient client = new AsyncHttpClient();
+                client.get(pestgetUrl, pestlistgetAsyncHttpResponseHandler);
+                ++getDataCount;
+            }
+        }
+
+        @Override
+        public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
+
+            String content = new String(arg2);
+            if (!TextUtils.isEmpty(content) && content.length() > 2) {
+                try {
+
+                    JSONObject jsonObject = new JSONObject(content);
+                    if (jsonObject != null) {
+                        PestEnitityList pestEntityList = new PestEnitityList(jsonObject);
+                        if (pestEntityList != null) {
+                            pestlist.clear();
+
+                            pestlist.addAll(pestEntityList.getPestEntities());
+                            addOverlay(pestlist);
+                            Toast.makeText(SearchActivity.this, "更新数据完毕", Toast.LENGTH_SHORT).show();
+
+                        }
+
+
+                        if (pestlist.isEmpty()) {
+
+                            Toast.makeText(SearchActivity.this, "当前没有符合条件的信息", Toast.LENGTH_SHORT).show();
+                        }
+
+                    }
+
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    };
+
+
+    private void getpestdescribe(String id) {
+        String pestgeturl = URLUtils.AgainPestUrl + "/query?id=" + id;
+        if (!TextUtils.isEmpty(pestgeturl)) {
+
+            pestdescribeUrl = pestgeturl;
+
+            AsyncHttpClient client = new AsyncHttpClient();
+            client.get(pestdescribeUrl, pestdescribeAsyncHttpResponseHandler);
+        }
+
+    }
+
+    AsyncHttpResponseHandler pestdescribeAsyncHttpResponseHandler = new AsyncHttpResponseHandler() {
+
+        int getDataCount = 1;
+
+        @Override
+        public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
+
+            if (getDataCount > 3) {
+            } else {
+                AsyncHttpClient client = new AsyncHttpClient();
+                client.get(pestgetUrl, pestdescribeAsyncHttpResponseHandler);
+                ++getDataCount;
+            }
+        }
+
+        @Override
+        public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
+
+            String content = new String(arg2);
+            if (!TextUtils.isEmpty(content) && content.length() > 2) {
+                try {
+
+                    JSONObject jsonObject = new JSONObject(content);
+                    if (jsonObject != null) {
+                        if (!jsonObject.isNull("data")) {
+
+                            JSONObject dataJsonObject = jsonObject.optJSONObject("data");
+                            //System.out.println(dataJsonObject);
+                            PestEntity pestdescribeEntity = new PestEntity(dataJsonObject);
+                            iv_img2.setImageBitmap(null);
+                            if (!pestdescribeEntity.getPurl().isEmpty()) {
+                                imageLoader = new ImageLoaderUtils(SearchActivity.this);
+                                imageLoader.DisplayImage(pestdescribeEntity.getPurl(), iv_img);
+
+                            }
+                            if (!pestdescribeEntity.getPurl2().isEmpty()) {
+                                imageLoader = new ImageLoaderUtils(SearchActivity.this);
+
+                                imageLoader.DisplayImage(pestdescribeEntity.getPurl2(), iv_img2);
+                            }
+
+                            if (!pestdescribeEntity.getAreaid().isEmpty()) {
+                                tv_areaid.setText(pestdescribeEntity.getAreaid());
+                            }
+                            if (!pestdescribeEntity.getDate().isEmpty()) {
+                                tv_date.setText(pestdescribeEntity.getDate());
+                            }
+                            if (!pestdescribeEntity.getPestfirstgrade().isEmpty()) {
+                                tv_pestgrade.setText(pestdescribeEntity.getPestfirstgrade() + "," + pestdescribeEntity.getPestsecondgrade());
+                            }
+                            if (!pestdescribeEntity.getPestname().isEmpty()) {
+                                tv_pestname.setText(pestdescribeEntity.getPestname());
+                            }
+                            if (!pestdescribeEntity.getResearchpeople().isEmpty()) {
+                                tv_researchpeople.setText(pestdescribeEntity.getResearchpeople());
+                            }
+                            if (!pestdescribeEntity.getRemark().isEmpty()) {
+                                tv_remark.setText(pestdescribeEntity.getRemark());
+                            }
+
+
+                        }
+
+                    }
+
+					/*
+					 * tv_name.setText(infoUtil.getName());
+					 *
+					 * tv_description.setText(infoUtil.getDescription());
+					 */
+                    // 将布局显示出来
+                    rl_marker.setVisibility(View.VISIBLE);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    };
+
+
+    /**
+     * 模拟添加多个marker
+     */
+	/*
+	 * private void addMarkers() { for (int i = 0; i < 200; i++) { LatLng latLng
+	 * = new LatLng(Math.random() * 6 + 35, Math.random() * 6 + 112);
+	 * markerOptionsList.add(new MarkerOptions() .position(latLng)
+	 * .title("Marker" + i) .icon(BitmapDescriptorFactory
+	 * .defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
+	 *
+	 * } for(MarkerOptions mp :markerOptionsList){ Marker marker =
+	 * aMap.addMarker(mp); } }
+	 */
+    @Override
+    public void onCameraChange(CameraPosition arg0) {
+
+    }
+
+    @Override
+    public void onCameraChangeFinish(CameraPosition cameraPosition) { // 监听地图缩放
+        // TODO Auto-generated method stub
+        // timeHandler.sendEmptyMessage(0);// 更新界面marker
+    }
+
+    /**
+     * 获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker
+     */
+    private void resetMarks() {
+
+        System.out.println("markerOptionsList.size():" + markerOptionsList.size());
+        // 开始刷新车辆
+        Projection projection = aMap.getProjection();
+        Point p = null;
+        markerOptionsListInView.clear();
+        // 获取在当前视野内的marker;提高效率
+        for (MarkerOptions mp : markerOptionsList) {
+            p = projection.toScreenLocation(mp.getPosition());
+            if (p.x < 0 || p.y < 0 || p.x > width || p.y > height) {
+                // 不添加到计算的列表中
+            } else {
+                markerOptionsListInView.add(mp);
+            }
+        }
+        // 自定义的聚合类MyMarkerCluster
+        ArrayList<MyMarkerCluster> clustersMarker = new ArrayList<MyMarkerCluster>();
+        for (MarkerOptions mp : markerOptionsListInView) {
+            if (clustersMarker.size() == 0) {
+                clustersMarker.add(new MyMarkerCluster(SearchActivity.this, mp, projection, 60));// 100根据自己需求调整
+            } else {
+                boolean isIn = false;
+                for (MyMarkerCluster cluster : clustersMarker) {
+                    if (cluster.getBounds().contains(mp.getPosition())) {
+                        cluster.addMarker(mp);
+                        isIn = true;
+                        break;
+                    }
+                }
+                if (!isIn) {
+                    clustersMarker.add(new MyMarkerCluster(SearchActivity.this, mp, projection, 60));
+                }
+            }
+        }
+        // 设置聚合点的位置和icon
+        for (MyMarkerCluster mmc : clustersMarker) {
+            mmc.setpositionAndIcon();
+        }
+        aMap.clear();
+        // 重新添加
+        for (MyMarkerCluster cluster : clustersMarker) {
+            aMap.addMarker(cluster.getOptions());
+        }
+    }
+}

+ 78 - 0
app/src/main/java/com/ahau/againstpestinfo/adapter/simpleArrayAdapter.java

@@ -0,0 +1,78 @@
+package com.ahau.againstpestinfo.adapter;
+
+import android.content.Context;
+import android.widget.ArrayAdapter;
+
+import java.util.List;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/4
+ */
+
+/**
+ * 给下拉框的适配器
+ * Created by IBM on 2016/10/25.
+ */
+
+public class simpleArrayAdapter<T> extends ArrayAdapter {
+    //构造方法
+    public simpleArrayAdapter(Context context, int resource, List<T>  objects) {
+        super(context, resource, objects);
+    }
+    //复写这个方法,使返回的数据没有最后一项
+    @Override
+    public int getCount() {
+        // don't display last item. It is used as hint.
+        int count = super.getCount();
+        return count > 0 ? count - 1 : count;
+    }
+
+    /*@Override
+    public int getCount() {
+
+        return list.size() - 1;
+    }*/
+
+    @Override
+    public long getItemId(int arg0) {
+
+        return arg0;
+    }
+
+ /*   @Override
+    public String getItem(int position) {
+
+        return (String) objects.get(position);
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        return getCustomView(position, convertView, parent);
+    }
+
+    @Override
+    public View getDropDownView(int position, View convertView, ViewGroup parent) {
+        return getCustomView(position, convertView, parent);
+
+    };
+
+    public View getCustomView(int position, View convertView, ViewGroup parent) {
+        if (convertView == null) {
+            convertView = layoutInflater.inflate(
+                    android.R.layout.simple_spinner_item, parent, false);
+        }
+        text = (TextView) convertView.findViewById(android.R.id.text1);
+        if (position == getCount()) {
+            text.setText("");
+            text.setHint(getItem(getCount())); // "Hint to be displayed"
+        } else {
+            text.setText(getItem(position));
+        }
+
+        return convertView;
+    }*/
+
+}

+ 46 - 0
app/src/main/java/com/ahau/againstpestinfo/base/MyApplication.java

@@ -0,0 +1,46 @@
+package com.ahau.againstpestinfo.base;
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.Context;
+
+import com.ahau.againstpestinfo.HttpProcessor.AsyncProcessor;
+import com.ahau.againstpestinfo.HttpProcessor.HttpHelper;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/20
+ */
+
+public class MyApplication extends Application {
+
+    private static Context context;
+
+    private static Activity activity;
+
+    public static Activity getActivity() {
+        return activity;
+    }
+
+    private static MyApplication instance;
+    public static MyApplication getInstance() {
+        return instance;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+
+        instance = this;
+
+        context = getApplicationContext();
+
+        HttpHelper.init(new AsyncProcessor());
+    }
+
+    public static Context getContext() {
+        return context;
+    }
+}

+ 22 - 0
app/src/main/java/com/ahau/againstpestinfo/bean/AreaidBean.java

@@ -0,0 +1,22 @@
+package com.ahau.againstpestinfo.bean;
+
+import java.util.List;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/10
+ */
+
+public class AreaidBean {
+    private List<String> areaid;
+
+    public List<String> getAreaid() {
+        return areaid;
+    }
+
+    public void setAreaid(List<String> areaid) {
+        this.areaid = areaid;
+    }
+}

+ 20 - 0
app/src/main/java/com/ahau/againstpestinfo/bean/ResearchPeopleBean.java

@@ -0,0 +1,20 @@
+package com.ahau.againstpestinfo.bean;
+
+import java.util.List;
+
+/**
+ * Created by Administrator on 2018/4/21.
+ */
+
+public class ResearchPeopleBean {
+
+    private List<String> research;
+
+    public List<String> getResearch() {
+        return research;
+    }
+
+    public void setResearch(List<String> research) {
+        this.research = research;
+    }
+}

+ 166 - 0
app/src/main/java/com/ahau/againstpestinfo/domain/MyMarkerCluster.java

@@ -0,0 +1,166 @@
+package com.ahau.againstpestinfo.domain;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.Point;
+import android.view.View;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.view.View.MeasureSpec;
+
+import com.ahau.againstpestinfo.R;
+import com.amap.api.maps2d.AMapException;
+import com.amap.api.maps2d.Projection;
+import com.amap.api.maps2d.model.BitmapDescriptorFactory;
+import com.amap.api.maps2d.model.LatLng;
+import com.amap.api.maps2d.model.LatLngBounds;
+import com.amap.api.maps2d.model.MarkerOptions;
+
+import java.util.ArrayList;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/5
+ */
+
+public class MyMarkerCluster {
+    private Activity activity;
+    private MarkerOptions options;
+    private ArrayList<MarkerOptions> includeMarkers;
+    private LatLngBounds bounds;// 创建区域
+
+    /**
+     *
+     * @param activity
+     * @param firstMarkers
+     * @param projection
+     * @param gridSize 区域大小参数
+     */
+    public MyMarkerCluster(Activity activity, MarkerOptions firstMarkers,
+                           Projection projection, int gridSize) {
+        // TODO Auto-generated constructor stub
+        // this.options = firstMarkers;
+        options = new MarkerOptions();
+        this.activity = activity;
+        Point point = projection.toScreenLocation(firstMarkers.getPosition());
+        Point southwestPoint = new Point(point.x - gridSize, point.y + gridSize);
+        Point northeastPoint = new Point(point.x + gridSize, point.y - gridSize);
+        try {
+            bounds = new LatLngBounds(
+                    projection.fromScreenLocation(southwestPoint),
+                    projection.fromScreenLocation(northeastPoint));
+        } catch (AMapException e) {
+            e.printStackTrace();
+        }
+        options.anchor(0.5f, 0.5f).title(firstMarkers.getTitle())
+                .position(firstMarkers.getPosition())
+                .icon(firstMarkers.getIcon())
+                .snippet(firstMarkers.getSnippet());
+
+        includeMarkers = new ArrayList<MarkerOptions>();
+        includeMarkers.add(firstMarkers);
+    }
+
+    /**
+     * 添加marker
+     */
+    public void addMarker(MarkerOptions markerOptions) {
+        includeMarkers.add(markerOptions);// 添加到列表中
+    }
+
+    /**
+     * 设置聚合点的中心位置以及图标
+     */
+    public void setpositionAndIcon() {
+        int size = includeMarkers.size();
+
+        if (size == 1) {
+            return;
+        }
+        double lat = 0.0;
+        double lng = 0.0;
+
+        String snippet = "";
+        for (MarkerOptions op : includeMarkers) {
+            lat += op.getPosition().latitude;
+            lng += op.getPosition().longitude;
+            snippet += op.getTitle() + "\n";
+        }
+        options.position(new LatLng(lat / size, lng / size));// 设置中心位置为聚集点的平均位置
+        options.title("聚合点");
+        options.snippet(snippet);
+
+        int iconType = size / 10;
+
+        switch (iconType) {
+            case 0:
+                options.icon(BitmapDescriptorFactory
+                        .fromBitmap(getViewBitmap(getView(size,
+                                R.drawable.marker_cluster_10))));
+                break;
+            case 1:
+                options.icon(BitmapDescriptorFactory
+                        .fromBitmap(getViewBitmap(getView(size,
+                                R.drawable.marker_cluster_20))));
+                break;
+            case 2:
+                options.icon(BitmapDescriptorFactory
+                        .fromBitmap(getViewBitmap(getView(size,
+                                R.drawable.marker_cluster_30))));
+                break;
+            case 3:
+                options.icon(BitmapDescriptorFactory
+                        .fromBitmap(getViewBitmap(getView(size,
+                                R.drawable.marker_cluster_30))));
+                break;
+            case 4:
+                options.icon(BitmapDescriptorFactory
+                        .fromBitmap(getViewBitmap(getView(size,
+                                R.drawable.marker_cluster_50))));
+                break;
+            default:
+                options.icon(BitmapDescriptorFactory
+                        .fromBitmap(getViewBitmap(getView(size,
+                                R.drawable.marker_cluster_100))));
+                break;
+        }
+    }
+
+    public LatLngBounds getBounds() {
+        return bounds;
+    }
+
+    public MarkerOptions getOptions() {
+        return options;
+    }
+
+    public void setOptions(MarkerOptions options) {
+        this.options = options;
+    }
+
+    public View getView(int carNum, int resourceId) {
+        View view = activity.getLayoutInflater().inflate(
+                R.layout.my_car_cluster_view, null);
+        TextView carNumTextView = (TextView) view.findViewById(R.id.my_car_num);
+        RelativeLayout myCarLayout = (RelativeLayout) view
+                .findViewById(R.id.my_car_bg);
+        myCarLayout.setBackgroundResource(resourceId);
+        carNumTextView.setText(String.valueOf(carNum));
+        return view;
+    }
+
+    /**
+     * 把一个view转化成bitmap对象
+     */
+    public static Bitmap getViewBitmap(View view) {
+        view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
+        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
+        view.buildDrawingCache();
+        Bitmap bitmap = view.getDrawingCache();
+        return bitmap;
+    }
+}
+

+ 64 - 0
app/src/main/java/com/ahau/againstpestinfo/domain/PestEnitityList.java

@@ -0,0 +1,64 @@
+package com.ahau.againstpestinfo.domain;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/5
+ */
+
+public class PestEnitityList {
+    private List<PestEntity> mPestEntities;
+
+    public PestEnitityList() {
+    }
+
+    public PestEnitityList(JSONObject jsonObject) {
+        try {
+            mPestEntities= new ArrayList<PestEntity>();
+            if (!jsonObject.isNull("data")) {
+
+                JSONArray PestjsonArray = jsonObject.optJSONArray("data");
+
+	        /* JSONObject dataJsonObject = jsonObject.optJSONObject("data");
+				JSONArray AdressjsonArray = dataJsonObject.optJSONArray("addressinfos");*/
+
+                if (PestjsonArray!= null && PestjsonArray.length() > 0) {
+                    for (int i = 0; i < PestjsonArray.length(); i++) {
+                        if (!PestjsonArray.isNull(i)) {
+
+                            PestEntity mpestEntity= new PestEntity(
+                                    PestjsonArray.getJSONObject(i));
+
+
+                            if((29<Double.valueOf(mpestEntity.getLatitude()))&&(Double.valueOf(mpestEntity.getLatitude())<35)
+                                    &&(110<Double.valueOf(mpestEntity.getLongitude()))&&(Double.valueOf(mpestEntity.getLongitude())<120))
+                            {
+                                //System.out.println("aahhhhhh"+Double.valueOf(mtreeEntity.getLatitude()));
+                                mPestEntities.add(mpestEntity);
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    public List<PestEntity> getPestEntities() {
+        return mPestEntities;
+    }
+
+    public void setPestEntities(List<PestEntity> pestEntities) {
+        mPestEntities = pestEntities;
+    }
+}

+ 178 - 0
app/src/main/java/com/ahau/againstpestinfo/domain/PestEntity.java

@@ -0,0 +1,178 @@
+package com.ahau.againstpestinfo.domain;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.Serializable;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/4
+ */
+
+public class PestEntity implements Serializable {
+    private String pestname;
+    private String purl,purl2="";
+
+    private String date;
+    private String latitude, longitude;
+    private String areaid;
+    private String pestfirstgrade,pestsecondgrade;
+    private String researchpeople;
+    private String remark,id;
+
+    public PestEntity(JSONObject jsonobject) {
+        try {
+            if (!jsonobject.isNull("pestname")) {
+                this.pestname =""+ jsonobject.getString("pestname");
+
+            }
+            if (!jsonobject.isNull("Id")) {
+                this.id =""+ jsonobject.getString("Id");
+
+            }
+            if (!jsonobject.isNull("date")) {
+                this.date = jsonobject.getString("date");
+
+            }
+
+            if (!jsonobject.isNull("pestpicurl1")) {
+                this.purl = jsonobject.getString("pestpicurl1");
+
+            }
+            if (!jsonobject.isNull("pestpicurl2")) {
+                this.purl2 = jsonobject.getString("pestpicurl2");
+
+            }
+            if (!jsonobject.isNull("Latitude")) {
+                this.latitude = jsonobject.getString("Latitude");
+
+            }
+            if (!jsonobject.isNull("Longitude")) {
+                this.longitude = jsonobject.getString("Longitude");
+
+            }
+            if (!jsonobject.isNull("adressid")) {
+                this.areaid = jsonobject.getString("adressid");
+
+            }
+            if (!jsonobject.isNull("pestfirstgrade")) {
+                this.pestfirstgrade = jsonobject.getString("pestfirstgrade");
+
+            }
+            if (!jsonobject.isNull("pestsecondgrade")) {
+                this.pestsecondgrade = jsonobject.getString("pestsecondgrade");
+
+            }
+            if (!jsonobject.isNull("researchpeople")) {
+                this.researchpeople = jsonobject.getString("researchpeople");
+
+            }
+
+            if (!jsonobject.isNull("remark")) {
+                this.remark = jsonobject.getString("remark");
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+
+        }
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getPestname() {
+        return pestname;
+    }
+
+    public void setPestname(String pestname) {
+        this.pestname = pestname;
+    }
+
+    public String getPurl() {
+        return purl;
+    }
+
+    public void setPurl(String purl) {
+        this.purl = purl;
+    }
+
+    public String getPurl2() {
+        return purl2;
+    }
+
+    public void setPurl2(String purl2) {
+        this.purl2 = purl2;
+    }
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getLatitude() {
+        return latitude;
+    }
+
+    public void setLatitude(String latitude) {
+        this.latitude = latitude;
+    }
+
+    public String getLongitude() {
+        return longitude;
+    }
+
+    public void setLongitude(String longitude) {
+        this.longitude = longitude;
+    }
+
+    public String getAreaid() {
+        return areaid;
+    }
+
+    public void setAreaid(String areaid) {
+        this.areaid = areaid;
+    }
+
+    public String getPestfirstgrade() {
+        return pestfirstgrade;
+    }
+
+    public void setPestfirstgrade(String pestfirstgrade) {
+        this.pestfirstgrade = pestfirstgrade;
+    }
+
+    public String getPestsecondgrade() {
+        return pestsecondgrade;
+    }
+
+    public void setPestsecondgrade(String pestsecondgrade) {
+        this.pestsecondgrade = pestsecondgrade;
+    }
+
+    public String getResearchpeople() {
+        return researchpeople;
+    }
+
+    public void setResearchpeople(String researchpeople) {
+        this.researchpeople = researchpeople;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 25 - 0
app/src/main/java/com/ahau/againstpestinfo/model/ISearchModel.java

@@ -0,0 +1,25 @@
+package com.ahau.againstpestinfo.model;
+
+import java.util.List;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/6
+ */
+
+public interface ISearchModel {
+
+    //获取调查人姓名
+    void getResearName(ResearNameListener researNameListener);
+    interface ResearNameListener{
+        void onComplete(List<String> researName);
+    }
+
+    //获取查询的日期
+    void getAreaid(DateListener dateListener);
+    interface DateListener {
+        void onComplete(List<String> areaid);
+    }
+}

+ 61 - 0
app/src/main/java/com/ahau/againstpestinfo/model/ISearchModelImpl.java

@@ -0,0 +1,61 @@
+package com.ahau.againstpestinfo.model;
+
+import android.util.Log;
+
+import com.ahau.againstpestinfo.HttpProcessor.HttpCallback;
+import com.ahau.againstpestinfo.HttpProcessor.HttpHelper;
+import com.ahau.againstpestinfo.bean.AreaidBean;
+import com.ahau.againstpestinfo.bean.ResearchPeopleBean;
+import com.ahau.againstpestinfo.utils.URLUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/20
+ */
+
+public class ISearchModelImpl implements ISearchModel {
+    @Override
+    public void getResearName(final ResearNameListener researNameListener) {
+        Map<String, Object> params = new HashMap<>();
+
+        HttpHelper.obtain().get(URLUtils.defaultUrl + "/resh", params, new HttpCallback<ResearchPeopleBean>() {
+
+            @Override
+            public void onSuccess(ResearchPeopleBean researchPeopleBean) {
+                ArrayList<String> mResearchPeopleList;
+
+                mResearchPeopleList = (ArrayList<String>) researchPeopleBean.getResearch();
+
+                Log.i("TAG",researchPeopleBean.toString());
+
+                researNameListener.onComplete(mResearchPeopleList);
+            }
+        });
+    }
+
+    @Override
+    public void getAreaid(final DateListener dateListener) {
+        Map<String, Object> params = new HashMap<>();
+
+        HttpHelper.obtain().get(URLUtils.defaultUrl + "/areaid", params, new HttpCallback<AreaidBean>() {
+
+            @Override
+            public void onSuccess(AreaidBean researchPeopleBean) {
+                ArrayList<String> mResearchPeopleList;
+
+                mResearchPeopleList = (ArrayList<String>) researchPeopleBean.getAreaid();
+
+                Log.i("TAG",researchPeopleBean.toString());
+
+                dateListener.onComplete(mResearchPeopleList);
+            }
+        });
+    }
+
+}

+ 26 - 0
app/src/main/java/com/ahau/againstpestinfo/presenter/BasePresenter.java

@@ -0,0 +1,26 @@
+package com.ahau.againstpestinfo.presenter;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/6
+ */
+
+public class BasePresenter<T> {
+
+    //view层的应用
+    protected WeakReference<T> mViewRef;
+
+    //进行绑定
+    public void attachView(T view) {
+        mViewRef = new WeakReference<T>(view);
+    }
+
+    //进行解绑
+    public void detchView() {
+        mViewRef.clear();
+    }
+}

+ 55 - 0
app/src/main/java/com/ahau/againstpestinfo/presenter/ISearchPresenter.java

@@ -0,0 +1,55 @@
+package com.ahau.againstpestinfo.presenter;
+
+import com.ahau.againstpestinfo.model.ISearchModel;
+import com.ahau.againstpestinfo.model.ISearchModelImpl;
+import com.ahau.againstpestinfo.view.ISearchView;
+
+import java.util.List;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/6
+ */
+
+public class ISearchPresenter<T extends ISearchView> extends BasePresenter<T>{
+    //拿到model层的引用
+    ISearchModel searchModel = new ISearchModelImpl();
+
+    //构造方法
+    public ISearchPresenter() {
+
+    }
+
+    /**
+     *
+     */
+    //执行UI逻辑
+    public void fetch(){
+        if (mViewRef.get() != null) {
+            if (searchModel != null) {
+                //设置调查人姓名
+                searchModel.getResearName(new ISearchModel.ResearNameListener() {
+                    @Override
+                    public void onComplete(List<String> researName) {
+                        if (mViewRef.get() != null) {
+                            mViewRef.get().setResearName(researName);
+                        }
+                    }
+                });
+
+                //设置查询时间
+                searchModel.getAreaid(new ISearchModel.DateListener() {
+                    @Override
+                    public void onComplete(List<String> date) {
+                        if (mViewRef.get() != null) {
+                            mViewRef.get().setAreaid(date);
+                        }
+                    }
+                });
+
+            }
+        }
+    }
+}

+ 52 - 0
app/src/main/java/com/ahau/againstpestinfo/utils/FileCache.java

@@ -0,0 +1,52 @@
+package com.ahau.againstpestinfo.utils;
+
+import android.content.Context;
+
+import java.io.File;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/6
+ */
+
+public class FileCache {
+
+    private File cacheDir;
+
+    public FileCache(Context context){
+        /**
+         *  如果有SD卡则在SD卡中建一个LazyList的目录存放缓存的图片
+         没有SD卡就放在系统的缓存目录中
+         */
+        //Find the dir to save cached images
+        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
+            cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"teaassistant");
+        else
+            cacheDir=context.getCacheDir();
+        if(!cacheDir.exists())
+            cacheDir.mkdirs();
+    }
+
+    public File getFile(String url){
+        //将url的hashCode作为缓存的文件名
+        //I identify images by hashcode. Not a perfect solution, good for the demo.
+        String filename=String.valueOf(url.hashCode());
+        //Another possible solution (thanks to grantland)
+        //String filename = URLEncoder.encode(url);
+        File f = new File(cacheDir, filename);//如果目录下没有filename文件,则新建一个。
+
+        return f;
+
+    }
+
+    public void clear(){
+        File[] files=cacheDir.listFiles();
+        if(files==null)
+            return;
+        for(File f:files)
+            f.delete();
+    }
+
+}

+ 218 - 0
app/src/main/java/com/ahau/againstpestinfo/utils/ImageLoaderUtils.java

@@ -0,0 +1,218 @@
+package com.ahau.againstpestinfo.utils;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Handler;
+import android.widget.ImageView;
+
+import com.ahau.againstpestinfo.R;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/6
+ */
+
+
+public class ImageLoaderUtils {
+
+    MemoryCache memoryCache=new MemoryCache();
+    FileCache fileCache;
+    private Map<ImageView, String> imageViews= Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
+    ExecutorService executorService;
+    Handler handler=new Handler();//handler to display images in UI thread
+
+    public ImageLoaderUtils(Context context){
+        fileCache=new FileCache(context);
+        executorService= Executors.newFixedThreadPool(5);
+    }
+    // 当进入listview时默认的图片,可换成你自己的默认图片
+    // final int stub_id=R.drawable.oldtree;
+    final int stub_id= R.mipmap.ic_launcher;
+    public void DisplayImage(String url, ImageView imageView)
+    {
+        imageViews.put(imageView, url);
+        // 先从内存缓存中查找
+        Bitmap bitmap=memoryCache.get(url);//内存-文件-网络 三层cache机制
+        if(bitmap!=null)
+            imageView.setImageBitmap(bitmap);
+        else
+        {
+            // 若没有的话则开启新线程加载图片
+            queuePhoto(url, imageView);
+            //imageView.setImageResource(stub_id);
+        }
+    }
+
+    private void queuePhoto(String url, ImageView imageView)
+    {
+        PhotoToLoad p=new PhotoToLoad(url, imageView);
+        executorService.submit(new PhotosLoader(p));
+    }
+
+    private Bitmap getBitmap(String url)
+    {
+        File f=fileCache.getFile(url);// 指向File f = new File(cacheDir, filename);//如果目录下没有filename文件,则新建一个。
+        /**
+         * 先从文件缓存中查找是否有
+         */
+        //from SD cache
+        Bitmap b = decodeFile(f);
+        if(b!=null)
+            return b;
+        /**
+         *  最后从指定的url中下载图片
+         */
+        //from web
+        try {
+            Bitmap bitmap=null;
+            URL imageUrl = new URL(url);
+            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
+            conn.setConnectTimeout(30000);
+            conn.setReadTimeout(30000);
+            conn.setInstanceFollowRedirects(true);
+            InputStream is=conn.getInputStream();
+            OutputStream os = new FileOutputStream(f);
+            Utils.CopyStream(is, os);
+            os.close();
+            conn.disconnect();
+            bitmap = decodeFile(f);
+            return bitmap;
+        } catch (Throwable ex){
+            ex.printStackTrace();
+            if(ex instanceof OutOfMemoryError)
+                memoryCache.clear();
+            return null;
+        }
+    }
+    /**
+     *  decode这个图片并且按比例缩放以减少内存消耗,虚拟机对每张图片的缓存大小也是有限制的
+     */
+    //decodes image and scales it to reduce memory consumption
+    private Bitmap decodeFile(File f){
+        try {
+            //decode image size
+            BitmapFactory.Options o = new BitmapFactory.Options();
+            o.inJustDecodeBounds = true;
+            FileInputStream stream1=new FileInputStream(f);
+            BitmapFactory.decodeStream(stream1,null,o);
+            stream1.close();
+
+            //Find the correct scale value. It should be the power of 2.
+            final int REQUIRED_SIZE=70;
+            int width_tmp=o.outWidth, height_tmp=o.outHeight;
+            int scale=1;
+            while(true){
+                if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
+                    break;
+                width_tmp/=2;
+                height_tmp/=2;
+                scale*=2;
+            }
+
+            //decode with inSampleSize
+            BitmapFactory.Options o2 = new BitmapFactory.Options();
+            o2.inSampleSize=scale;
+            FileInputStream stream2=new FileInputStream(f);
+            Bitmap bitmap=BitmapFactory.decodeStream(stream2, null, o2);
+            stream2.close();
+            return bitmap;
+        } catch (FileNotFoundException e) {
+        }
+        catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    //Task for the queue
+    private class PhotoToLoad
+    {
+        public String url;
+        public ImageView imageView;
+        public PhotoToLoad(String u, ImageView i){
+            url=u;
+            imageView=i;
+        }
+    }
+
+    class PhotosLoader implements Runnable {
+        PhotoToLoad photoToLoad;
+        PhotosLoader(PhotoToLoad photoToLoad){
+            this.photoToLoad=photoToLoad;
+        }
+
+        @Override
+        public void run() {
+            try{
+                if(imageViewReused(photoToLoad))
+                    return;
+                Bitmap bmp=getBitmap(photoToLoad.url);
+                memoryCache.put(photoToLoad.url, bmp);
+                if(imageViewReused(photoToLoad))
+                    return;
+                BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
+                handler.post(bd);
+            }catch(Throwable th){
+                th.printStackTrace();
+            }
+        }
+    }
+    /**
+     * 防止图片错位
+     * @param photoToLoad
+     * @return
+     */
+    boolean imageViewReused(PhotoToLoad photoToLoad){
+        String tag=imageViews.get(photoToLoad.imageView);
+        if(tag==null || !tag.equals(photoToLoad.url))
+            return true;
+        return false;
+    }
+    /**
+     *  用于在UI线程中更新界面
+     *
+     */
+    //Used to display bitmap in the UI thread
+    class BitmapDisplayer implements Runnable
+    {
+        Bitmap bitmap;
+        PhotoToLoad photoToLoad;
+        public BitmapDisplayer(Bitmap b, PhotoToLoad p){
+            bitmap=b;
+            photoToLoad=p;
+        }
+        public void run()
+        {
+            if(imageViewReused(photoToLoad))
+                return;
+            if(bitmap!=null)
+                photoToLoad.imageView.setImageBitmap(bitmap);
+            else
+                photoToLoad.imageView.setImageResource(stub_id);
+        }
+    }
+
+    public void clearCache() {
+        memoryCache.clear();
+        fileCache.clear();
+    }
+
+}

+ 70 - 0
app/src/main/java/com/ahau/againstpestinfo/utils/LoginUtils.java

@@ -0,0 +1,70 @@
+package com.ahau.againstpestinfo.utils;
+
+import android.content.Context;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by fanchunchun on 2018/3/27.
+ */
+
+public class LoginUtils {
+
+    /**
+     * 保存账户名,密码
+     *
+     * @param mContext 上下文
+     * @param username 用户名
+     * @param password 密码
+     * @return
+     */
+
+    public static boolean saveUtil(Context mContext, String username, String password) {
+        String userinfo = username + "##" + password;
+
+
+        try {
+            FileOutputStream fos = mContext.openFileOutput("userinfo.txt", Context.MODE_PRIVATE);
+            fos.write(userinfo.getBytes());
+            fos.close();
+            return true;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * @param mContext
+     * @return 提取账户名密码
+     */
+    public static Map<String, String> getUtil(Context mContext) {
+
+        try {
+            FileInputStream fis = mContext.openFileInput("userinfo.txt");
+            BufferedReader buffer = new BufferedReader(new InputStreamReader(fis));
+            String readLine = buffer.readLine();
+
+            String[] split = readLine.split("##");
+            HashMap<String, String> map = new HashMap<String, String>();
+            map.put("username", split[0]);
+            map.put("password", split[1]);
+
+            buffer.close();
+            fis.close();
+
+            return map;
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+}

+ 110 - 0
app/src/main/java/com/ahau/againstpestinfo/utils/MemoryCache.java

@@ -0,0 +1,110 @@
+package com.ahau.againstpestinfo.utils;
+
+import android.graphics.Bitmap;
+import android.util.Log;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/6
+ */
+
+public class MemoryCache {
+
+    private static final String TAG = "MemoryCache";
+    /**
+     *  放入缓存时是个同步操作
+     LinkedHashMap构造方法的最后一个参数true代表这个map里的元素将按照最近使用次数由少到多排列,即LRU
+     这样的好处是如果要将缓存中的元素替换,则先遍历出最近最少使用的元素来替换以提高效率
+     */
+    private Map<String, Bitmap> cache= Collections.synchronizedMap(
+            new LinkedHashMap<String, Bitmap>(10,1.5f,true));//Last argument true for LRU ordering
+    /**
+     *  缓存中图片所占用的字节,初始0,将通过此变量严格控制缓存所占用的堆内存
+     */
+    private long size=0;//current allocated size
+    /**
+     *  缓存只能占用的最大堆内存
+     */
+    private long limit=1000000;//max memory in bytes
+
+    public MemoryCache(){
+        //use 25% of available heap size
+        setLimit(Runtime.getRuntime().maxMemory()/4);
+    }
+
+    public void setLimit(long new_limit){
+        limit=new_limit;
+        Log.i(TAG, "MemoryCache will use up to "+limit/1024./1024.+"MB");
+    }
+
+    public Bitmap get(String id){
+        try{
+            if(!cache.containsKey(id))
+                return null;
+            //NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78
+            return cache.get(id);
+        }catch(NullPointerException ex){
+            ex.printStackTrace();
+            return null;
+        }
+    }
+
+    public void put(String id, Bitmap bitmap){
+        try{
+            if(cache.containsKey(id))
+                size-=getSizeInBytes(cache.get(id));
+            cache.put(id, bitmap);
+            size+=getSizeInBytes(bitmap);
+            checkSize();
+        }catch(Throwable th){
+            th.printStackTrace();
+        }
+    }
+    /**
+     *  严格控制堆内存,如果超过将首先替换最近最少使用的那个图片缓存
+     */
+    private void checkSize() {
+        Log.i(TAG, "cache size="+size+" length="+cache.size());
+        if(size>limit){
+            /**
+             * 先遍历最近最少使用的元素
+             *
+             */
+            //least recently accessed item will be the first one iterated
+            Iterator<Map.Entry<String, Bitmap>> iter=cache.entrySet().iterator();
+            while(iter.hasNext()){
+                Map.Entry<String, Bitmap> entry=iter.next();
+                size-=getSizeInBytes(entry.getValue());
+                iter.remove();
+                if(size<=limit)
+                    break;
+            }
+            Log.i(TAG, "Clean cache. New size "+cache.size());
+        }
+    }
+
+    public void clear() {
+        try{
+            //NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78
+            cache.clear();
+            size=0;
+        }catch(NullPointerException ex){
+            ex.printStackTrace();
+        }
+    }
+    /**
+     * 图片占用的内存
+     */
+    long getSizeInBytes(Bitmap bitmap) {
+        if(bitmap==null)
+            return 0;
+        return bitmap.getRowBytes() * bitmap.getHeight();
+    }
+}

+ 49 - 0
app/src/main/java/com/ahau/againstpestinfo/utils/Settings.java

@@ -0,0 +1,49 @@
+package com.ahau.againstpestinfo.utils;
+
+import android.os.Environment;
+
+import java.io.File;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/6
+ */
+
+public class Settings {
+    public static final String ROOT = Environment.getExternalStorageDirectory().getPath();
+    public static final String TEMPORARY_DIR = ROOT + "/teaassistant/temp/";
+    public static final String CACHE_DIR = ROOT + "/teaassistant/cache/";
+    public static final String TEST=ROOT+"/teaassistant/test/";
+    public static final String CACHE_CONSISTANTS_DIR = CACHE_DIR + "consistant/";
+
+    public static final String TAKE_PHOTO_FILE = TEMPORARY_DIR + "take_photo_temp.jpg";
+    public static final String TAKE_PHOTO_FILE1 = TEMPORARY_DIR + "take_photo_temp1.jpg";
+    public static final String TAKE_PHOTO_FILE2 = TEMPORARY_DIR + "take_photo_temp2.jpg";
+    public static final String TAKE_PHOTO_FILE_DEST = TEMPORARY_DIR + "take_photo.jpg";
+
+    public static final String AUDIO_RECORDER_PATH =TEMPORARY_DIR+"recorder.mp4";
+    public static final String IS_SHOPPING ="is_shopping";
+
+    public static final String AREA_CACHE_FILE = CACHE_CONSISTANTS_DIR + "area.txt";
+    public static final String CROPKIND_CACHE_FILE = CACHE_CONSISTANTS_DIR + "cropKind.txt";
+    public static final String CONSULT_CACHE_FILE = CACHE_CONSISTANTS_DIR + "consult.txt";
+    public static final String USER_INFO_CACHE_FILE = CACHE_CONSISTANTS_DIR + "userinfo.txt";
+    public static final String CROP_KINDS_CACHE_FILE = CACHE_CONSISTANTS_DIR + "cropKinds.txt";
+    public static final String SYSTEM_INFO_CACHE_FILE = CACHE_CONSISTANTS_DIR + "systemInfo.txt";
+    public static final String LOGIN_SUCCESS = "login_success";
+    public static boolean LOGIN_FLAG ;
+    public static boolean EXPERT_LOGIN_FLAG ;
+    public static boolean SHOP_LOGIN_FLAG ;
+    public static void createAppDirs() {
+        File dirFile = new File(TEMPORARY_DIR);
+        if (!dirFile.exists()) {
+            dirFile.mkdirs();
+        }
+        dirFile = new File(CACHE_CONSISTANTS_DIR);
+        if (!dirFile.exists()) {
+            dirFile.mkdirs();
+        }
+    }
+}

+ 12 - 0
app/src/main/java/com/ahau/againstpestinfo/utils/URLUtils.java

@@ -0,0 +1,12 @@
+package com.ahau.againstpestinfo.utils;
+
+/**
+ * Created by fanchunchun on 2018/3/27.
+ */
+
+public class URLUtils {
+    public static String defaultUrl = "http://175.27.233.172:8080/againstpest";
+    public static String AgainPestUrl = "http://175.27.233.172:8080/againstpest";
+    public static String PestUrl = defaultUrl + "/pestdic";
+    public static String PestCollectUrl = defaultUrl + "/pestsec";
+}

+ 423 - 0
app/src/main/java/com/ahau/againstpestinfo/utils/Utils.java

@@ -0,0 +1,423 @@
+package com.ahau.againstpestinfo.utils;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.RectF;
+import android.media.ExifInterface;
+import android.os.Environment;
+import android.os.StatFs;
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/5/6
+ */
+
+public class Utils {
+
+    public static final String TAG = "Utils";
+    public static final String THUMB_FOLDER = Settings.CACHE_DIR + "Thumb/";
+    public final static int MINIMUM_SPACE = 200; // 50M
+
+    public synchronized static Bitmap loadBitmap(String pathName, int outputW, int outputH, int rotate) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inJustDecodeBounds = true;
+        options.inScaled = false;
+        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
+        options.inDither = false;
+        int width, height;
+        Bitmap bmp = null;
+
+        if (pathName == null || pathName.equals(""))
+            return null;
+        File file = new File(pathName);
+        if (!file.exists())
+            return null;
+
+        options.inJustDecodeBounds = true;
+        try {
+            BitmapFactory.decodeFile(pathName, options);
+        } catch (OutOfMemoryError e) {
+            return null;
+
+        }
+        width = options.outWidth;
+        height = options.outHeight;
+
+        if (width == 0 || height == 0)
+            return null;
+
+        options.inDither = true;
+        options.inJustDecodeBounds = false;
+
+        if (outputW != 0 && outputH == 0) {
+            outputH = height * outputW / width;
+        } else if (outputW == 0 && outputH != 0) {
+            outputW = width * outputH / height;
+        }
+
+        if (outputW != 0 && outputH != 0) {
+            int ratio1 = 0;
+            float ratioSrc = (float) width / (float) height;
+            float ratioDes = (float) outputW / (float) outputH;
+            if (ratioSrc < ratioDes && height > outputH) {
+                outputW = outputH * width / height;
+            }
+            ratio1 = width / outputW;
+            options.inSampleSize = ratio1;
+        } else {
+            options.inSampleSize = 1;
+        }
+        try {
+            bmp = BitmapFactory.decodeFile(pathName, options);
+        } catch (OutOfMemoryError e) {
+            return null;
+        }
+        if (bmp == null) {
+            return null;
+        }
+
+        // int orientation = utils.getPicOrientation(pathName);
+        ExifInterface exif = null;
+        int orientation = 0;
+        try {
+            exif = new ExifInterface(pathName);
+        } catch (IOException e1) {
+            // TODO Auto-generated catch block
+            e1.printStackTrace();
+        }
+        if (exif != null) {
+            orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
+            switch (orientation) {
+                case ExifInterface.ORIENTATION_ROTATE_90:
+                    orientation = 90;
+                    break;
+                case ExifInterface.ORIENTATION_ROTATE_180:
+                    orientation = 180;
+                    break;
+                case ExifInterface.ORIENTATION_ROTATE_270:
+                    orientation = 270;
+                    break;
+                default:
+                    orientation = 0;
+            }
+        }
+        // if(rotate != 0 && bmp.getWidth() > bmp.getHeight()) {
+        // rotate = 90;
+        // } else
+        // rotate = 0;
+        orientation += rotate;
+        orientation %= 360;
+
+        if (orientation != 0) {
+            Matrix matrix = new Matrix();
+            matrix.setRotate(orientation);
+
+            Bitmap bmp2 = null;
+            try {
+                bmp2 = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, false);
+            } catch (OutOfMemoryError e) {
+                // Log.e("ZiiPhoto","can not create bitmap, out of memory!");
+            }
+            if (bmp2 != null) {
+                bmp.recycle();
+                bmp = bmp2;
+            }
+        }
+
+        int bh = bmp.getHeight();
+        if (outputH > 0 && bh > outputH) {
+            outputW = outputH * bmp.getWidth() / bmp.getHeight();
+            Bitmap sbmp = null;
+            try {
+                sbmp = Bitmap.createBitmap(outputW, outputH, Bitmap.Config.ARGB_8888);
+            } catch (OutOfMemoryError e) {
+                Utils.outLog("DecodeCache", "createStretchBitmap, OutOfMemoryError!");
+            }
+            if (sbmp != null) {
+                Canvas canvas = new Canvas(sbmp);
+                RectF dst = new RectF(0, 0, outputW, outputH);
+                canvas.drawBitmap(bmp, null, dst, null);
+                bmp.recycle();
+                bmp = sbmp;
+                canvas = null;
+            }
+        }
+
+        return bmp;
+
+    }
+
+    public synchronized static Bitmap loadBitmap(String pathName, int largeSide, int shortSide) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inJustDecodeBounds = true;
+        options.inScaled = false;
+        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
+        options.inDither = false;
+        float width, height;
+        Bitmap bmp = null;
+
+        if (pathName == null || pathName.equals(""))
+            return null;
+
+        File file = new File(pathName);
+        if (!file.exists())
+            return null;
+
+        options.inJustDecodeBounds = true;
+        try {
+            BitmapFactory.decodeFile(pathName, options);
+        } catch (OutOfMemoryError e) {
+            return null;
+
+        }
+        width = options.outWidth;
+        height = options.outHeight;
+
+        if (width == 0 || height == 0)
+            return null;
+
+        options.inDither = true;
+        options.inJustDecodeBounds = false;
+
+        float outputW = width;
+        float outputH = height;
+        float zoomFit = 1.0f;
+        double zoomGal = -1.0f;
+
+        if (width > height) {
+            outputW = largeSide;
+            outputH = (int) (height * outputW / width);
+        } else {
+            outputW = shortSide;
+            outputH = (int) (height * outputW / width);
+        }
+        zoomFit = (float) Math.min(outputH / height, outputW / width);
+        if (zoomGal < 0) {
+            zoomGal = zoomFit;
+        }
+
+        int ratio1 = 0;
+        ratio1 = (int) (width / outputW);
+        if (ratio1 < 1) {
+            ratio1 = 1;
+        }
+        options.inSampleSize = ratio1;
+        try {
+            bmp = BitmapFactory.decodeFile(pathName, options);
+        } catch (OutOfMemoryError e) {
+
+            String memStr = "alloc memory: " + Runtime.getRuntime().totalMemory() + "; free memory:"
+                    + Runtime.getRuntime().freeMemory() + "; max memory: " + Runtime.getRuntime().maxMemory();
+            Utils.outLog("decodeBitmap OutOfMemoryError", memStr);
+            Utils.outLog("decodeBitmap OutOfMemoryError", "options.inSampleSize=" + options.inSampleSize + " bw=" + width
+                    + " bh=" + height + " ow=" + outputW + " oh=" + outputH);
+            return null;
+        }
+        if (bmp == null) {
+            return null;
+        }
+
+        ExifInterface exif = null;
+        int orientation = 0;
+        try {
+            exif = new ExifInterface(pathName);
+        } catch (IOException e1) {
+            // TODO Auto-generated catch block
+            e1.printStackTrace();
+        }
+        if (exif != null) {
+            orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
+            switch (orientation) {
+                case ExifInterface.ORIENTATION_ROTATE_90:
+                    orientation = 90;
+                    break;
+                case ExifInterface.ORIENTATION_ROTATE_180:
+                    orientation = 180;
+                    break;
+                case ExifInterface.ORIENTATION_ROTATE_270:
+                    orientation = 270;
+                    break;
+                default:
+                    orientation = 0;
+            }
+        }
+
+        if (orientation != 0) {
+            Matrix matrix = new Matrix();
+            matrix.setRotate(orientation);
+
+            Bitmap bmp2 = null;
+            try {
+                bmp2 = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, false);
+            } catch (OutOfMemoryError e) {
+                // Log.e("ZiiPhoto","can not create bitmap, out of memory!");
+            }
+            if (bmp2 != null) {
+                bmp.recycle();
+                bmp = bmp2;
+            }
+        }
+
+        int bh = bmp.getHeight();
+        if (outputH > 0 && bh > outputH) {
+            outputW = outputH * bmp.getWidth() / bmp.getHeight();
+            Bitmap sbmp = null;
+            try {
+                sbmp = Bitmap.createBitmap((int) outputW, (int) outputH, Bitmap.Config.ARGB_8888);
+            } catch (OutOfMemoryError e) {
+            }
+            if (sbmp != null) {
+                Canvas canvas = new Canvas(sbmp);
+                RectF dst = new RectF(0, 0, outputW, outputH);
+                canvas.drawBitmap(bmp, null, dst, null);
+                bmp.recycle();
+                bmp = sbmp;
+                canvas = null;
+            }
+        }
+
+        return bmp;
+    }
+
+    /**
+     * create the folder with selected path.
+     *
+     * @param path
+     */
+    public static void createLocalDiskPath(String path) {
+        File folder = new File(path);
+        try {
+            if (!folder.exists()) {
+
+                boolean rtn = folder.mkdirs();
+                outLog("createLocalDiskPath", "rtn=" + rtn);
+            }
+        } catch (Exception e) {
+            outLog("createLocalDiskPath", "Exception");
+        }
+    }
+
+    public static int getCurrentDate() {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
+        Date curDate = new Date(System.currentTimeMillis());
+        String date = formatter.format(curDate);
+        return Integer.valueOf(date);
+    }
+
+    public static int haveSpace() {
+        long ret = readSDCard();
+        int value = 0;
+        long temp = ret / 1024 / 1024;
+        if (temp > MINIMUM_SPACE)
+            value = 0;
+        else if (ret == -1)
+            value = -1;
+        else
+            value = 1;
+        return value;
+    }
+
+    static public long readSDCard() {
+        String state = Environment.getExternalStorageState();
+
+        if (Environment.MEDIA_MOUNTED.equals(state)) {
+            File sdcardDir = Environment.getExternalStorageDirectory();
+            StatFs sf = new StatFs(sdcardDir.getPath());
+            long blockSize = sf.getBlockSize();
+            long blockCount = sf.getBlockCount();
+            long availCount = sf.getAvailableBlocks();
+            long freespace = availCount * blockSize;// / 1024 / 1024;
+            Utils.outLog("", "block size:" + blockSize + ",blockcount:" + blockCount + ",size:" + blockSize * blockCount / 1024
+                    + "KB");
+            Utils.outLog("", "avail count:" + availCount + ",free space:" + availCount * blockSize / 1024 / 1024 + "MB");
+            return freespace;
+        } else {
+            return -1;
+        }
+
+    }
+
+    public static void CopyStream(InputStream is, OutputStream os)
+    {
+        final int buffer_size=1024;
+        try
+        {
+            byte[] bytes=new byte[buffer_size];
+            for(;;)
+            {
+                int count=is.read(bytes, 0, buffer_size);
+                if(count==-1)
+                    break;
+                os.write(bytes, 0, count);
+            }
+        }
+        catch(Exception ex){}
+    }
+
+    public static boolean deleteDirectory(String dir) {
+        if (!dir.endsWith(File.separator)) {
+            dir = dir + File.separator;
+        }
+        File dirFile = new File(dir);
+        if (!dirFile.exists() || !dirFile.isDirectory()) {
+            return false;
+        }
+        boolean flag = true;
+        File[] files = dirFile.listFiles();
+        for (int i = 0; i < files.length; i++) {
+            if (files[i].isFile()) {
+                flag = deleteFile(files[i].getAbsolutePath());
+                if (!flag) {
+                    break;
+                }
+            } else {
+                flag = deleteDirectory(files[i].getAbsolutePath());
+                if (!flag) {
+                    break;
+                }
+            }
+        }
+
+        if (!flag) {
+            System.out.println("delete dir fail");
+            return false;
+        }
+
+        if (dirFile.delete()) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public static boolean deleteFile(String filePath) {
+        if (filePath == null) {
+            return false;
+        }
+        File file = new File(filePath);
+        if (file.isFile() && file.exists()) {
+            file.delete();
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+
+
+    public static void outLog(String tag, String msg) {
+        Log.d(TAG, tag + " >>>>>>>>>>>>>>>>>> " + msg);
+    }
+}

+ 36 - 0
app/src/main/java/com/ahau/againstpestinfo/view/BaseActivity.java

@@ -0,0 +1,36 @@
+package com.ahau.againstpestinfo.view;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.FragmentActivity;
+
+import com.ahau.againstpestinfo.presenter.BasePresenter;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/6
+ */
+
+public abstract class BaseActivity<V, T extends BasePresenter<V>> extends FragmentActivity {
+//表示层的引用
+    public T isearchPresenter;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        isearchPresenter = createPresenter();
+        isearchPresenter.attachView((V) this);
+    }
+
+    protected abstract T createPresenter();
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        isearchPresenter.detchView();
+    }
+}

+ 15 - 0
app/src/main/java/com/ahau/againstpestinfo/view/ISearchView.java

@@ -0,0 +1,15 @@
+package com.ahau.againstpestinfo.view;
+
+import java.util.List;
+
+/**
+ * 注释:
+ *
+ * @author fanchunchun
+ * @date 2018/4/20
+ */
+
+public interface ISearchView {
+    void setResearName(List<String> researName);
+    void setAreaid(List<String> areaid);
+}

BIN
app/src/main/res/drawable-hdpi/marker_cluster_10.png


BIN
app/src/main/res/drawable-hdpi/marker_cluster_100.png


BIN
app/src/main/res/drawable-hdpi/marker_cluster_20.png


BIN
app/src/main/res/drawable-hdpi/marker_cluster_30.png


BIN
app/src/main/res/drawable-hdpi/marker_cluster_50.png


BIN
app/src/main/res/drawable-hdpi/password.png


BIN
app/src/main/res/drawable-hdpi/phone.png


+ 106 - 0
app/src/main/res/layout/activity_login.xml

@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@null"
+    android:orientation="vertical">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="80dp"
+        android:gravity="center"
+        android:text="@string/app_name"
+        android:textColor="#f7f9f6"
+        android:textSize="30sp"
+        android:background="#d5190db7"/>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.1dp"
+        android:layout_marginTop="15dp"
+        android:background="#dbdbdb" />
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="60dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="fill_parent"
+            android:layout_marginLeft="17dp"
+            android:src="@drawable/phone" />
+
+        <EditText
+            android:id="@+id/username"
+            android:layout_width="match_parent"
+            android:layout_height="fill_parent"
+            android:layout_marginLeft="11dp"
+            android:background="@null"
+            android:hint="请输入用户名"
+
+            android:textColor="#b3b3b3"
+            android:textSize="18sp" />
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.1dp"
+        android:layout_marginLeft="41dp"
+        android:background="#dbdbdb" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="60dp"
+        android:layout_marginTop="2dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="fill_parent"
+            android:layout_marginLeft="14dp"
+            android:src="@drawable/password" />
+
+        <EditText
+            android:id="@+id/pwd"
+            android:layout_width="match_parent"
+            android:layout_height="fill_parent"
+            android:layout_marginLeft="12dp"
+            android:background="@null"
+            android:hint="请输入密码"
+            android:inputType="textPassword"
+            android:textColor="#b3b3b3"
+            android:textSize="18sp" />
+    </LinearLayout>
+
+    <ImageView
+        android:layout_width="match_parent"
+        android:layout_height="0.1dp"
+        android:background="#dbdbdb" />
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <CheckBox
+            android:id="@+id/remcb"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:checked="false"
+            android:text="记住密码"
+            android:textColor="#c90606"
+            android:textSize="18sp" />
+
+        <Button
+            android:id="@+id/login"
+            android:layout_width="200dp"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            android:text="登录"
+            android:textColor="#ffffffff"
+            android:textSize="18sp" />
+    </RelativeLayout>
+
+
+</LinearLayout>

+ 364 - 0
app/src/main/res/layout/activity_search.xml

@@ -0,0 +1,364 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+
+    <RelativeLayout
+        android:id="@+id/MyLayout_top"
+        android:layout_width="fill_parent"
+        android:layout_height="80dp"
+        android:layout_alignParentTop="true"
+        android:background="@color/colorPrimary"
+        android:gravity="center"
+        android:orientation="vertical" >
+
+        <LinearLayout
+            android:id="@+id/nongzi_searchbox"
+            android:layout_width="321dp"
+            android:layout_height="80dp">
+
+            <RelativeLayout
+                android:layout_width="107dp"
+                android:layout_height="80dp"
+                android:background="#ffffffff">
+
+                <TextView
+                    android:id="@+id/tv_people"
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:background="#ffffffff"
+                    android:text="调查人:"
+                    android:gravity="center"
+                    android:textColor="#ff3366cc"
+                    android:textSize="15sp" />
+
+                <ImageView
+                    android:id="@+id/line1"
+                    android:layout_width="match_parent"
+                    android:layout_height="5dp"
+                    android:layout_below="@id/tv_people"
+                    android:background="#ff3366cc" />
+
+                <TextView
+                    android:id="@+id/sp_peoplesearch"
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:layout_below="@id/tv_people"
+                    android:gravity="center"
+                    android:background="@null"
+                    android:hint="请选择"
+                    android:textColor="#343434"
+                    android:textSize="12sp" />
+
+            </RelativeLayout>
+
+            <ImageView
+                android:id="@+id/line"
+                android:layout_width="5dp"
+                android:layout_height="match_parent"
+                android:background="#ff3366cc" />
+
+            <RelativeLayout
+                android:layout_width="107dp"
+                android:layout_height="80dp"
+                android:background="#ffffffff">
+
+                <TextView
+                    android:id="@+id/tv_ke"
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:background="#ffffffff"
+                    android:text="日期:"
+                    android:gravity="center"
+                    android:textColor="#ff3366cc"
+                    android:textSize="15sp"
+                    />
+
+                <ImageView
+                    android:id="@+id/LINE3"
+                    android:layout_width="match_parent"
+                    android:layout_height="5dp"
+                    android:layout_below="@id/tv_ke"
+                    android:background="#ff3366cc" />
+                <TextView
+                    android:id="@+id/tv_dates"
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:layout_below="@id/LINE3"
+                    android:background="#ffffffff"
+                    android:textColor="#343434"
+                    android:textSize="12sp"
+                    android:gravity="center"
+                    android:hint="请选择"
+                    android:clickable="true"
+                    />
+
+            </RelativeLayout>
+            <ImageView
+                android:id="@+id/line12"
+                android:layout_width="5dp"
+                android:layout_height="match_parent"
+                android:layout_toRightOf="@id/sp_peoplesearch"
+                android:background="#ff3366cc" />
+
+            <RelativeLayout
+                android:layout_width="107dp"
+                android:layout_height="80dp"
+                android:background="#ffffffff">
+
+                <TextView
+                    android:id="@+id/tvareaid"
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:background="#ffffffff"
+                    android:text="区域编号:"
+                    android:gravity="center"
+                    android:textColor="#ff3366cc"
+                    android:textSize="15sp" />
+
+                <ImageView
+                    android:id="@+id/line22"
+                    android:layout_width="match_parent"
+                    android:layout_height="5dp"
+                    android:layout_below="@id/tvareaid"
+                    android:background="#ff3366cc" />
+
+                <TextView
+                    android:id="@+id/tv_areaids"
+                    android:layout_width="match_parent"
+                    android:layout_height="40dp"
+                    android:layout_below="@id/line22"
+                    android:gravity="center"
+                    android:background="@null"
+                    android:hint="请选择"
+                    android:textColor="#343434"
+                    android:textSize="12sp" />
+
+            </RelativeLayout>
+        </LinearLayout>
+
+        <Button
+            android:id="@+id/searchbtn"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_toRightOf="@id/nongzi_searchbox"
+            android:background="@null"
+            android:text="查询"
+            android:textColor="#ffffffff"
+            android:textSize="16sp"
+            />
+
+    </RelativeLayout>
+    <ImageView
+        android:id="@+id/line233"
+        android:layout_width="match_parent"
+        android:layout_height="10dp"
+        android:layout_below="@id/MyLayout_top"
+        android:background="#ff3366cc" />
+    <!-- 底部添加按钮 -->
+
+    <RelativeLayout
+        android:id="@+id/My_bottomLO"
+        android:layout_width="match_parent"
+        android:layout_height="250dp"
+        android:layout_alignParentBottom="true"
+        android:background="#ffffff"
+        android:clickable="true"
+        android:gravity="center"
+        android:visibility="gone" >
+
+        <ScrollView
+            android:id="@+id/nzscroll"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" >
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:focusable="true"
+                android:focusableInTouchMode="true"
+                android:orientation="vertical" >
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="150dp"
+                    android:layout_marginTop="10dp"
+                    android:background="#ffffff" >
+
+                    <ImageView
+                        android:id="@+id/iv_img"
+                        android:layout_width="150dp"
+                        android:layout_height="150dp"
+                        android:layout_marginLeft="5dp" />
+                    <ImageView
+                        android:id="@+id/iv_img2"
+                        android:layout_width="150dp"
+
+                        android:layout_height="150dp"
+                        android:layout_toRightOf="@id/iv_img"
+                        android:layout_marginLeft="5dp" />
+                    <TextView
+                        android:id="@+id/close"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentRight="true"
+                        android:layout_marginRight="10dp"
+                        android:text="关闭"
+                        android:textColor="@color/colorPrimary"
+                        android:textSize="16sp" />
+                </RelativeLayout>
+
+                <TextView
+                    android:id="@+id/tv_pestname"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+
+                    android:layout_marginLeft="10dp"
+                    android:layout_marginTop="1dp"
+                    android:textColor="@color/colorAccent"
+                    android:textSize="16sp" />
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="#ffffffff" >
+
+                    <TextView
+                        android:id="@+id/pestgrade_text"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:layout_marginLeft="10dp"
+                        android:background="#ffffffff"
+                        android:text="害虫时期:"
+                        android:textColor="@color/colorPrimary"
+                        android:textSize="14sp" />
+                    <TextView
+                        android:id="@+id/tv_pestgrade"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_toRightOf="@id/pestgrade_text"
+                        android:layout_marginLeft="10dp"
+                        android:textColor="#000000"
+                        android:textSize="14sp" />
+                </RelativeLayout>
+
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="#ffffffff" >
+
+                    <TextView
+                        android:id="@+id/date_text"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:layout_marginLeft="10dp"
+                        android:background="#ffffffff"
+                        android:text="调查日期:"
+                        android:textColor="@color/colorPrimary"
+                        android:textSize="14sp" />
+                    <TextView
+                        android:id="@+id/tv_date"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_toRightOf="@id/date_text"
+                        android:layout_marginLeft="10dp"
+                        android:textColor="#000000"
+                        android:textSize="14sp" />
+                </RelativeLayout>
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="#ffffffff" >
+
+                    <TextView
+                        android:id="@+id/areaid_text"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:layout_marginLeft="10dp"
+                        android:background="#ffffffff"
+                        android:text="区域编号:"
+                        android:textColor="@color/colorPrimary"
+                        android:textSize="14sp" />
+                    <TextView
+                        android:id="@+id/tv_areaid"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_toRightOf="@id/areaid_text"
+                        android:layout_marginLeft="10dp"
+                        android:textColor="#000000"
+                        android:textSize="14sp" />
+                </RelativeLayout>
+
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="#ffffffff" >
+
+                    <TextView
+                        android:id="@+id/researchpeople_text"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:layout_marginLeft="10dp"
+                        android:background="#ffffffff"
+                        android:text="调查人:"
+                        android:textColor="@color/colorPrimary"
+                        android:textSize="14sp" />
+                    <TextView
+                        android:id="@+id/tv_researchpeople"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_toRightOf="@id/researchpeople_text"
+                        android:layout_marginLeft="10dp"
+                        android:textColor="#000000"
+                        android:textSize="14sp" />
+                </RelativeLayout>
+                <RelativeLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="#ffffffff" >
+
+                    <TextView
+                        android:id="@+id/remark_text"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:layout_marginLeft="10dp"
+                        android:background="#ffffffff"
+                        android:text="备注:"
+                        android:textColor="@color/colorPrimary"
+                        android:textSize="14sp" />
+                    <TextView
+                        android:id="@+id/tv_remark"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_toRightOf="@id/remark_text"
+                        android:layout_marginLeft="10dp"
+                        android:textColor="#000000"
+                        android:textSize="14sp" />
+                </RelativeLayout>
+
+            </LinearLayout>
+        </ScrollView>
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@id/My_bottomLO"
+        android:layout_below="@id/line233"
+        android:gravity="center">
+
+        <fragment
+            android:id="@+id/map_view"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            class="com.amap.api.maps2d.SupportMapFragment" />
+    </RelativeLayout>
+
+</RelativeLayout>

+ 21 - 0
app/src/main/res/layout/my_car_cluster_view.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+     xmlns:android="http://schemas.android.com/apk/res/android"
+	 android:layout_width="wrap_content"
+	 android:layout_height="wrap_content"
+	 >
+	 <RelativeLayout
+	     android:id="@+id/my_car_bg"
+	     android:layout_width="wrap_content"
+	     android:layout_height="wrap_content"
+	      >
+	 <TextView
+	     android:id="@+id/my_car_num"
+	     android:layout_width="wrap_content"
+	     android:layout_height="wrap_content"
+	     android:gravity="center"
+	     android:layout_centerInParent="true"
+	     android:textSize="12sp" 
+	     />
+	 </RelativeLayout>
+</LinearLayout>

BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png


+ 6 - 0
app/src/main/res/values/colors.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#3F51B5</color>
+    <color name="colorPrimaryDark">#303F9F</color>
+    <color name="colorAccent">#FF4081</color>
+</resources>

+ 3 - 0
app/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">重大病虫害监测预警查询系统</string>
+</resources>

+ 12 - 0
app/src/main/res/values/styles.xml

@@ -0,0 +1,12 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+        <item name="windowNoTitle">true</item>
+    </style>
+
+</resources>

+ 4 - 0
app/src/main/res/xml/network_security_config.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<network-security-config>
+    <base-config cleartextTrafficPermitted="true" />
+</network-security-config>

+ 27 - 0
build.gradle

@@ -0,0 +1,27 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    
+    repositories {
+        google()
+        jcenter()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:3.1.2'
+        
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        google()
+        jcenter()
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}

+ 13 - 0
gradle.properties

@@ -0,0 +1,13 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true

BIN
gradle/wrapper/gradle-wrapper.jar


+ 5 - 0
gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists

+ 172 - 0
gradlew

@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"

+ 84 - 0
gradlew.bat

@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 1 - 0
settings.gradle

@@ -0,0 +1 @@
+include ':app'