Android studio 百度地图开发(5)查询周边服务(加油站)

email:chentravelling@163.com

开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0

  • 百度地图应用(1):Android studio 百度地图开发(1)配置工程、显示地图
  • 百度地图应用(2):Android studio 百度地图开发(2)地图定位
  • 百度地图应用(3):Android studio 百度地图开发(3)地图导航
  • 百度地图应用(4):Android studio 百度地图开发(4)触摸选点、地理编码

一.功能描述

大致功能为:通过百度地图定位获得当前位置,然后通过加油站数据接口(https://www.juhe.cn/docs/api/id/7)搜索周边的加油站信息,并在地图上显示。这里,我把访问加油站数据接口的部分放在了服务器上,因为后期还有一些其他功能,不可能都放在手机端去实现。

二.实现部分

1.加油站数据接口

需要先申请api_key,很简单,没有百度地图的API_KEY那么复杂,地址:https://www.juhe.cn/docs/api/id/7。

2.搭建服务器

这部分,本人不知道怎么去描述,因为有web基础,使用过SSM(spring+springMVC+Mybatis)架构,所以还是继续使用SSM。关于SSM架构的服务器环境搭建,资料很多,就不赘述了,而且,主要功能并不在于服务器上,换一个架构甚至“没有架构”都行。

在服务器端主要要实现对加油站数据的访问,按照官方的API说明,通过以下代码实现了数据访问:

package com.intveh.component.gas.controller;import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;import net.sf.json.JSONArray;
import net.sf.json.JSONObject;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.intveh.component.car.model.Car;@Controller
public class GasController {public static final String DEF_CHATSET = "UTF-8";public static final int DEF_CONN_TIMEOUT = 30000;public static final int DEF_READ_TIMEOUT = 30000;public static String userAgent =  "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";/*** 请求接口地址*/public static String url = "http://apis.juhe.cn/oil/local";/*** AppKey*/public static String key = "cbee44f8a21c371***********51e8b9";//改为自己的key/*** 查询附近的加油站* * @param 经纬度*            * @return 查询结果 json*/@RequestMapping(value = "/gas/searchNear")@ResponseBodypublic void searchNear(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{//response.setHeader("Access-Control-Allow-Origin", "*");//Car car = carDAO.getCar(carId);//return car;String result = "";//System.out.println("开始搜索");/*** 纬度*/String latitude = request.getParameter("latitude");/*** 经度*/String longitude = request.getParameter("longitude");/*** 搜索范围*/String radius = request.getParameter("radius")==null?"1000":request.getParameter("radius");/*** 页数*/String page = "1";/*** 格式*/String format = "1";//System.out.println(longitude+","+latitude+","+radius+","+page+","+format);Map params = new HashMap();if(latitude!=null&&longitude!=null&&!"".equals(latitude)&&!"".equals(longitude)){params.put("lon", longitude);params.put("lat", latitude);params.put("r", radius);params.put("page", page);params.put("format",format);    params.put("key", key);JSONObject object = new JSONObject();//System.out.println(longitude+","+latitude+","+radius+","+page+","+format);try{result =net(url, params, "GET");object = JSONObject.fromObject(result);if(object.getInt("error_code")==0){System.out.println(object.get("result"));}else{System.out.println(object.get("error_code")+":"+object.get("reason"));}response.setContentType("text/json; charset=UTF-8");response.getOutputStream().write(object.get("result").toString().getBytes("UTF-8")); //System.out.println(object.get("result"));} catch (Exception e) {e.printStackTrace();}//response.setHeader("Access-Control-Allow-Origin", "*");//response.reset();//response.setContentType(String);//response.getOutputStream().write(object.toString().getBytes("UTF-8"));}}/**** @param strUrl 请求地址* @param params 请求参数* @param method 请求方法* @return  网络请求字符串* @throws Exception*/public static String net(String strUrl, Map params,String method) throws Exception {HttpURLConnection conn = null;BufferedReader reader = null;String rs = null;try {StringBuffer sb = new StringBuffer();if(method==null || method.equals("GET")){strUrl = strUrl+"?"+urlencode(params);}URL url = new URL(strUrl);System.out.println("url = "+url);conn = (HttpURLConnection) url.openConnection();if(method==null || method.equals("GET")){conn.setRequestMethod("GET");}else{conn.setRequestMethod("POST");conn.setDoOutput(true);}conn.setRequestProperty("User-agent", userAgent);conn.setUseCaches(false);conn.setConnectTimeout(DEF_CONN_TIMEOUT);conn.setReadTimeout(DEF_READ_TIMEOUT);conn.setInstanceFollowRedirects(false);conn.connect();/*    if (params!= null && method.equals("POST")) {try (DataOutputStream out = new DataOutputStream(conn.getOutputStream())) {out.writeBytes(urlencode(params));}}*/InputStream is = conn.getInputStream();reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));String strRead = null;while ((strRead = reader.readLine()) != null) {sb.append(strRead);}rs = sb.toString();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {reader.close();}if (conn != null) {conn.disconnect();}}return rs;}//将map型转为请求参数型public static String urlencode(Map<String,Object>data) {StringBuilder sb = new StringBuilder();for (Map.Entry i : data.entrySet()) {try {sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return sb.toString();}
}

使用一下数据访问服务器即可查看获得的加油站信息:

3.手机端实现

(对于我)稍微有点难度的还是在手机端功能的实现。

第一步:加油站信息类GasStationModel.java

为了更加方便的传递数据,写了一个加油站信息类,对数据实体化。同时实现了Serializable接口,因为后面需要利用intent传递list<GasStationModel>时,将list强制转化成serializable。

package intvehapp.intvehapp;import java.io.Serializable;
import java.util.Map;/*** Created by chen on 2016/4/2.*/
public class GasStationModel implements Serializable {public GasStationModel(String area,String fwlsmc,String address,String areaname,String distance,String exhaust,String discount,String lon,String brandname,String type,Map<String,String> price,Map<String,String> gastprice,String name,String id,String lat,String position){this.area = area;this.address = address;this.areaname = areaname;this.brandname = brandname;this.discount = discount;this.distance = distance;this.exhaust = exhaust;this.fwlsmc = fwlsmc;this.gastprice = gastprice;this.id = id;this.price = price;this.lon = lon;this.type = type;this.name = name;this.lat = lat;this.position = position;}/*** 邮编*/private String area;/*** 加油卡信息*/private String fwlsmc;/*** 加油站地址*/private String address;/*** 城市区域*/private String areaname;/*** 距离?*/private String distance;/*** 尾气排放标准*/private String exhaust;/*** 是否打折加油站*/private String discount;/*** 百度地图经度*/private String lon;/*** 运营商类型*/private String brandname;/*** 加油站类型*/private String type;/*** 省控基准油价*/private Map<String,String> price;/*** 加油站油价*/private Map<String,String> gastprice;/*** 加油站名字*/private String name;/*** id*/private String id;/*** 谷歌地图坐标*/private String position;/*** 百度地图纬度*/private String lat;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getArea() {return area;}public void setArea(String area) {this.area = area;}public String getFwlsmc() {return fwlsmc;}public void setFwlsmc(String fwlsmc) {this.fwlsmc = fwlsmc;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getAreaname() {return areaname;}public void setAreaname(String areaname) {this.areaname = areaname;}public String getDistance() {return distance;}public void setDistance(String distance) {this.distance = distance;}public String getDiscount() {return discount;}public void setDiscount(String discount) {this.discount = discount;}public String getExhaust() {return exhaust;}public void setExhaust(String exhaust) {this.exhaust = exhaust;}public String getLon() {return lon;}public void setLon(String lon) {this.lon = lon;}public String getBrandname() {return brandname;}public void setBrandname(String brandname) {this.brandname = brandname;}public String getType() {return type;}public void setType(String type) {this.type = type;}public Map<String, String> getPrice() {return price;}public void setPrice(Map<String, String> price) {this.price = price;}public Map<String, String> getGastprice() {return gastprice;}public void setGastprice(Map<String, String> gastprice) {this.gastprice = gastprice;}public String getPosition() {return position;}public void setPosition(String position) {this.position = position;}public String getLat() {return lat;}public void setLat(String lat) {this.lat = lat;}
}

第二步:新建线程访问数据,通过handler与主线程通信。

一开始,直接在主线程中访问服务器,最终发现失败了,查阅了资料后才知道:android4.0以后的版本,主线程(UI线程)不在支持网络请求,原因大概是影响主线程,速度太慢,容易卡机,所以需要开启新的线程请求数据。

 /*** 通过handler与主线程通信*/final Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);Bundle data = msg.getData();String err = data.getString("err");/*** 查询成功*/if("0".equals(err)){List<GasStationModel> listGasStation = (List<GasStationModel> )data.getSerializable("listGasStation");Toast.makeText(BaiDuMapActivity.this, "查询成功"+listGasStation.size(), Toast.LENGTH_LONG).show();}else{Toast.makeText(BaiDuMapActivity.this, "附近没有加油站信息", Toast.LENGTH_LONG).show();}//Log.i("mylog", "请求结果为-->" + val);// TODO// UI界面的更新等相关操作}};/*** 开启一个新的线程,访问服务器* 当有数据返回时,通过handler传递消息*/new Thread(new Runnable() {@Overridepublic void run() {//请求数据List<GasStationModel> listGasStation = ConnectServer.searchNearGas(params);//发送消息Message message = new Message();Bundle bundle = new Bundle();if(listGasStation!=null){bundle.putSerializable("listGasStation", (Serializable) listGasStation);bundle.putString("err","0");//成功}elsebundle.putString("err","1");//失败message.setData(bundle);handler.sendMessage(message);}}).start();

第三步:ConnectServer.java访问服务器类

考虑到后期对服务器访问还会很多,所以就单独建了一个访问服务器的类。

实现对服务器的访问,搜索周边加油站。

/*** Created by chen on 2016/4/2.*/
public class ConnectServer {public static List<GasStationModel> searchNearGas(Map<String, String> params){/*** 请求地址*/String path = serverURL+"gas/searchNear?key="+key+"&";/*** 添加参数*/List<GasStationModel> listGasStation = new ArrayList<GasStationModel>();try {StringBuilder url = new StringBuilder(path);URL nURL = new URL("http://www.baidu.com");//url.append("?");for (Map.Entry<String, String> entry : params.entrySet()) {url.append(entry.getKey()).append("=");url.append(URLEncoder.encode(entry.getValue(), "UTF-8"));// 编码url.append('&');}url.deleteCharAt(url.length() - 1);HttpURLConnection connection = (HttpURLConnection) new URL(url.toString()).openConnection();//HttpURLConnection connection = (HttpURLConnection) nURL.openConnection();connection.setConnectTimeout(5000);connection.setRequestMethod("GET");String result = "";InputStream in = connection.getInputStream();try {Thread.sleep(300);result = read(connection.getInputStream());} catch (InterruptedException e) {e.printStackTrace();}/*** 解析JSON数据等等<span style="font-family:Microsoft YaHei;">操作</span>*/}}catch (Exception e ){e.printStackTrace();}return listGasStation;}private static String read(InputStream in) throws Exception {byte[] data;int length = in.available();ByteArrayOutputStream bout = new ByteArrayOutputStream();byte[]buf = new byte[1024];int len = 0;while((len = in.read(buf))!=-1){bout.write(buf, 0, len);}data = bout.toByteArray();return new String(data,"UTF-8");}
}

三.效果与分析

其实整个流程的思路还是很简单:定位获取当前数据->访问加油站数据接口获得周边加油站位置信息->回调,在地图上显示。但是,实现起来有些地方还是很费心,比如手机端接收数据不完整的情况。

Android studio 百度地图开发(5)查询周边服务(加油站)相关推荐

  1. 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...

    Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...

  2. Android studio 百度地图开发(3)地图导航

    Android studio 百度地图开发(3)地图导航 email:chentravelling@163.com 工程下载地址:http://blog.csdn.net/chentravelling ...

  3. 谷歌 地图 android studio,Android Studio百度地图开发(一)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本人用Android Studio做百度地图开发,调试了一整天,始终无法通过.然后怀疑代码有问题,就换Eclipse进行代码编写,毕竟网上关于Eclips ...

  4. android百度地图定位文字表述,Android studio 百度地图开发(8)地图已标记POI点和搜索POI点的获取和利用...

    一.简要描述 百度地图的POI点可以分有两种:地图中已经标记的点和通过关键词搜索得到的POI点.对于这两种POI点,百度封装成了不同的类和接口来实现监听,下面简单讲一点. 二.地图中已标记POI点 首 ...

  5. Android Studio百度地图开发所需参数获取SHA1或MD5的最简单方法(图文教程)

    Android Studio获取SHA1或MD5的最简单方法 /*** Copyright (c) 2016, smuyyh@gmail.com All Rights Reserved.* # #* ...

  6. 基于Android的百度地图开发

    参考资料: android studio获得SHA1的值,然后在百度地图移动版API官网申请key Android Studio怎么查看程序的安全码获取SHA1值? http://www.codese ...

  7. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划

    2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划 开发前配置,显示基本地图,实时定位等查看之前代码,此博客紧接上一博客:https://blog.csdn.ne ...

  8. Android学习 - 百度地图开发基础

    什么是百度地图API? 百度地图移动版API(Android)是一套基于Android 1.5及以上设备的应用程序接口,通过该接口,您可以轻松访问百度服务和数据,构建功能丰富.交互性强的地图应用程序. ...

  9. Android如何实现地图定位?Android studio+百度地图API+Android6.0系统实现地图显示、地址设置、点击地图定位功能(详细)

    文章说明:本文初衷是为了记录毕设学习过程,避免忘记操作流程.该功能是毕业设计的Android软件端的功能之一,本文将从获取百度地图密钥(AK)开始,详细地对地图定位配置和相关代码进行说明,文末将附上实 ...

最新文章

  1. windows下apache配置虚拟主机的两个方法
  2. 《Android 应用案例开发大全(第二版)》——2.6节绘制相关类
  3. 库存管理-历史库存和收发存系列-俄罗斯库存报表J3RFLVMOBVED1
  4. 基于SPI的数据报过滤原理与实现
  5. 面试中 项目遇见的难点答案_2019 百度、头条、小米、360、网易、拼多多等公司 Android 社招面试心得...
  6. android studio 修改包名_android逆向笔记之初学者常用adb命令
  7. 交换排序(冒泡、快速)
  8. 《学习之道》第十三章练习大脑,改变思维
  9. mie散射理论方程_Mie氏散射理论的实验研究
  10. C++ Primer Plus学习:第十三章
  11. JavaScript随机生成信用卡卡号的方法
  12. 蓝鲸作业平台:搞定与脚本相关的一切
  13. 可爱的玩笑匹配者可以使用vue-test-utils测试Vue组件
  14. 个别网页打不开,很多网页加载慢(安装过虚拟机),改dns,清理缓存、重装驱动、等方法都解决不了,的解决办法。
  15. Ubuntu16.04开启SSH服务
  16. Nginx配置支持mp4视频流播放,超简单
  17. Entry是什么类型?
  18. 【参赛作品12】基于华为云鲲鹏弹性云服务器部署openGauss数据库-实验
  19. java毕业设计——基于java+JSP+J2EE的城市公交查询系统设计与实现(毕业论文+程序源码)——城市公交查询系统
  20. linux服务器忘记密码操作

热门文章

  1. 【混淆系列】三问:npx、npm、cnpm、pnpm确定搞明白了?
  2. 最新安卓导航装车作业
  3. 56道java基础必“背“面试题(备战2022金三银四)
  4. android音乐播放器的历史,基于Android音乐播放器的研究
  5. android.bp编译生成so,Android导入第三方静态库.a编译成动态库.so
  6. 活动星投票国潮大秀东方网络评选投票怎么做的免费微信投票活动
  7. 校园网免认证停机卡免流服务器被迫关停
  8. 思科路由器:标准ALC实验
  9. php孙晓冬作品,画家孙晓东 卢禹舜—中国特邀书画名家作品展
  10. 大厂面试系列(七):数据结构与算法等