Android 通过百度地图SDK 实现地图显示和定位(一)

请点击链接查看完整的

Android 通过百度地图SDK 实现地图显示和定位(一)。

访问百度地图API 网站,查看流程。

http://lbsyun.baidu.com/index.php?title=androidsdk

获取密匙(AK)

要使用百度地图的sdk 首先先申请自己的应用的密匙(Ak)

填写相关的信息。

SHA1的获取(两种方法)

解释:SHA1安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准Digital Signature Standard DSS)里面定义的数字签名算法(DigitalSignature Algorithm DSA)。

Eclipse 的SHA1 获取方法(两种)

通过打包签名的方式进行获取

【1】右键项目->report(输出)

Next

注意这个 project 不能是中文

你可以创建新的存放签名的路径,获取选择原来创建过的路径。(上图是使用已经创建过的路径)

************************************

先演示创建新的路径方式

Location 自己设定存放的路径,记得起个名

Password 密码

Confirm 重复密码

填写你自己的信息

写好的你的密码,其它参数参照网上看下。

下来点 Finish 就行了

注意这个只是 创建一个路径,没有将应用打包签名

使用旧路径来实现应用的打包签名

重要的时候来了

两种加密方式

MD5 和SHA1

所以我们就拿到了SHA1 的值。点击Finish 就打包签名成功。

SHA1:00:1A:65:CC:EC:EE:A4:84:C6:AA:6F:C4:4D:AD:76:A1:25:2F:73:03

使用 adt 22 以上版本,可以在 eclipse 中直接查看SHA1。

Windows:依次在 eclipse 中打开 Window -> Preferances -> Android-> Build。

Mac:依次在 eclipse 中打开 Eclipse/ADT->Preferances -> Android-> Build。

在弹出的 Build 对话框中“SHA1fingerprint” 中的值即为 Android 签名证书的 Sha1 值,如下图所示:

SHA1fingerprint E8:92:24:5E:1A:0B:61:25:45:D4:09:A2:23:54:89:A2:36:44:7D:13

这个应该是debug 下的SHA1

未经测试,还不知道

申请创建应用

将我们拿到的SHA1 的值和我们项目的包名提交。

下载jar包

http://lbsyun.baidu.com/sdk/download?selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar

我们将我们需要的服务都选中

下载开发包 和 实例代码

创建项目,加载jar包

查看官方的开发指南

http://lbsyun.baidu.com/index.php?title=androidsdk/guide/buildproject

Eclipse工程配置方法

第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下(官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加),拷贝完成后的工程目录如下图所示;

第二步:在工程属性->JavaBuild Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回。

通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。

注意:由于adt插件升级,若您使用Eclipse adt 22的话,需要对开发环境进行相应的设置,方法如下:

1. 在Eclipse 中选中工程,右键选 Properties->Java BuildPath->Order and Export 使 Android Private Libraries处于勾选状态;

2. Project ->clean-> clean all .

显示百度地图

百度地图SDK为开发者提供了便捷的显示百度地图数据的接口,通过以下几步操作,即可在您的应用中使用百度地图数据:

第一步:创建并配置工程(具体方法参见工程配置部分的介绍);

第二步:在AndroidManifest中添加开发密钥、所需权限等信息;

(1)在application中添加开发密钥

<application> 
<meta-data 
android:name="com.baidu.lbsapi.API_KEY" 
android:value="开发者 key"/> 
</application>

2)添加所需权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

第三步,在布局xml文件中添加地图控件;

<com.baidu.mapapi.map.MapView 
android:id="@+id/bmapView" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:clickable="true"/>

第四步,在应用程序创建时初始化SDK引用的Context 全局变量:

publicclass MainActivity extends Activity { 
@Override 
protectedvoid onCreate(Bundle savedInstanceState){ 
super.onCreate(savedInstanceState); 
//在使用SDK各组件之前初始化context信息,传入ApplicationContext 
//注意该方法要再setContentView方法之前实现 
SDKInitializer.initialize(getApplicationContext()); 
setContentView(R.layout.activity_main); 
} 
}

注意:在SDK各功能组件使用之前都需要调用

SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中

第五步,创建地图Activity,管理地图生命周期;

publicclass MainActivity extends Activity { 
MapView mMapView =null; 
@Override 
protectedvoid onCreate(Bundle savedInstanceState){ 
super.onCreate(savedInstanceState); 
//在使用SDK各组件之前初始化context信息,传入ApplicationContext 
//注意该方法要再setContentView方法之前实现 
SDKInitializer.initialize(getApplicationContext()); 
setContentView(R.layout.activity_main); 
//获取地图控件引用 
mMapView =(MapView) findViewById(R.id.bmapView); 
} 
@Override 
protectedvoid onDestroy(){ 
super.onDestroy(); 
//activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 
mMapView.onDestroy(); 
} 
@Override 
protectedvoid onResume(){ 
super.onResume(); 
//activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 
mMapView.onResume(); 
} 
@Override 
protectedvoid onPause(){ 
super.onPause(); 
//activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 
mMapView.onPause(); 
} 
}

完成以上步骤后,运行程序,即可在您的应用中显示如下地图:

以上的例子为大家介绍了如何构建一个基础的地图页面。地图控件自v2.3.5版本起,支持多实例,即开发者可以在一个页面中建立多个地图对象,并且针对这些对象分别操作且不会产生相互干扰。具体使用方法请参考MutiMapViewDemo中的相关介绍。

此外,自v2.3.5版本开始。MapView控件还增加了对Fragment框架的支持。用户可以使用SupportMapFragment控件完成相应框架内的开发工作(详见MapFragmentDemo)。

注意:你的jar包需要下都是一个版本的,版本不一样就会出现很多的问题。

***********************************************************明天重新写一个Demo 看看到底怎么写

BaiduMapDemo 实现

2016年11月1日17:19:48

【1】实现百度地图的显示

【2】实现定位功能

实现百度地图的显示

准备下载基础的jar包,并且加载到类库中去。

显示百度地图

百度地图SDK为开发者提供了便捷的显示百度地图数据的接口,通过以下几步操作,即可在您的应用中使用百度地图数据:

第一步:创建并配置工程(具体方法参见工程配置部分的介绍);

第二步:在AndroidManifest中添加开发密钥、所需权限等信息;

(1)在application中添加开发密钥

<application> 
<meta-data 
android:name="com.baidu.lbsapi.API_KEY" 
android:value="开发者 key"/> 
</application>

2)添加所需权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

第三步,在布局xml文件中添加地图控件;

<com.baidu.mapapi.map.MapView 
android:id="@+id/bmapView" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:clickable="true"/>

第四步,在应用程序创建时初始化SDK引用的Context 全局变量:

publicclass MainActivity extends Activity { 
@Override 
protectedvoid onCreate(Bundle savedInstanceState){ 
super.onCreate(savedInstanceState); 
//在使用SDK各组件之前初始化context信息,传入ApplicationContext 
//注意该方法要再setContentView方法之前实现 
SDKInitializer.initialize(getApplicationContext()); 
setContentView(R.layout.activity_main); 
} 
}

注意:在SDK各功能组件使用之前都需要调用

SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中

第五步,创建地图Activity,管理地图生命周期;

publicclass MainActivity extends Activity { 
MapView mMapView =null; 
@Override 
protectedvoid onCreate(Bundle savedInstanceState){ 
super.onCreate(savedInstanceState); 
//在使用SDK各组件之前初始化context信息,传入ApplicationContext 
//注意该方法要再setContentView方法之前实现 
SDKInitializer.initialize(getApplicationContext()); 
setContentView(R.layout.activity_main); 
//获取地图控件引用 
mMapView =(MapView) findViewById(R.id.bmapView); 
} 
@Override 
protectedvoid onDestroy(){ 
super.onDestroy(); 
//activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 
mMapView.onDestroy(); 
} 
@Override 
protectedvoid onResume(){ 
super.onResume(); 
//activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 
mMapView.onResume(); 
} 
@Override 
protectedvoid onPause(){ 
super.onPause(); 
//activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 
mMapView.onPause(); 
} 
}

完成以上步骤后,运行程序,即可在您的应用中显示如下地图:

以上的例子为大家介绍了如何构建一个基础的地图页面。地图控件自v2.3.5版本起,支持多实例,即开发者可以在一个页面中建立多个地图对象,并且针对这些对象分别操作且不会产生相互干扰。具体使用方法请参考MutiMapViewDemo中的相关介绍。

此外,自v2.3.5版本开始。MapView控件还增加了对Fragment框架的支持。用户可以使用SupportMapFragment控件完成相应框架内的开发工作(详见MapFragmentDemo)。

出现的错误

AuthenticationError errorcode: 200 uid: -1 appid -1 msg: APP不存在

解决方法:将你创建的应用删掉,再创建一个,重新获取AK 值。

定位功能与 地图显示 都分开了

功能类的使用

使用综合定位功能

综合定位功能指的是根据用户实际需求,返回用户当前位置的基础定位服务,包含GPS和网络定位(WiFi定位和基站定位)功能。基本定位功能同时还支持位置描述信息功能,离线定位功能,位置提醒功能和位置语义化功能。

第一步,初始化LocationClient

此处需要注意:LocationClient类必须在主线程中声明,需要Context类型的参数。

Context需要时全进程有效的Context,推荐用getApplicationConext获取全进程有效的Context。

public LocationClient mLocationClient =null;
public BDLocationListener myListener =new MyLocationListener();
publicvoid onCreate(){
 mLocationClient =new LocationClient(getApplicationContext()); //声明LocationClient
 mLocationClient.registerLocationListener( myListener ); //注册监听函数
}

LocationClient类是定位SDK的核心类,具体方法详见类参考

第二步,配置定位SDK参数

设置定位参数包括:定位模式(高精度定位模式、低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。

LocationClientOption类,该类用来设置定位SDK的定位方式,例如:

privatevoid initLocation(){
 LocationClientOption option =new LocationClientOption();
 option.setLocationMode(LocationMode.Hight_Accuracy
);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
 option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
 int span=1000;
 option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
 option.setOpenGps(true);//可选,默认false,设置是否使用gps
 option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
 option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于在北京天安门附近
 option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
 mLocationClient.setLocOption(option);
 }

高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;

低功耗定位模式:这种定位模式下,不会使用GPS进行定位,只会使用网络定位(WiFi定位和基站定位);

仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。

第三步,实现BDLocationListener接口

BDLocationListener为结果监听接口,异步获取定位结果,实现方式如下:

publicclass MyLocationListener implements BDLocationListener {
 @Override
 publicvoid onReceiveLocation(BDLocation location){
 //Receive Location
 StringBuffer sb =newStringBuffer(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){// GPS定位结果
 sb.append("\nspeed: ");
 sb.append(location.getSpeed());// 单位:公里每小时
 sb.append("\nsatellite: ");
 sb.append(location.getSatelliteNumber());
 sb.append("\nheight: ");
 sb.append(location.getAltitude());// 单位:米
 sb.append("\ndirection: ");
 sb.append(location.getDirection());// 单位度
 sb.append("\naddr: ");
 sb.append(location.getAddrStr());
 sb.append("\ndescribe: ");
 sb.append("gps定位成功");
 }elseif(location.getLocType()== BDLocation.TypeNetWorkLocation){// 网络定位结果
 sb.append("\naddr: ");
 sb.append(location.getAddrStr());
 //运营商信息
 sb.append("\noperationers: ");
 sb.append(location.getOperators());
 sb.append("\ndescribe: ");
 sb.append("网络定位成功");
 }elseif(location.getLocType()== BDLocation.TypeOffLineLocation){// 离线定位结果
 sb.append("\ndescribe: ");
 sb.append("离线定位成功,离线定位结果也是有效的");
 }elseif(location.getLocType()== BDLocation.TypeServerError){
 sb.append("\ndescribe: ");
 sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
 }elseif(location.getLocType()== BDLocation.TypeNetWorkException){
 sb.append("\ndescribe: ");
 sb.append("网络不同导致定位失败,请检查网络是否通畅");
 }elseif(location.getLocType()== BDLocation.TypeCriteriaException){
 sb.append("\ndescribe: ");
 sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
 }
sb.append("\nlocationdescribe: ");
 sb.append(location.getLocationDescribe());// 位置语义化信息
 List<Poi> list = location.getPoiList();// POI数据
 if(list !=null){
 sb.append("\npoilist size =: ");
 sb.append(list.size());
 for(Poi p : list){
 sb.append("\npoi=: ");
 sb.append(p.getId()+" "+ p.getName()+" "+ p.getRank());
 }
 }
 Log.i("BaiduLocationApiDem", sb.toString());
 }

BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取错误码,位置的坐标,精度半径等信息。具体方法请参考类参考

获取定位返回错误码::

publicint getLocType ()

返回值:

61 : GPS定位结果,GPS定位成功。

62 : 无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位。

63 : 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。

65 : 定位缓存的结果。

66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。

67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。

68 : 网络连接失败时,查找本地离线定位时对应的返回结果。

161: 网络定位结果,网络定位成功。

162: 请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件。

167: 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。

502: AK参数错误,请按照说明文档重新申请AK。

505:AK不存在或者非法,请按照说明文档重新申请AK。

601: AK服务被开发者自己禁用,请按照说明文档重新申请AK。

602: key mcode不匹配,您的AK配置过程中安全码设置有问题,请确保:SHA1正确,“;”分号是英文状态;且包名是您当前运行应用的包名,请按照说明文档重新申请AK。

501~700:AK验证失败,请按照说明文档重新申请AK。

如果不能定位,请记住这个返回值,并到百度LBS开放平台论坛Andriod定位SDK版块中进行交流,网址:http://bbs.lbsyun.baidu.com/forum.php?mod=forumdisplay&fid=10。若返回值是162~167,请将错误码、IMEI和定位时间反馈至邮箱loc-bugs@baidu.com,以便我们跟进追查问题。

第四步,开始定位

开启:

mLocationClient.start();

start:启动定位SDK。 stop:关闭定位SDK。调用start之后只需要等待定位结果自动回调即可。

开发者定位场景如果是单次定位的场景,在收到定位结果之后直接调用stop函数即可。

如果stop之后仍然想进行定位,可以再次start等待定位结果回调即可。

如果开发者想按照自己逻辑请求定位,可以在start之后按照自己的逻辑请求locationclient.requestLocation()函数,会主动触发定位SDK内部定位逻辑,等待定位回调即可。

位置提醒使用

位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。

//位置提醒相关代码
mNotifyer =new NotifyLister();
mNotifyer.SetNotifyLocation(42.03249652949337,113.3129895882556,3000,"gps");//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)
mLocationClient.registerNotify(mNotifyer);
//注册位置提醒监听事件后,可以通过SetNotifyLocation 来修改位置提醒设置,修改后立刻生效。
//BDNotifyListner实现
publicclass NotifyLister extends BDNotifyListener{
 publicvoid onNotify(BDLocation mlocation, float distance){
  mVibrator01.vibrate(1000);//振动提醒已到设定位置附近
 }
 }
//取消位置提醒
mLocationClient.removeNotifyEvent(mNotifyer);


更多相关文章

  1. Android: 通过Google GeoLocation进行定位
  2. 百度地图android sdk拖拽overlay item
  3. android 基于百度地图api开发定位以及获取详细地址
  4. android瀑布流简单实现原理
  5. Android传感器、语音识别、定位系统、Google Map API、快捷方式
  6. android ------实现高德定位并获取相应信息
  7. Android(安卓)Google Map实例 - 在地图和卫星图之间切换(Android
  8. android调用第三方地图(URI)
  9. 详解Android(安卓)getWidth和getMeasuredWidth

随机推荐

  1. Flutter入门,学习历程,进入开发,在安卓手机
  2. Android传统布局
  3. Android-Universal-Image-Loader 源码解
  4. Android(安卓)Studio插件开发利器Exynap
  5. Android开发中的单元测试-初级教程(01)
  6. [置顶] 编译androidc模块
  7. Android面试基础题总结二
  8. Android中启动其他Activity并返回结果
  9. React Navigation - StackNavigator
  10. android 对话框Dialog背景透明