高德地图应用——与云图后台交互
用途:
在高德地图中查看已存在的兴趣点信息,并上报GPS位置错误。
准备工作:
是在高德申请开发账号,建立一个云图。(过程略。)
_name字段作为唯一标示。
云图的表增加一个字段reportid,用以辨别是哪个终端上报的位置信息,防止重复上报。
主要代码:
1.开启GPS定位:
private void initgps() { myLocation.setText("开始定位..."); locationManager = LocationManagerProxy.getInstance(PoiActivity.this); // API定位采用GPS定位方式,第一个参数是定位provider,第二个参数时间最短是2000毫秒,第三个参数距离间隔单位是米,第四个参数是定位监听者 // locationManager.requestLocationUpdates( // LocationManagerProxy.GPS_PROVIDER, 2000, 10, this); locationManager.requestLocationData(LocationManagerProxy.GPS_PROVIDER, 2000, 10, this); }
2.关闭GPS定位:
private void stopgps() { myLocation.setText("定位停止"); locationisok = false; if (locationManager != null) { locationManager.removeUpdates(this); } locationManager = null; }
3.获取当前GPS信息
/** * gps定位回调方法 */ @Override public void onLocationChanged(AMapLocation location) { if (location != null) { Double geoLat = location.getLatitude(); Double geoLng = location.getLongitude(); this.lat = geoLat; this.lng = geoLng; String str = ("定位成功:(" + geoLng + "," + geoLat + ")" + "\n精 度 :" + location.getAccuracy() + "米" + "\n定位方式:" + location.getProvider() + "\n定位时间:" + AMapUtil .convertToTime(location.getTime())); myLocation.setText(str); thisplocation = geoLng + "," + geoLat; locationisok = true; } else { locationisok = false; } }
4.获取手机串号作为reportid
private String getimei() { String is = null; try { TelephonyManager telephonyManager = (TelephonyManager) cx .getSystemService(Context.TELEPHONY_SERVICE); is = telephonyManager.getDeviceId(); } catch (Exception e) { is = ""; } return is; }
5.查询是否重复HttpGet方法
public int checkexist(String sname, String srid) { // String sname 兴趣点名称, String srid 电话IMEI String BASEURL = "http://yuntuapi.amap.com/datamanage/data/list?key=你的KEY" + "limit=10&page=1&filter="; String LASTURL = "&tableid=你的tableid"; String asks = ""; // 检查IMEI是否为空 srid.replaceAll(" ", ""); if (srid == null || srid.length() <= 0) { asks = "_name:" + sname; } else { asks = "_name:" + sname + "+reportid:" + srid; } ; String countid = "10";// 未成功获取信息,返回>1的数值供判断。 try { // 创建一个HttpClient对象 HttpClient httpclient = new DefaultHttpClient(); HttpGet request = new HttpGet(BASEURL + asks + LASTURL); request.addHeader("Accept", "text/json"); // JSON的解析过程 HttpResponse response = httpclient.execute(request); // 获取HttpEntity HttpEntity entity = response.getEntity(); int code = response.getStatusLine().getStatusCode(); if (code == 200) { // 获取响应的结果信息 String json = EntityUtils.toString(entity, "UTF-8"); // JSON的解析过程 if (json != null) { JSONObject jsonObject = new JSONObject(json); countid = jsonObject.get("count").toString(); testcount = countid; testinfo = jsonObject.get("info").toString(); } } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return Integer.valueOf(countid).intValue(); }
6.上报GPS位置信息HttpPost方法
private boolean postreport(String sname, String sid, String slocation) { String BASEURL = "http://yuntuapi.amap.com/datamanage/data/create?"; String KEYS = "你的KEY"; String TID = "你的tableid"; try { HttpClient httpclient = new DefaultHttpClient(); String uri = BASEURL;// HttpPost httppost = new HttpPost(uri); httppost.addHeader("Content-Type", "application/x-www-form-urluncoded"); JSONObject obj = new JSONObject(); obj.put("_name", sname); obj.put("_location", slocation); obj.put("reportid", sid); List<NameValuePair> formparams = new ArrayList<NameValuePair>(); formparams.add(new BasicNameValuePair("key", KEYS)); formparams.add(new BasicNameValuePair("tableid", TID)); formparams.add(new BasicNameValuePair("data", obj.toString())); UrlEncodedFormEntity uefEntity; uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); HttpResponse response; response = httpclient.execute(httppost); // 检验状态码,如果成功接收数据 int code = response.getStatusLine().getStatusCode(); if (code == 200) { String rev = EntityUtils.toString(response.getEntity());// 返回json格式: obj = new JSONObject(rev); String infos = obj.getString("info"); String stats = obj.getString("status"); if (infos.equals("OK")) { return true; } } } catch (ClientProtocolException e) { } catch (IOException e) { } catch (Exception e) { } return false; }
7.更新界面线程
private class Asynpost extends AsyncTask<Void, Void, String> { private final String TAG = "dopost"; // onPreExecute方法在execute()后执行 @Override protected void onPreExecute() { Log.i(TAG, "onPreExecute() enter"); postisok = false; } // onCancelled方法用于取消Task执行,更新UI @Override protected void onCancelled() { Log.i(TAG, "onCancelled() called"); postisok = false; } @Override protected void onPostExecute(String result) { // mPoiTextView.setText(result); dissmissProgressDialog(); if (result.equals("true")) { Toast.makeText(cx, "您的信息已成功提交", Toast.LENGTH_LONG) .show(); }else if (result.equals("false")) { Toast.makeText(cx, "您的信息提交失败,原因是:您已经提交过信息。", Toast.LENGTH_LONG).show(); }else if (result.equals("error")){ Toast.makeText(cx, "您的信息提交失败,原因是:可能是网络问题,", Toast.LENGTH_LONG).show(); }; } @Override protected String doInBackground(Void... arg0) { // TODO Auto-generated method stub String rr = ""; if (checkexist(thispname, repid) == 0) { if (postreport(thispname, repid, thisplocation)){ postisok = true; rr = "true"; }else{ postisok = false; rr = "error"; }; } else { postisok = false; rr = "false"; } return rr; } }