最近写了个叫《行踪记录仪》的手机软件,用了百度云来记录每个用户的最近位置,以便各用户能在地图上找到附近的人,为此写了个类来读写数据,大致如下:

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject; import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.util.Log; import com.baidu.location.BDLocation;
import com.baidu.platform.comapi.basestruct.GeoPoint; /**
* 百度云检索类
*
* @author Robert Tsing
*/
public class LBSCloud { private static String mTAG = "NetWorkManager"; // 百度云检索API URI
private static final String SEARCH_URI_NEARBY = "http://api.map.baidu.com/geosearch/v2/nearby?";
private static final String SEARCH_URI_LOCAL = "http://api.map.baidu.com/geosearch/v2/local?";
private static final String SEARCH_URI_BOUND = "http://api.map.baidu.com/geosearch/v2/bound?";
private static final String SEARCH_URI_DETAIL = "http://api.map.baidu.com/geosearch/v2/detail?";
private static final String SEARCH_URI_POI_LIST = "http://api.map.baidu.com/geodata/v2/poi/list?"; private static final String POST_URI_CREATE = "http://api.map.baidu.com/geodata/v2/poi/create";
private static final String POST_URI_UPDATE = "http://api.map.baidu.com/geodata/v2/poi/update";
private static final String POST_URI_DELETE = "http://api.map.baidu.com/geodata/v2/poi/delete"; public static final int SEARCH_TYPE_NEARBY = 1;
public static final int SEARCH_TYPE_LOCAL = 2;
public static final int SEARCH_TYPE_BOUND = 3;
public static final int SEARCH_TYPE_DETAIL = 4;
public static final int SEARCH_TYPE_POI_LIST = 5; public static final int POST_TYPE_CREATE = 6;
public static final int POST_TYPE_UPDATE = 7;
public static final int POST_TYPE_DELETE = 8; public static final int RESULT_GET = 0;
public static final int RESULT_POST = 1; private static int currSearchType = 0; // 云检索公钥
// private static String ak = "A321c32037052461d6958b34a3e?????";
private static String ak = "E7d8211ca35fc64e838ee15b7d5?????";
private static String geotable_id = "?????";
private static String coord_type = "3"; private static String CMWAP_HOST = "10.0.0.172";
private static String CTWAP_HOST = "10.0.0.200"; private static int TIME_OUT = 12000;
private static int retry = 3;
private static boolean Getting = false; /**
* 云检索访问
*
* @param filterParams
* 访问参数,key为filter时特殊处理。
* @param handler
* 数据回调Handler
* @param networkType
* 手机联网类型
* @return
*/ //读取的
public static boolean request(final int searchType,
final HashMap<String, String> filterParams, final Handler handler) {
if (Getting || filterParams == null)
return false;
Getting = true; new Thread() {
public void run() {
int count = retry;
while (count > 0) {
try {
// 根据过滤选项拼接请求URL
String requestURL = "";
if (searchType > 0) {
currSearchType = searchType;
}
switch (currSearchType) {
case SEARCH_TYPE_NEARBY:
requestURL = SEARCH_URI_NEARBY;
break;
case SEARCH_TYPE_LOCAL:
requestURL = SEARCH_URI_LOCAL;
break;
case SEARCH_TYPE_BOUND:
requestURL = SEARCH_URI_BOUND;
break;
case SEARCH_TYPE_DETAIL:
requestURL = SEARCH_URI_DETAIL;
break;
case SEARCH_TYPE_POI_LIST:
requestURL = SEARCH_URI_POI_LIST;
break;
default:
return;
}
requestURL += "ak=" + ak + "&geotable_id="
+ geotable_id; String filter = null;
Iterator iter = filterParams.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String key = entry.getKey().toString();
String value = entry.getValue().toString(); if (key.equals("filter")) {
filter = value;
} else {
if (key.equals("region")
&& currSearchType == SEARCH_TYPE_NEARBY) {
continue;
}
requestURL = requestURL + "&" + key + "="
+ value;
}
} if (filter != null && !filter.equals("")) {
// substring(3) 为了去掉"|" 的encode "%7C"
requestURL = requestURL + "&filter="
+ filter.substring(3);
} Log.d("request url:", requestURL); HttpGet httpRequest = new HttpGet(requestURL);
HttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT,
TIME_OUT);
httpClient.getParams().setParameter(
CoreConnectionPNames.SO_TIMEOUT, TIME_OUT); HttpProtocolParams.setUseExpectContinue(
httpClient.getParams(), false); String networkType = MapApplication.networkType;
if (networkType.equals("cmwap")) {
HttpHost proxy = new HttpHost(CMWAP_HOST, 80,
"http");
httpClient.getParams().setParameter(
ConnRoutePNames.DEFAULT_PROXY, proxy);
} else if (networkType.equals("ctwap")) {
HttpHost proxy = new HttpHost(CTWAP_HOST, 80,
"http");
httpClient.getParams().setParameter(
ConnRoutePNames.DEFAULT_PROXY, proxy);
} // ((AbstractHttpClient)
// httpClient).getCookieSpecs().register("chinasource",
// new CookieSpecFactory() {
// public CookieSpec newInstance(HttpParams params) {
// return new LenientCookieSpec();
// }
// });
httpClient.getParams().setParameter(
ClientPNames.COOKIE_POLICY,
CookiePolicy.BROWSER_COMPATIBILITY); HttpResponse httpResponse = httpClient
.execute(httpRequest);
int status = httpResponse.getStatusLine()
.getStatusCode();
if (status == HttpStatus.SC_OK) {
String result = EntityUtils.toString(
httpResponse.getEntity(), "utf-8");
// Header a =
// httpResponse.getEntity().getContentType();
Message msgTmp = handler
.obtainMessage(MapActivity.MSG_NET_SUCC);
msgTmp.obj = result;
msgTmp.arg1 = RESULT_GET;
msgTmp.sendToTarget(); break;
} else {
httpRequest.abort();
Message msgTmp = handler
.obtainMessage(MapActivity.MSG_NET_STATUS_ERROR);
msgTmp.obj = "HttpStatus error";
msgTmp.sendToTarget();
} } catch (Exception e) {
Log.e("request", "网络异常,请检查网络后重试!");
e.printStackTrace();
} count--;
} if (count <= 0 && handler != null) {
Message msgTmp = handler
.obtainMessage(MapActivity.MSG_NET_TIMEOUT);
msgTmp.sendToTarget();
} Getting = false; }
}.start(); return true;
} public static boolean searchNear(GeoPoint point, Handler handler) {
return LBSCloud.request(LBSCloud.SEARCH_TYPE_NEARBY,
getRequestParams(point), handler);
} private static HashMap<String, String> getRequestParams(GeoPoint point) {
HashMap<String, String> map = new HashMap<String, String>();
LocationModel lm = new LocationModel(point);
map.put("q", "");
map.put("location", lm.getLocation());
map.put("radius", "100000");
map.put("orderby", "create_date:-1");
return map;
} //写入的
public static boolean postData(final int postType,
final List<BasicNameValuePair> params) {
if (params == null)
return false;
try {
// 根据过滤选项拼接请求URL
String requestURL = "";
switch (postType) {
case POST_TYPE_CREATE:
requestURL = POST_URI_CREATE;
break;
case POST_TYPE_UPDATE:
requestURL = POST_URI_UPDATE;
break;
case POST_TYPE_DELETE:
requestURL = POST_URI_DELETE;
break;
default:
return false;
} Log.d("request url:", requestURL);
params.add(new BasicNameValuePair("geotable_id", geotable_id));
params.add(new BasicNameValuePair("ak", ak)); HttpPost httpPost = new HttpPost(requestURL);
httpPost.setEntity(new UrlEncodedFormEntity(params, "utf-8")); HttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT, TIME_OUT);
httpClient.getParams().setParameter(
CoreConnectionPNames.SO_TIMEOUT, TIME_OUT);
HttpProtocolParams.setUseExpectContinue(httpClient.getParams(),
false); String networkType = MapApplication.networkType;
if (networkType.equals("cmwap")) {
HttpHost proxy = new HttpHost(CMWAP_HOST, 80, "http");
httpClient.getParams().setParameter(
ConnRoutePNames.DEFAULT_PROXY, proxy);
} else if (networkType.equals("ctwap")) {
HttpHost proxy = new HttpHost(CTWAP_HOST, 80, "http");
httpClient.getParams().setParameter(
ConnRoutePNames.DEFAULT_PROXY, proxy);
}
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY,
CookiePolicy.BROWSER_COMPATIBILITY);
HttpResponse httpResponse = httpClient.execute(httpPost);
int status = httpResponse.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK) {
String resp = EntityUtils.toString(httpResponse.getEntity(),
"utf-8");
Log.v("KKHP", resp);
JSONObject jsonObject = new JSONObject(resp);
String statuscode = jsonObject.getString("status");
String statusmsg = jsonObject.getString("message");
int liret = Integer.parseInt(statuscode);
// 0:成功
switch(liret){
case 0:
case 21:
return true;
default:
Log.e("Post", statusmsg);
}
} else {
httpPost.abort();
}
} catch (Exception e) {
Log.e("Post", "网络异常,请检查网络后重试!");
e.printStackTrace();
}
return false;
} public static boolean deletePoi() {
List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
//http://api.map.baidu.com/geodata/v2/column/update
//phone must be set is_index_field = 1
list.add(new BasicNameValuePair("phone", MapApplication.phoneNumber)); return postData(POST_TYPE_DELETE, list);
} public static boolean createPoi(BDLocation location) {
//delete first
deletePoi(); return postData(POST_TYPE_CREATE, getPostParams(location));
} private static List<BasicNameValuePair> getPostParams(BDLocation location) { List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>(); list.add(new BasicNameValuePair("latitude", String.valueOf(location
.getLatitude())));
list.add(new BasicNameValuePair("longitude", String.valueOf(location
.getLongitude())));
//if (location.hasAddr()) {
list.add(new BasicNameValuePair("address", location.getAddrStr()));
//}
list.add(new BasicNameValuePair("phone", MapApplication.phoneNumber));
list.add(new BasicNameValuePair("locate_date", MyDatabase
.getCurrentTime())); list.add(new BasicNameValuePair("title", MapApplication.title));
list.add(new BasicNameValuePair("sex", MapApplication.sex));
list.add(new BasicNameValuePair("head", ""));
list.add(new BasicNameValuePair("coord_type", coord_type)); return list;
}
}

主要是两个函数,一个读request,一个写postdata(包括保存、更新和删除),其中读操作参考了网上一些资料,写操作网上找不到合用的资料,主要是自己硺磨出来的
为了调用方便,另外写了一些函数,这样调用就简单了,比如:LBSCloud.createPoi(location)就保存一个位置到网上数据表中去了,LBSCloud.searchNear(myPoint, mHandler)就查找附近的人了,mHandler里处理结果,如:

private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_NET_TIMEOUT:
break;
case MSG_NET_STATUS_ERROR:
break;
case MSG_NET_SUCC:
if(msg.arg1==LBSCloud.RESULT_GET){
String result = msg.obj.toString();
try {
JSONObject json = new JSONObject(result);
parse(json);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
}
}
};
/*
* 解析返回数据
*/
private void parse(JSONObject json) {
List<String> list = new ArrayList<String>();
try {
int status = json.getInt("status");
Log.d("Status", ""+status);
if(status!=0){
return;
}
//int total = json.getInt("total");
JSONArray jsonArray;
try{
jsonArray = json.getJSONArray("pois");
}catch(JSONException e){
jsonArray = json.getJSONArray("contents");
}
if (jsonArray != null && jsonArray.length() <= 0) {
Toast.makeText(this, R.string.msg_search_near, Toast.LENGTH_SHORT).show();
} else {
points.clear();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObj = (JSONObject) jsonArray.opt(i);
String phone, address;
try{
phone = jsonObj.getString("phone");
}catch(JSONException e){
Log.e("get phone error", e.getMessage());
continue;
}
//same body just show one time!
if(list.contains(phone))
continue; //need not show myself!
if(phone.equals(MapApplication.phoneNumber))
continue; list.add(phone);
try{
address = jsonObj.getString("address");
} catch(JSONException e){
address = jsonObj.getString("province") +
jsonObj.getString("city") +
jsonObj.getString("district");
}
JSONArray locArray = jsonObj.getJSONArray("location");
double longitude = locArray.getDouble(0);
double latitude = locArray.getDouble(1); LocationModel lm = new LocationModel(longitude, latitude);
lm.setPhone(phone);
lm.setAddr(address);
lm.setSex(jsonObj.getString("sex"));
lm.setHead(jsonObj.getString("head"));
lm.setName(jsonObj.getString("title"));
lm.setLocateDate(jsonObj.getString("locate_date"));
lm.setUpload(true);
points.add(lm);
}
addItemizedOverlay();
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

软件大概是这个样子:

这个 功能还在改进中,有时间将整理出整个软件设计思路来公诸同好!

百度地图LBS云平台读写数据操作类的更多相关文章

  1. 百度地图LBS开放平台AK一直没有用

    http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924;114.21892734521,29.57542 ...

  2. 使用百度地图LBS创建自定义标注

    <body> <div id="allmap"></div> <div class="sel_container" i ...

  3. C#的百度地图开发(二)转换JSON数据为相应的类

    原文:C#的百度地图开发(二)转换JSON数据为相应的类 在<C#的百度地图开发(一)发起HTTP请求>一文中我们向百度提供的API的URL发起请求,并得到了返回的结果,结果是一串JSON ...

  4. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.3

    /** * 百度地图使用工具类-v1.5 * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email b ...

  5. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.2

    /** * 百度地图使用工具类-v1.5 * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email b ...

  6. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.1

    /** * 百度地图使用工具类-v1.5 * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email b ...

  7. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.0

    /** * 百度地图使用工具类-v1.5 * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email b ...

  8. 百度地图V2.0实践项目开发工具类bmap.util.js V1.4

    /** * 百度地图使用工具类-v2.0(大眾版) * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @em ...

  9. 我的DbHelper数据操作类

    其实,微软的企业库中有一个非常不错的数据操作类了.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过微软的企业库框架了...但是还是要&q ...

随机推荐

  1. HDU 4638 Group 【树状数组,分块乱搞(莫队算法?)】

    根据题目意思,很容易得出,一个区间里面连续的段数即为最少的group数. 题解上面给的是用树状数组维护的. 询问一个区间的时候,可以一个一个的向里面添加,只需要判断a[i]-1 和 a[i]+1是否已 ...

  2. DataGridView绑定BindingList<T>带数据排序的类

    本文章转载:http://yuyingying1986.blog.hexun.com/30905610_d.html DataGridView绑定List<T>类时候,不会自动的进行排序. ...

  3. [2012山东省第三届ACM大学生程序设计竞赛]——n a^o7 !

    n a^o7 ! 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2413 Time Lim ...

  4. uva:10340 - All in All(字符串匹配)

    题目:10340 - All in All 题目大意:给出字符串s和t,问s是否是t的子串.s若去掉某些字符能和t一样,那么t是s的子串. 解题思路:匹配字符.t的每一个字符和s中的字符匹配.注意这里 ...

  5. Struts1 中实现Action跳转地址栏变化的方法

    Action进行跳转,有时候地址栏不变化,如果重复刷新就会重复提交, 这里一般需要进行重定向: 1.在xml里面进行配置 <action path="/checkCdconfirmEn ...

  6. jquery动画总结

    基本动画 show() //直接显示元素,没有动画 show(speed, [callback]) //有动画,有回调函数 hide() //直接隐藏元素,没有动画 hide(speed, [call ...

  7. flash文件运动节奏的控制

    flash里面,比较难的是控制运动的节奏.参考了几个韩国网站的fla源文件,提出以下几个建议与参考. 1,flash文件里面,每秒的帧数 设置为 120,或者一个比较大的数字(90,60).普通的文件 ...

  8. XMPP基础

    概要 1.即时通讯技术简介2.XMPP诞生的由来3.XMPP特点4.XMPP的基本结构5.XMPP工作原理6.XMPP的优缺点7.OSI七层模型8.IP地址.端口号.传输协议9.TCP和UDP的区别1 ...

  9. Android Studio使用技巧

    1.ctrl+shift+F格式化代码时自动换行: 在settings里面找到Editor>General>Soft Wraps>设置选中Use soft wraps in edit ...

  10. IOS 真机调试以及发布应用 2

    参考网站:http://my.oschina.net/u/1245365/blog/196420 已经有开发证书的直接跳过第一步 第一步:申请“开发证书” 进入苹果开发者99美元账号: 选择:Cert ...