如何在Android应用中使用百度地图api的应用

android菜鸟学习笔记31Android使用百度地图API(二)获取地理位置及地图控制器的简单使用
1.获取当前地理位置:
Android中提供了一个LocationManager的类,用于管理地理位置。不能通过构造函数获取该类的实例,而是通过Context的getSystemService():
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
该类中有几个比较常用的方法:
getLastKnownLocation(String provider)用于根据传入的provider获取一个Location对象,该对象存储了地理位置信息,包括经度、纬度、海拔、速度等。provider指明采用何种方式获取地理位置信息,在LocationManager中定义了几个字符串常量,用于指定地理位置信息的提供者:
NETWORK_PROVIDER:采用网络的方式获取
GPS_PROVIDER:采用GPS获取
PASSIVE_PROVIDER:被动定位方式,当其他应用使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取就可以了
注意:在使用真机测试时,一定要走到室外。因为常用的定位方式是GPS或者NETWORK,但是在室内这两个基本没起作用,我刚开始还以为是代码的问题,后来走出去测试才发现代码没有问题。
获取地理位置信息之前,最好先查看下手机支持哪些定位方式,哪些是可用的,然后再选择一个可用的来定位:
getAllProviders()返回所有的地理位置提供者的所有字符串描述
getBestProvider()根据传入的评判准则,返回一个最佳的地理位置提供者的字符串描述,第二个参数设置为true,则返回所有可用中的最佳的;若为false则返回最佳的,不管是否可用。
getProviders()返回地理位置提供者的字符串描述,参数为true,则返回所有的可用的描述,false则返回所有的。
getProviders()根据传入的评判准则,及第二个参数标识是否可用,来返回地理位置提供者的字符串描述。
1 List&String& providers = lm.getProviders(true);
for(int i=0; i&providers.size();i++){
System.out.println(providers.get(i));
当前是GPS和PASSIVE方式可用:
1 List&String& providers = lm.getProviders(true);
String lp = null;
if(providers.contains(LocationManager.GPS_PROVIDER)){
lp = LocationManager.GPS_PROVIDER;
}else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
lp = LocationManager.NETWORK_PROVIDER;
Toast.makeText(this, "当前没有获取地理位置的方式可用,请打开GPS", Toast.LENGTH_LONG).show();
21 Location loc = lm.getLastKnownLocation(lp);
获取了Location实例,就可以从中获取关心的地理信息了:
getLatitude():获取纬度信息,单位度
getLongitude():获取经度信息,单位度
getAltitude():获取海拔信息,单位米
getSpeed():获取速度信息,单位米/秒
getTime():获取时间信息,返回从到现在的毫秒数。
Toast.makeText(MainActivity.this, "纬度:"+location.getLatitude()
+",经度:"+location.getLongitude()+",速度:"+location.getSpeed()+"m/s,"
+"海拔:"+location.getAltitude()+"米", 0).show();
以上,只能获取一次地理位置信息,如何动态实时地获取地理位置信息呢?
这就要用到LocationManager的requestLocationUpdates()方法:
该方法有多重重载形式,这里只简单试用下这种重载形式,参数说明:
provider:指定获取地理位置的方式;
minTime:指定监听位置变化的时间间隔,单位毫秒;
minDistance:指定监听位置变化的最小距离间隔,单位米;
listener:指定监听器,设置不同事件的回调处理。
注意:注册了监听器之后,但应用退出时,应当将注册的监听器移除,可以选择在Activity的onDestroy()方法中,调用LocationManager的removeUpdates(listener)方法,来将requestLocationUpdates()注册的事件监听移除。
1 listener = new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "onStatusChanged", 0).show();
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "onProviderEnabled", 0).show();
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "onProviderDisabled", 0).show();
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
tv_lat.setText(location.getLatitude()+"");
tv_lng.setText(location.getLongitude()+"");
Toast.makeText(MainActivity.this, "纬度:"+location.getLatitude()
+",经度:"+location.getLongitude()+",速度:"+location.getSpeed()+"m/s,"
+"海拔:"+location.getAltitude()+"米", 0).show();
61 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5, 1, listener);
每隔5秒监测下位置的变化情况,一旦距离变化超过1米,就会回调onLocationChanged()方法,并将新的Location实例作为参数传入该方法。
以上,就是简单的获取地理位置的方法,帮助文档中关于LocationManager还有其他一些可能也会用到的方法,如临近警告,测距等,在用到的时候可以再查阅。
2.百度地图控制器的简单使用,设置地图的旋转,缩放,及视角变化:
跟2.x版本不同,之前在控制器中直接就可以调用各个方法进行旋转、缩放等操作,新版的控制器类名为BaiduMap,这里要用到的是它的animateMapStatus()方法:
所有要执行的旋转、缩放等动作没有直接对应的方法,而是把这些地图状态变化的动作封装到MapStatusUpdate对象中,然后传递给BaiduMap的animateMapStatus()以动画的方式执行动作。
所以,这里的关键是获取MapStatusUpdate对象,封装要执行的动作。
但是,查看帮助文档中,MapStatusUpdate类没有任何实际的帮助信息&&
但是,有几个相关的类:MapStatus、MapStatus.Builder、MapStatusUpdateFactory。
首先看MapStatus:
有这么几个字段,用于存放地图状态信息,注意文档中说明zoom的取值范围为3-20,overlook的取值是-45-0。但是没有对应的设置方法,所以猜测应该在其内部类Builder中存在相关设置方法
MapStatus.Builder:
构造方法,第二个带参的构造应该会比较有用,要进行地图状态变化,肯定要有一个参照,是在当前状态基础之上进行旋转缩放等。
build()方法返回一个MapStatus对象,如同之前常用到的android中的Builder内部类一样,在进行完一连串的设置之后,最后调用该方法得到一个需要的MapStatus对象。
overlook()方法,设置地图视角,传入一个-45~0的float值
rotate()方法,设置逆时针旋转角度
target()方法,设置地图中心店
targetScreen()方法设置地图中心点在屏幕的坐标
zoom()方法,设置地图的缩放级别。
通过MapStatus.Builder就能获取一个MapStatus对象了,但是需要的却是MapStausUpdate对象。
继续看下一个类:
MapStatusUpdateFactory类:
MapStatusUpdate的工厂类,通过它可以获取到需要的MapStatusUpdate对象:
newMapStatus()方法,可以根据传入的MapStatus获取一个MapStatusUpdate对象;
zoomIn()方法:返回一个放大地图缩放级别的MapStatusUpdate对象
zoomOut()方法:返回一个缩小地图缩放级别的MapStatusUpdate对象
zoomTo()方法:返回一个到指定缩放级别的MapStatusUpdate对象
下面根据这几个类,试着进行地图的旋转、缩放、设置中心点及视角变化:
1)设置缩放级别:
修改布局文件,在MapView下方添加几个控件,用于控制地图缩放:
1 &LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_level"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:inputType="number"
android:hint="@string/et_hint"
android:id="@+id/btn_set"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="zoomTo"
android:text="@string/btn_set_text"
android:id="@+id/btn_in"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="zoomIn"
android:text="@string/btn_text_in"/&
android:id="@+id/btn_out"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="zoomOut"
android:text="@string/btn_out_text"
73 &/LinearLayout&
修改MainActivity.java添加按钮回调方法:
1 public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private EditText et_
private Button btn_set, btn_in, btn_
private MapV
private BaiduM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mv = (MapView) findViewById(R.id.mv);
et_level = (EditText) findViewById(R.id.et_level);
map.setOnMapLoadedCallback(new OnMapLoadedCallback() {
public void onMapLoaded() {
mv.setScaleControlPosition(new Point(20,20));
mv.setZoomControlsPosition(new Point(150,50));
public void zoomTo(View view){
String s_level = et_level.getText().toString();
float level = Float.parseFloat(s_level);
MapStatusUpdate zt = MapStatusUpdateFactory.zoomTo(level);
map.animateMapStatus(zt);
} catch (NumberFormatException e) {
Toast.makeText(this, "请输入正确的缩放级别", Toast.LENGTH_SHORT).show();
public void zoomIn(View view){
MapStatusUpdate zi = MapStatusUpdateFactory.zoomIn();
map.animateMapStatus(zi);
public void zoomOut(View view){
MapStatusUpdate zo = MapStatusUpdateFactory.zoomOut();
map.animateMapStatus(zo);
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
mv.onResume();
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mv.onPause();
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mv.onDestroy();
运行效果:
2)设置地图中心点:
map.animateMapStatus(MapStatusUpdateFactory.newLatLng(new LatLng(30.757, 103.9339)));
运行结果:
3)旋转地图:
修改布局文件,添加一个旋转按钮:
android:id="@+id/btn_rot"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="rotate"
android:text="@string/btn_rot_text"
修改MainActivity.java,添加旋转按钮的回调:
1 public void rotate(View view){
float r = map.getMapStatus().
MapStatus ms = new MapStatus.Builder(map.getMapStatus()).rotate(r+30).build();
map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(ms));
运行结果:
4)设置视角:
修改布局文件:
android:id="@+id/btn_up"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="overlook"
android:text="@string/btn_up_text"/&
android:id="@+id/btn_down"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:onClick="overlook"
android:text="@string/btn_down_text"
修改MainActivity.java:添加修改视角的按钮的回调:
1 public void overlook(View view){
float f = map.getMapStatus().
MapStatus ms = null;
if(view.getId() == R.id.btn_up){
ms = new MapStatus.Builder(map.getMapStatus()).overlook(f+10).build();
ms = new MapStatus.Builder(map.getMapStatus()).overlook(f-10).build();
map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(ms));
运行结果:
更多相关文章
1.准备工作: 百度地图API是免费开放的,但是需要申请API Key: 1)先注册一个百度开发者帐号 2)进入百度开放服务平台/
3)进入LBS云
4)点击的API控制台,没有登录的话会先跳转到登录页面,登录成功之后就进入应用控制台了:
在做百度地图时,一开始地图无法显示,百度后有多种原因导致,我是key没有用该应用申请的key导致: 后来用了新申请的key只能显示一部分地图,又是各种百度,同样有多种原因导致,查了key申请时用的SHA1和package,也是正确的,折腾了好久,最后终于醒悟,申请key时用的SHA1是一个eclip ...
主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL:
使用一个String类型的url构造一个URL对象,如: URL url = new URL(http://10.0.2.2/index.php);
要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上找对应ContentProvider的源码:/android
ContentProvider是Android四大组件之一,它用来封装数据,并通过ContentResolver接口将数据提供给其他应用.只有当需要在多个应用之间共享数据时才会用到ContentProvider. 多个应用共享数据时,如何区分是哪个应用中的那部分数据呢? ContentProvide ...
Android内置了一个名为SQLite的关系型数据库,这是一款轻量型的数据库,操作十分简便.SQLite与别的数据库不同的是,它没有数据类型.可以保存任何类型的数据到你所想要保存的任何表的任何列中.但它又支持常见的类型比如: NULL, VARCHAR, TEXT, INTEGER, BLOB,
1.Fragment的生命周期: 简单在新建一个MyFragment继承自Fragment,重写各个生命周期回调方法,各个方法中直接输出标识相关函数被调用的信息. 重写MainActivity的各个生命周期回调方法,同样输出标识信息. MyFragment.java: 1 public class
常见的向用户发送提示信息的方式有3种,分别为: 1)发送Toast信息 2)弹出对话框 3)发送通知 总结如下: 方式1:发送Toast信息: 这种方式最简单,在之前的学习中多次使用过.Toast是在一个浮动于应用之上的View中显示信息,显示一定的时间间隔后自动消失,不可获得焦点. 最简单的用法就 ...
最近在做一个图片上传的功能,js调用用webservice进行异步访问服务器,对于不是经常 ...
1.关于explain的详细介绍 参考:/doc/refman/5.1/zh/optimization.html .cn/t ...
1.数据库连接,需要连接没有数据表前缀 如下,第二个参数必须为null,我之前写的是'',结果给我默认加了前缀 $User = M('User',Null,'DB_CONFIG2'); 2.AJAX获取url上pat ...
问题: Error {src: &dojoLoader&, info: Object, stack: (...), message: &multipleDefine&} 环境: ...
正则表达式的先行断言和后行断言一共有4种形式: (?=pattern) 零宽正向先行断言( ...
这个matlab已经改名为pylab了,你可以运行: from pylab import *
新到一本韦氏词典,不过其中的英标不认识,在寻找中
要讲解parallel_for,我们首先讲一个例子,该例子是对数组的每一个元素进行遍历,常规的串行算法代码如下: template&typename T& void Visit ...
在计算机科学中,trie,又称前缀树,是一种有序树,用于保存关联数组,其中的键通常是字符串 ...
java线程的5状态包括create.runnable.running.blocked.d ...<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&Android下如何使用百度地图sdk
字体:[ ] 类型:转载 时间:
百度地图 Android SDK是一套基于Android 2.1(v1.3.5及以前版本支持android 1.5以上系统)及以上版本设备的应用程序接口
可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,您可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的LBS(地图类)应用程序。
百度地图Android SDK提供的所有服务是免费的,接口使用无次数限制。您需申请密钥(key)后,才可使用百度地图Android SDK。任何非营利性产品请直接使用。这弦外之音就是盈利的产品必须帮百度给钱。
一、百度地图api平台。
百度地图API网址:/map/sdk-android.htm
百度地图开发步骤是①获取密钥 ②申请新密钥及查看原先申请的密钥 ③开发指南 在安卓平台上使用百度地图的开发指南 ④类参考 地图库所提供的类及方法说明相关下载 ⑤开发所使用的相关包及说明示例下例
哝,这就是百度地图的apk平台的界面:
首先,我们来申请key。
步骤也非常的简单:
①点击获取密钥 ②进入密钥申请页并阅读相关的使用条款 ③勾选 已阅读并同意条款 ④填写应用名称 填写一下应用的相应功能及描述 ⑤输入验证码确定后 ⑥密钥即可申请成功
我申请的key如下图所示:
如何把申请下来的jar包导入到项目中了。
一、在工程里新建libs文件夹(若不存在的话),将开发包里的baidumapapi_v2_1_1.jar拷贝到libs根目录下,将libapp_BaiduMapApplib_v2_1_1.so和libvi_voslib.so 拷贝到libs\armeabi目录下。
二、项目属性中Java Build Path-&Order and Export中,确定Android Private Libaries与Android Dependencies这两项前面的选择框被选上后,
三、点确定 菜单Project-&clean重新编译项目后就可以正常使用地图中的功能进行编程了。
四、上图包中的liblockSDK3.1.jar及对应的so文件是用于定位与搜索功能的,如果不需要可以不加入到项目当中
jar包的架构如下图所示:
到入jar包的样子也如下图所示:
在清单文件下,要添加一下的权限。
&supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" &android:resizeable="true" android:smallScreens="true" /&
对需要加载地图的Activity进行属性设置
&activity android:name="com.dfrz.map.DFRZMapActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name" android:screenOrientation="sensor" & &/activity&
这些准备工作做好以后,我们需要到入相应的map控件
&com.baidu.mapapi.map.MapView android:id="@+id/bmapsView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:clickable="true" /&
上述xml的源代码就是这个就是加载百度地图的控件框,这个布局你可以根据自己的需要进行调整,或是放置到你的Activity需要的地方去。此控件需要接收到点击事件,所以需要把clickable设置成true。
百度的地图的原理就是这样的。。。。。。。。。。。
地图、定位、搜索功能都需要用BMapManager对象来管理, BMapManager提供四个接口:init()、start()、stop()、destroy()。在应用程序里生成BMapManager 对象并初始化,在程序退出时调用destroy(),在需要使用sdk功能的Activity的onCreate()方法里调用start()方法,onDestroy()方法里调用stop()方法,或者onResume()/onPause()分别调用start()和stop()。 常用方法: destroy() : 在程序退出前调用& boolean init(java.lang.String&strKey, MKGeneralListener& listener) 初始化地图引擎,需要送入申请的百度地图Key boolean start() :开启百度地图API& boolean stop(): 终止百度地图API,调用此函数后,不会再发生回调。
MapView——百度地图的显示者。
一个显示地图的视图控件,当被焦点选中时,它能捕获按键事件和触摸手势去平移和缩放地图 setBuiltInZoomControls(boolean&on):设置是否启用内置的缩放控件 getController():返回地图的MapController,这个对象可用于控制和驱动平移和缩放 setDoubleClickZooming(boolean&bDoubleClickZooming) :&设置mapview是否支持双击放大效果 getOverlays():获取当时地图控件中的已有图层 refresh(): 刷新此地图控件。
怎么用百度地图实现了定位了,这就需要LocationClient
定位处理功能的核心类 registerLocationListener(BDLocationListener)接收到定位数据后可由指定监听器中的onReceiveLocation(BDLocation)的方法来接收相关的数据并做相关的处理 构造: new LocationClient(getApplicationContext()) setLocOption(LocationClientOption)设置定位的参数 start()启动定位功能,此功能是持续的,可以定义间隔刷新时间 stop()结束定位功能,但前面设置的定位参数不会消失,可以再启动 requestLocation() 发起异步定位请求,如果位置没有变化,不会发起网络请求,直接返回上次的位置。(2次间隔需要大于1秒)
LocationClientOption &用于定位的操作的类。
设置定位功能的定位方式 disableCache(boolean) 真表示禁用缓存定位 setOpenGPS(boolean) 是否使用GPS定位,前提是手机打开了GPS定位 setAddrType(String) 当字串为"all"时返回此位置地址信息,其它不返回 setCoorType(String) 设置返回坐标的格式 gcj02 - 国测局 bd09百度墨卡托 bd0911百度经纬坐标(手机默认) setScanSpan(int) 定时定位的时间间隔(ms) 此值大于1000时,每隔此值指定的时间就会发起一次定位 此值小于1000时或不设置此值时,调用一次requestLocation()方法则定位一次
这是我们需要定义mainactivity的类。相应源代码如图所示:
protected void onDestroy() { mapView.destroy(); if (mapManager != null) { mapManager.destroy(); mapManager = } super.onDestroy(); }
有了这些准备以后,相应运行的效果如下:
这就是android下百度地图应用的大概步骤。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具百度地图API使用,结合聚合数据 - 简书
下载简书移动应用
写了59681字,被71人关注,获得了59个喜欢
百度地图API使用,结合聚合数据
之前研究了一下百度地图的API,做一个类似附近的XX的功能,整体上接口还是很好用的,用到了定位,地图,云存储和云检索,全景图和路径规划,导航没有加进去,期间也遇到了许多未知的困难,通过论坛提问,加群,和相关负责人请教得以解决;
1.首先得有百度账号,然后注册成为开发者,然后就可以申请ak了;
在后台创建一个安卓应用,需要安全码,格式是SHA1值加分号加包名,ADT默认使用的是debug.keystore,我们一般发布产品的时候都会使用自己的签名,就是另一个keystore,如果用的是默认,直接在ADT里面设置-&Android-&build里面就能看到SHA1,如果是自己的keystore,那么有2种方法:
(1).根据我们的签名文件制作出一个debugkeystore(这个以后都可以通用,而且不只是用于百度地图),然后直接在ADT中选择就可以显示出来了,Preference-&Android-&Build里面,下面说一下如何制作debugkeystore:
a. 将密码改为android:
keytool -storepasswd -keystore XXX.keystore
b. 将别名修改为androiddebugkey:
keytool -changealias -keystore XXX.keystore -alias XXXname -destalias androiddebugkey
c. 修改alias的密码为android:
keytool -keypasswd -keystore XXX.keystore -alias androiddebugkey
如果没有配置环境变量,那么其中keytool是.android下的命令(一般在C:\Users\Administrator),keystore是你放文件的路径,这样就制作出了一个debugkeystore,在ADT里面选择就可以获取SHA1值了;
(2).命令行操作获取:也可以参考
cd .android
keytool -list -v -keystore debug.keystore
得到SHA1值之后,我们就可以随意为多个项目使用,只要和包名组合就可以得到一个ak,所以ak只是一个身份认证,如果有多个程序,可以一次性申请完成; 这个ak是作为应用的标识的,还可以统计数据,一般第三方都会有的,聚合数据还会根据key进行收费和免费;
2.接下来我们就可以配置百度地图了,,这里可以有选择的去下载以减小app体积,下面说说配置demo,主要还是在ak上面,用百度地图demo的包名加自己的SHA1去重新创建一个app,demo中的地图就能正常显示了;
SDK主要就是libs和so文件,ADT22以上需要特殊处理一下:
1.右键选 Properties-&Java Build Path-&Order and Export
使 Android Private Libraries处于勾选状态;2.Project -& clean-& clean all .
AndroidStudio引用so需要建立jniLibs目录,引用jar需要file dependency,然后往manifest添加key和权限, ;
&meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="ak" /&
接下来在XML中引用地图view;
&com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" /&
测试的话可以在activity的oncreate()里面setcontentview()前执行初始化SDKInitializer.initialize(getApplicationContext());但是真正使用的时候还是把它放到application的oncreate()里面好,因为我们可能不止一处用到地图控件,还会用到其他sdk的初始化,这些都应该在application里面执行;
3.代码级别的使用:添加地图生命周期函数,如果以后用到定位或者其他也都需要生命周期管理
MapView mMapView = (MapView) findViewById(R.id.bmapView);
BaiduMap mBaiduMap = mMapView.getMap();
protected void onResume() {
super.onResume();
mMapView.onResume();
protected void onPause() {
super.onPause();
mMapView.onPause();
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
可以设置中心点为指定显示,默认是显示北京
LatLng p = new LatLng(102.2);
mMapView = new MapView(this,
new BaiduMapOptions().mapStatus(
new MapStatus.Builder().target(p).build()));
如果在fragment里面使用请看MapFragment,不要直接强转
public class MapFragmentDemo extends FragmentActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
MapStatus ms = new MapStatus.Builder().overlook(-20).zoom(15).build();
BaiduMapOptions bo = new BaiduMapOptions().mapStatus(ms)
.compassEnabled(false).zoomControlsEnabled(false);
SupportMapFragment map = SupportMapFragment.newInstance(bo);
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().add(R.id.map, map, "map_fragment").commit();
地图的一些基本属性设置:
//普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//卫星地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//开启交通图
mBaiduMap.setTrafficEnabled(true);
//开启热力图
mBaiduMap.setBaiduHeatMapEnabled(true);
//是否允许缩放
mMapView.showScaleControl(false);
//不显示放大缩小框
mMapView.showZoomControls(false);
点击地图点
mBaiduMap.setOnMapClickListener(new OnMapClickListener() {
public void onMapClick(LatLng point) {
public boolean onMapPoiClick(MapPoi poi) {
4.下面来聊聊附件的XX需要怎么实现:首先进入程序之后开启定位,定位成功后在地图上显示位置,然后进行检索,把检索出来的结果标注在地图上,点击某个标注可以跳转到详情页,显示一个全景图和路径规划和一些其他的信息;
定位功能的实现:定位成功回调后给地图设置显示的点,同时还可以设置一个缩放
// 位置回调接口
BDLocationListener locationListener = new MyLocationListener();
client = new LocationClient(this);
client.registerLocationListener(locationListener);
LocationClientOption option2 = new LocationClientOption();
option2.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
// 是否需要打开GPS
// option2.setOpenGps(true);
option2.setCoorType("bd09ll");
option2.setScanSpan(60000);
client.setLocOption(option2);
class MyLocationListener implements BDLocationListener {
MapStatus mMapS
MyLocationData locD
public void onReceiveLocation(BDLocation bdLocation) {
location = bdL
// 构造定位数据
locData = new MyLocationData.Builder()
// 定位经度
.accuracy(location.getRadius())
.direction(location.getDirection())
.latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
// 设置缩放
mMapStatus = new MapStatus.Builder()
.target(new LatLng(location.getLatitude(),
location.getLongitude())).zoom(16).build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
// 改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);
//执行搜索
//search(2000);
检索这一块比较繁琐,主要是感觉文档写的和代码不一致,很困惑,首先我们需要构建数据库,如果自己用后台建立数据库可以,还要自己写一个根据传来的经纬度去查找附近的点的算法,但是百度提供了云存储功能,很简洁,他需要一个csv格式的Excel或者使用网页版建表,我们需要建立这么一个表;
如果数据量比较少,自己试着用,可以在百度云API后台页面进行添加,直接在地图上面选点,添加属性,有几个必填的属性,还有coord_type要填3,意味着采用百度坐标(这个问题时候来使用全景图的时候发现根本不匹配,找坛主解决的);
如果数据量很多或者需要定制,那么就要自己去构建这么一个表,详细说说这一部分;
现在假设用户给了我100个地址,只有文字,我要如何建表呢,我之前试了一些批量转的工具,要么是收费的要么是顺序不对,后来直接在程序里面使用百度geo自己做了;
首先把这一串文字地址写成一个txt,一行一条,同时每一条最好都以XX市开头,这样更精确, 放到手机上;
写一个方法去读这个txt文件,一次读一行获得一个Arraylist&String&;
然后去使用地图geo相关api去解析它,于是我用了一个for循环去请求,只返回了一条,因为一次请求太多了,后来想用一个队列去试试,最后用了定时器做的,每隔1秒去执行一次请求,把返回的经纬度用逗号连接起来组成新的Arraylist&String&,最后把他写入txt文件里面;
把文件从手机传到电脑上,复制到excel表格里面,在excel里面检查缺少的数据(如果有需要单独去解析缺少的条目,可以使用百度提供的网站工具),以逗号为标识分列,合成最终的表,导出csv格式后上传,这里也可以自定义或扩展一些其他的业务属性;
//读取txt文件的内容
ArrayList&String& templist = new ArrayList&&();
public void 读取文本(String filePath) {
String encoding = "UTF-8";
File file = new File(filePath);
//判断文件是否存在
if (file.isFile() && file.exists()) {
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), encoding);
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt =
while ((lineTxt = bufferedReader.readLine()) != null) {
templist.add(lineTxt);
// Log.e("", lineTxt);
read.close();
Log.e("", templist.size() + "");
for (int i = 0; i & templist.size(); i++) {
// Log.e("", templist.get(i) + "");
Log.e("", "找不到指定的文件");
} catch (Exception e) {
Log.e("", "读取文件内容出错");
e.printStackTrace();
StringBuffer b = new StringBuffer();
int q = 0;
//队列也很好使用,queue.poll();queue.offer();
//Queue&String& queue = new LinkedList&&();
//Map&String, String& map = new HashMap&String, String&();
//记position需要一个全局的变量
void 批处理() {
timer = new Timer(true);
new AsyncTask&Void, Void, Void&() {
protected Void doInBackground(Void... voids) {
//读取txt文件,读到换行符的时候list加一项
读取文本(Environment.getExternalStorageDirectory().toString() + "/Pictures/" + "h.txt");
for (int i = 0; i & templist.size(); i++) {
Log.e("", templist.get(i));
//定时器这里不是用for循环来做的
timer.schedule(new TimerTask() {
public void run() {
str = templist.get(q++);
mSearch.geocode(new GeoCodeOption().city("济宁").address(str));
}, 5000, 1 * 1000);
//开启服务5秒后启动线程,并且每1秒循环一次
}.execute();
//回调geo结果,先让类实现接口 implements OnGetGeoCoderResultListener
//给文字获得经纬度,搜索模块,也可去掉地图模块独立使用
GeoCoder mSearch =
// 初始化搜索模块,注册事件监听,生命周期销毁
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
mSearch.destroy();
//获取到了结果之后存成txt,整理excel
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MapActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG).show();
mBaiduMap.clear();
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
b.append(String.format("纬度:%f
经度:%f",
result.getLocation().latitude, result.getLocation().longitude));
b.append(q + "纬度:" + result.getLocation().latitude + ",
经度:" + result.getLocation().longitude + "\n");
//debug开始
//String strInfo = String.format("纬度:%f
经度:%f",
//result.getLocation().latitude, result.getLocation().longitude);
//Log.e("", String.format("纬度:%f
经度:%f",
//result.getLocation().latitude, result.getLocation().longitude));
//debug结束
if (q == templist.size()) {
timer.cancel();
保存文本文件(Environment.getExternalStorageDirectory().toString() + "/Pictures/", "result.txt", b.toString());
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MapActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG).show();
public static void 保存文本文件(String path, String filename, String string) {
// 创建目录
isFileExistAndCreat(path);
File targetFile = new File(path + filename);
OutputStreamW
// 创建文件
if (!targetFile.exists()) {
targetFile.createNewFile();
osw = new OutputStreamWriter(new FileOutputStream(targetFile), "UTF-8");
osw.write(string);
osw.close();
// 再次写入时不采用拼接的方法,而是重新写
osw = new OutputStreamWriter(new FileOutputStream(targetFile, false), "UTF-8");
osw.write(string);
osw.flush();
osw.close();
} catch (Exception e) {
//判断文件是否存在,不存在则创建
public static void isFileExistAndCreat(String filepath) {
if (isSdcardAvailable()) {
File file = new File(filepath);
if (!file.exists()) {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
//检查SD卡是否可用
public static boolean isSdcardAvailable() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
云存储搞完了就剩下云检索了,这里首先在创建一个服务器应用,获取AK,因为云检索V3版本需要申请服务器的AK才能使用,但我们不需要有服务器;然后就是引入jar包,在application里面初始化:CloudManager.getInstance().init(this); 并实现CloudListener,添加如下2个方法
// 获取到搜索结果后添加标记
public void onGetSearchResult(CloudSearchResult result, int error) {
//可选清空地图,我这里要加标注
mBaiduMap.clear();
//result里面封装了一系列的point的list
if (result != null && result.poiList != null&& result.poiList.size() & 0) {
//这里我的数据库里有2种类型的点,所以创建了2类图片标注
BitmapDescriptor bd1 = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
BitmapDescriptor bd2 = BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);
LatLngBounds.Builder builder = new LatLngBounds.Builder();
//这里我是定义了一个全局变量的数组存放标注的点
markerx = new Marker[result.poiList.size()];
for (int i = 0; i & result.poiList.size(); i++) {
//如果你不需要这些功能,直接从这里取数据就可以了
CloudPoiInfo cloudPoiInfo = result.poiList.get(i);
//这是我定义的一个实体类,和我的数据库相对应
Enerty enerty = new Enerty(
cloudPoiInfo.title,cloudPoiInfo.address, cloudPoiInfo.latitude,cloudPoiInfo.longitude);
//这里是表格里面自定义属性的用法
Map&String, Object& map = cloudPoiInfo.
enerty.setPerson((String) map.get("person"));
enerty.setPhone((String) map.get("phone"));
String typeString = (String) map.get("types");
enerty.setType(typeString);
enertyArrayList.add(enerty);
ll = new LatLng(cloudPoiInfo.latitude,cloudPoiInfo.longitude);
if (typeString.equals("1")) {
oo = new MarkerOptions().icon(bd1).position(ll);
oo = new MarkerOptions().icon(bd2).position(ll);
//这里给数组赋值
markerx[i] = (Marker) mBaiduMap.addOverlay(oo);
builder.include(ll);
//添加圆,是指标记一个范围,如附近200米
LatLng llCircle = new LatLng(location.getLatitude(),
location.getLongitude());
OverlayOptions ooCircle = new CircleOptions().fillColor(0x3054FF9F)
.center(llCircle).stroke(new Stroke(5, 0x3033cccc))
.radius(1200);
//给地图添加标注点
mBaiduMap.addOverlay(ooCircle);
} catch (Exception e) {
public void onGetDetailSearchResult(DetailSearchResult result, int error) {
if (result != null) {
if (result.poiInfo != null) {
Toast.makeText(MapActivity.this,result.poiInfo.title,Toast.LENGTH_SHORT).show();
Toast.makeText(MapActivity.this, "status:"+error,Toast.LENGTH_SHORT).show();
把点添加到地图上之后就可以点击了,点击弹出一个popwindow显示简介,点击popwindow跳到详情页;
// 点击标注弹出layout,点击layout的事件
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
public boolean onMarkerClick(final Marker marker2) {
Button button = new Button(MapActivity.this);
button.setBackgroundResource(R.drawable.popmap);
InfoWindow.OnInfoWindowClickListener listener =
for (int i = 0; i & markerx. i++) {
if (marker2 == markerx[i]) {
button.setText(enertyArrayList.get(i).getName());
listener = new InfoWindow.OnInfoWindowClickListener() {
public void onInfoWindowClick() {
mBaiduMap.hideInfoWindow();
Intent intent = new Intent(MapActivity.this,
DetailActivity.class);
intent.putExtra("p", enertyArrayList.get(p));
if (DEBUG) {
intent.putExtra("lat", 35.);
intent.putExtra("lon", 116.);
intent.putExtra("lat",location.getLatitude());
intent.putExtra("lon",location.getLongitude());
startActivity(intent);
AnimUtil.animToSlide(MapActivity.this);
LatLng ll = marker2.getPosition();
mInfoWindow = new InfoWindow(BitmapDescriptorFactory
.fromView(button), ll, -47, listener);
mBaiduMap.showInfoWindow(mInfoWindow);
至于详情页的显示那就是全景图和导航的一些API了,这里还有一些我刚开始用到的一些方法
//构建测试数据,浮点数的格式化,随机数
ArrayList&Enerty& initData() {
ArrayList&Enerty& enertyArrayList = new ArrayList&Enerty&();
Random rd1;
BigDecimal temp1, temp2, lat,
if (enertyArrayList.size() == 0) {
for (int i = 0; i & 10; i++) {
temp1 = new BigDecimal(rd1.nextDouble() * 0.05 + 36.651216);
lat = temp1.setScale(6, RoundingMode.DOWN);
temp2 = new BigDecimal(rd1.nextDouble() * 0.1 + 117.081125);
lon = temp2.setScale(6, RoundingMode.DOWN);
Enerty enerty1 = new Enerty("辰欣药" + i, "环城路" + i, lat.doubleValue(), lon.doubleValue());
enertyArrayList.add(enerty1);
return enertyArrayL
//添加一个标记返回一个marker
public void setMarkers() {
LatLng point = new LatLng(39.6.400244);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions options = new MarkerOptions()
.position(point)
//设置marker的位置
.icon(bitmap)
//设置marker图标
.zIndex(9)
//设置marker所在层级
.draggable(true);
//设置手势拖拽
//将marker添加到地图上
Marker marker = (Marker)(mBaiduMap.addOverlay(options));
//调用BaiduMap对象的setOnMarkerDragListener方法设置marker拖拽的监听
mBaiduMap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() {
public void onMarkerDrag(Marker marker) {
public void onMarkerDragEnd(Marker marker) {
//拖拽结束
public void onMarkerDragStart(Marker marker) {
//开始拖拽
研究第三方的SDK出了问题怎么办,去论坛发帖,搜索相关内容,加群;由于版本更新导致很多问题,不要在意新旧版本,能用就行;文档和demo中的代码不一致,以代码为主;不要把诸多测试样例放一起;百度提供了混淆的相关配置写法;
一种直接用android操作excel的方法
public class BdCodingActivity extends Activity implements OnGetGeoCoderResultListener {
GeoCoder mS
TextView tv_
Button bt_
int totalC
Timer timer = new Timer(true);
Sheet readS
WritableSheet writeS
protected void onCreate(Bundle savedInstanceState) {
SDKInitializer.initialize(getApplicationContext());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bdcoding);
tv_code = (TextView) findViewById(R.id.tv_bdcode);
bt_uploadpois = (Button) findViewById(R.id.bt_uploadpois);
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
File dataFile = new File(Environment.getExternalStorageDirectory().getPath() + "/hrss_data.xls");
wb = Workbook.getWorkbook(dataFile);
readSheet = wb.getSheet(0);
totalCount = readSheet.getRows();
wbook = Workbook.createWorkbook(dataFile, wb);
writeSheet = wbook.getSheet(0);
} catch (Exception e) {
tv_code.setText("获取xls文件异常," + e.getMessage());
int i = 0;
public void gainGeoCode(View v) {
timer.schedule(new TimerTask() {
public void run() {
String address = readSheet.getCell(1, i).getContents();
if(TextUtils.isEmpty(address)){
address = readSheet.getCell(0, i).getContents();
mSearch.geocode(new GeoCodeOption().city("威海").address(address));
}, );//开启服务1秒后启动线程,并且每两秒循环一次
protected void onDestroy() {
mSearch.destroy();
super.onDestroy();
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
tv_code.setText("第" + i + "条未能找到结果");
String strInfo = String.format("纬度:%f 经度:%f", result.getLocation().latitude, result.getLocation().longitude);
tv_code.setText("第" + i + "条," + strInfo);
writeSheet.addCell(new Label(2, i - 1, String.valueOf(result.getLocation().longitude)));
writeSheet.addCell(new Label(3, i - 1, String.valueOf(result.getLocation().latitude)));
} catch (Exception e) {
tv_code.setText("写excel异常" + e.getMessage());
if(i == totalCount){
wbook.write();
wbook.close();
} catch (Exception e) {
e.printStackTrace();
timer.cancel();
bt_uploadpois.setVisibility(View.VISIBLE);
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Log.w("BAIDU", "抱歉,未能找到结果");
Log.v("BAIDU", result.getAddress());
tv_code.setText(result.getAddress());
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:}

我要回帖

更多关于 百度地图api创建应用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信