合肥程序员群:49313181。    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)
Q  Q:408365330     E-Mail:egojit@qq.com

综述:

今天公司让我做一个APP下百度地图,显示当前用户位置和附近加油站,同时可以搜索公交车方案。刚开始听说这样的需求我有点纠结,因为这个加油站的数据去哪弄,公交搜索我知道肯定容易。所以开始找资料……。后来发现百度地图的搜附近可以解决这个问题。所以废话不多说开始Code,工作时间快速记录。不浪费时间

一.准备:

首先下载百度地图 Android SDK,和定位SDK。百度新的API中将定位部分独立出来了。本别下载下来配置到自己的项目中。

配置好lib就开始,新建两个类,一个是位置监听和显示,用于监听位置变化。还有一个就是查询监听,用于处理查询返回的结果。MyLocationListener类用于监听位置变化,实现BDLocationListener

 import android.util.Log;

 import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint; /**
* 位置监听处理
* @author egojit
*
*/
public class MyLocationListener implements BDLocationListener { private static String LOG_TAG = "MyLocationListener";
private MapView mMapView;
private Context MyContext; public MyLocationListener(MapView view, Context context) {
this.mMapView = view;
this.MyContext = context;
} @Override
public void onReceiveLocation(BDLocation location) {
if (location == null)
return; MyLocationOverlay myLocationOverlay = new MyLocationOverlay(
this.mMapView); LocationData locData = new LocationData();
// 手动将位置源置为天安门,在实际应用中,请使用百度定位SDK获取位置信息,要在SDK中显示一个位置,需要使用百度经纬度坐标(bd09ll)
locData.latitude = location.getLatitude();
locData.longitude = location.getLongitude();
locData.direction = 2.0f;
myLocationOverlay.setData(locData);
if (mMapView != null && mMapView.getOverlays() != null) {
mMapView.getOverlays().add(myLocationOverlay);
mMapView.refresh();
mMapView.getController().animateTo(
new GeoPoint((int) (locData.latitude * 1e6),
(int) (locData.longitude * 1e6)));
mMapView.getController().setZoom(16);
MainActivity activity = (MainActivity) MyContext; activity.jd = locData.longitude;
activity.wd = locData.latitude;
} StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation) {
sb.append("\nspeed : ");
sb.append(location.getSpeed());
sb.append("\nsatellite : ");
logMsg("GPS定位");
sb.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
sb.append("\naddr : ");
logMsg("winfi定位");
sb.append(location.getAddrStr());
} logMsg(sb.toString());
} public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null) {
return;
}
StringBuffer sb = new StringBuffer(256);
sb.append("Poi time : ");
sb.append(poiLocation.getTime());
sb.append("\nerror code : ");
sb.append(poiLocation.getLocType());
sb.append("\nlatitude : ");
sb.append(poiLocation.getLatitude());
sb.append("\nlontitude : ");
sb.append(poiLocation.getLongitude());
sb.append("\nradius : ");
sb.append(poiLocation.getRadius());
if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
sb.append("\naddr : ");
sb.append(poiLocation.getAddrStr());
}
if (poiLocation.hasPoi()) {
sb.append("\nPoi:");
sb.append(poiLocation.getPoi());
} else {
sb.append("noPoi information");
}
logMsg(sb.toString());
} /**
* 打日志
*
* @param s
*/
private static void logMsg(String s) {
Log.i(LOG_TAG, s);
}
}

MySearchListener查询监听类实现了MKSearchListener接口

 package com.egojit.dcdemo;

 import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.widget.Toast; import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.PoiOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKShareUrlResult;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult; /**
* 查询监听
* @author egojit
*
*/
public class MySearchListener implements MKSearchListener { private Context contxt;
private MapView mMapView; public MySearchListener(Context context, MapView mMapView) {
this.contxt = context;
this.mMapView = mMapView;
} @Override
public void onGetAddrResult(MKAddrInfo result, int iError) {
// 返回地址信息搜索结果
} @Override
public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
// 返回驾乘路线搜索结果
} @Override
public void onGetPoiResult(MKPoiResult result, int type, int iError) {
// 返回poi搜索结果 if (iError == MKEvent.ERROR_RESULT_NOT_FOUND) {
Toast.makeText(contxt, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
} else if (iError != 0 || result == null) {
Toast.makeText(contxt, "搜索出错啦..", Toast.LENGTH_LONG).show();
} PoiOverlay poiOverlay = new PoiOverlay((Activity) contxt, mMapView);
poiOverlay.setData(result.getAllPoi());
mMapView.getOverlays().clear();
mMapView.getOverlays().add(poiOverlay);
mMapView.refresh();
for (MKPoiInfo info : result.getAllPoi()) {
if (info.pt != null) {
mMapView.getController().animateTo(info.pt);
break;
}
} } @Override
public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
// 返回公交搜索结果
String plan = "目前公交方案有:\n";
for (int i = 0; i < result.getNumPlan(); i++) {
plan += (i + 1) + "." + result.getPlan(i).getContent() + "\n";
}
Dialog alertDialog = new AlertDialog.Builder(contxt).setTitle("查询结果")
.setMessage(plan).setIcon(R.drawable.ic_launcher).create(); alertDialog.show();
} @Override
public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
// 返回步行路线搜索结果
} @Override
public void onGetBusDetailResult(MKBusLineResult result, int iError) {
// 返回公交车详情信息搜索结果
} @Override
public void onGetShareUrlResult(MKShareUrlResult result, int type, int error) {
// 在此处理短串请求返回结果.
} @Override
public void onGetPoiDetailSearchResult(int arg0, int arg1) {
// TODO Auto-generated method stub } @Override
public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
// TODO Auto-generated method stub }
}

这两个是主要的类。

获取位置和网络连接都是需要相关权限的。我们知道百度LBS是三种技术的综合。GPS定位,wifi定位,基站定位。所这这些权限都是要加入AndroidManifest.xml

 <!-- 使用网络功能所需权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<!-- SDK离线地图和cache功能需要读写外部存储器 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_SETTINGS" >
</uses-permission>
<!-- 获取设置信息和详情页直接拨打电话需要以下权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE" >
</uses-permission>
<!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6项 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission> <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</permission> <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

还有定位不可缺少的一个服务要加入AndroidManifest.xml中:

 <service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.baidu.location.service_v2.2" >
</action>
</intent-filter>
</service>

这样基本完成:

运行结果如下:进入看到我的位置

点击搜索加油站:

这些红点就是附近的加油站。

点击到市府广场:

可以看到有5个公交乘车方案。

总结:这样技术层面是没有任何问题了。将这些功能嵌入到公司的项目中就可以了。

版权:归博客园和Egojit所有,转载请标明出处。

Android百度地图附加搜索和公交路线方案搜索的更多相关文章

  1. Android百度地图开发05之公交信息检索 + 路线规划

    在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容. 公交信息检索 实际上,公交信息检索与POI检索.在线建议检索非常相似,也是把你需要检索的信息发送给百度地图 ...

  2. [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索

    一个. 百度地图城市位置和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...

  3. Android百度地图开发(四)线路搜索

    一.标注驾车线路搜索 1.首先需要定义一个起点和一个终点 // 定义一个起始点和终点 private MKPlanNode start; private MKPlanNode end; 2.实例化地图 ...

  4. Android 百度地图 简单实现--- 美食搜索

    Android 百度地图 简单实现---  美食 依赖包: 加入 Android 百度依赖包: 1  key:  <!--        开发人员 key --> <meta-dat ...

  5. Android百度地图相关内容汇总

    Android百度地图知识讲解 1.百度地图开发环境搭建    http://www.apkbus.com/android-116050-1-1.html 2.Android百度地图系列教程    h ...

  6. Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易, ...

  7. Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

  8. Android 百度地图 SDK v3.0.0 (三) 加入覆盖Marker与InfoWindow使用

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

  9. android 百度地图开发实例(转载)

    因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...

随机推荐

  1. ffmpeg编译参数详解

    Usage: configure [options]用 法:configure [选项]Options: [defaults in brackets after descriptions]选   项: ...

  2. Codeforces 747D:Winter Is Coming(贪心)

    http://codeforces.com/problemset/problem/747/D 题意:有n天,k次使用冬天轮胎的机会,无限次使用夏天轮胎的机会,如果t<=0必须使用冬轮,其他随意. ...

  3. win7下matlab2016a配置vlfeat

    1.下载vlfeat http://www.vlfeat.org/ 2.解压到了matlab安装目录的toolbox下 3.打开vs2013的这个 4.输入nmake version  查看我的版本是 ...

  4. Linux手绑IP

    修改配置文件vim /etc/sysconfig/network-scripts/ifcfg-eth0 注释dhcp#BOOTPROTO="dhcp" 注释ipv6#IPV6INI ...

  5. Unbuntu下使用SVN

    一.查看SVN版本 svn --version 二.查看SVN仓库 # 查看被svn仓库占用的所有端口 netstat -anp |grep svn # 查看所有端口对应的仓库 ps -ef | gr ...

  6. python 学习笔记十五 web框架

    python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. Python的WEB框架分为两类: 自己写socket,自 ...

  7. 使用MegaCli工具查看Raid磁盘阵列状态

    转载自:http://home.51.com/chenjianghui1987/diary/item/10051836.html 文章本身我不做过多修改了,在这里我就把自己在安装时候碰到的难点跟大家提 ...

  8. psr的规范

    基本代码规范 本篇规范制定了代码基本元素的相关标准, 以确保共享的PHP代码间具有较高程度的技术互通性. 关键词 "必须"("MUST")."一定不可 ...

  9. phpstrom正则替换

  10. DEV GridControl小结

    1. 如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 2. 如何新增一条记录 (1).gridView.Ad ...