android studio端代码
MainActivity
package com.andros230.trajectory; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiManager; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationClientOption.AMapLocationMode; import com.amap.api.location.AMapLocationListener; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import java.util.HashMap; import java.util.Map; public class MainActivity extends Activity implements AMapLocationListener { private AMapLocationClient locationClient = null; private AMapLocationClientOption locationOption = null; private Map<String, String> params; private TextView show; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); show = (TextView) findViewById(R.id.tvShow); Button save = (Button) findViewById(R.id.save); Button history = (Button) findViewById(R.id.history); locationClient = new AMapLocationClient(this); locationOption = new AMapLocationClientOption(); locationOption.setLocationMode(AMapLocationMode.Battery_Saving); locationClient.setLocationListener(this); locationOption.setOnceLocation(true); locationClient.setLocationOption(locationOption); locationClient.startLocation(); save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String url = "http://192.168.0.119:8080/web230/aa230"; RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { if (response.equals("YES")) { show.setText("保存成功"); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { @Override protected Map<String, String> getParams() { return params; } }; requestQueue.add(postRequest); } }); history.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, history.class); MainActivity.this.startActivity(intent); } }); } // 定位监听 @Override public void onLocationChanged(AMapLocation location) { if (null != location && location.getErrorCode() == 0) { //获取MAC WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); String Mac = wifi.getConnectionInfo().getMacAddress(); params = new HashMap<>(); params.put("Mac", Mac); params.put("Longitude", location.getLongitude() + ""); params.put("Latitude", location.getLatitude() + ""); params.put("Accuracy", location.getAccuracy() + ""); params.put("Province", location.getProvince() + ""); params.put("City", location.getCity() + ""); params.put("District", location.getDistrict() + ""); params.put("Address", location.getAddress() + ""); show.setText("当前位置 " + location.getAddress()); } } @Override protected void onDestroy() { super.onDestroy(); if (null != locationClient) { locationClient.onDestroy(); locationClient = null; locationOption = null; } } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.andros230.trajectory.MainActivity"> <TextView android:id="@+id/tvShow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="定位中..." android:layout_alignParentTop="true" android:layout_centerHorizontal="true"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" android:id="@+id/save" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查看历史" android:id="@+id/history" android:layout_centerVertical="true" android:layout_centerHorizontal="true"/> </RelativeLayout>
history
package com.andros230.trajectory; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class history extends Activity { private ListView list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_history); list = (ListView) findViewById(R.id.history_list); String url = "http://192.168.0.119:8080/web230/history"; RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Gson gson = new Gson(); List<Map<String, Object>> list2 = gson.fromJson(response, new TypeToken<List<Map<String, Object>>>() { }.getType()); List<String> data = new ArrayList<>(); for (Map<String, Object> map : list2) { data.add(map.get("time")+" \n"+map.get("add")); } list.setAdapter(new ArrayAdapter<>(getApplicationContext(), R.layout.andros_list_item, data)); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<>(); params.put("key", "key"); return params; } }; requestQueue.add(postRequest); } }
activity_history.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="#000000" android:orientation="vertical"> <ListView android:id="@+id/history_list" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
还有自定义列表格式
andros_list_item.xml
<?xml version="1.0" encoding="utf-8"?> <TextView android:id="@android:id/text1" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:textColor="#000000" android:textSize="14sp" />
导入jar包:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest package="com.andros230.trajectory" xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!-- 用于访问网络,网络定位需要上网 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 用于读取手机当前的状态 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".history" android:theme="@style/AppTheme"> </activity> <service android:name="com.amap.api.location.APSService"/> <meta-data android:name="com.amap.api.v2.apikey" android:value="51cb221b5589f1e068c698bb4d7da400"> </meta-data> </application> </manifest>
注:高德地图的KEY需要绑定apk的包名和签名密钥的SHA1码才能正常使用,详情查看 高德地图开放平台
服务端
aa230
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class aa230 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String Mac = request.getParameter("Mac");
String Longitude = request.getParameter("Longitude");
String Latitude = request.getParameter("Latitude");
String Accuracy = request.getParameter("Accuracy");
String Province = request.getParameter("Province");
String City = request.getParameter("City");
String District = request.getParameter("District");
String Address = request.getParameter("Address");
//获取系统当前时间
Date dt = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String Time =df.format(dt);
DB db = new DB();
db.update("INSERT INTO trajectory (Mac, Time, Longitude, Latitude, Accuracy, Province, City, District, Address)VALUES('"+Mac+"','"+Time+"','"+Longitude+"','"+Latitude+"','"+Accuracy+"','"+Province+"','"+City+"','"+District+"','"+Address+"')");
db.close();
PrintWriter writer = response.getWriter();
writer.write("YES");
writer.flush();
writer.close();
}
}
history
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;
public class history extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
try {
DB db = new DB();
ResultSet rs = db.query("SELECT * FROM trajectory order by Time DESC");
while (rs.next()) {
Map<String,Object> map = new HashMap<String,Object>();
map.put("time", rs.getString("Time"));
map.put("add", rs.getString("Address"));
list.add(map);
}
db.close();
} catch (SQLException e) {
e.printStackTrace();
}
PrintWriter writer = response.getWriter();
Gson gson = new Gson();
writer.write(gson.toJson(list).toString());
writer.flush();
writer.close();
}
}
MySQL数据库字段: