百度地图:
1:找地方
2:规划路线
3:定位,上报位置;
4: 轨迹
developer.baidu.com
点击LBS
http://developer.baidu.com/map/
第三方的SDK的使用方式:
1:文档,
2:SDK
3:案例
4:申请Key
BaiduMapDemo
周边雷达,可以搜索使用相同app的
Key的申请地址为:http://lbsyun.baidu.com/apiconsole/key
新版本KEY
安全码:很重要======================================
C:\Documents and Settings\Administrator\.android
注意目录是C:\Documents and Settings\Administrator\.android
SHA1:
包名:
1:准备包名。Gradle 可以同时支持多个不同的包名,
需要为每一个包名进行注册申请的;
包名:模块下面build.gradle中包含的applicationId
//
applicationId "com.kodulf.baidumapdemo"
2:数字签名:获取,百度地图,通过一台电脑中特有的数字签名文件,(Android的密码文件)
来进行唯一电脑的识别:每一台电脑,默认的密码存储文件是不一样的,
通过获取密码存储文件中的数字签名信息,进行注册就能够实现特有的一台电脑才可以
打包生成baidu地图的程序。除了这台电脑,其他电脑打出来的包就不行,显示不了地图。
只有这台电脑打包出来的文件,才可以使用百度地图功能。
拷贝key.store的文件。
keystore 文件。
1:用户目录是C:\Documents and Settings\Administrator\.android
debug.keystore 这个文件是一台电脑在进行Android 程序调试的时候,使用密码文件,
这个文件打开密码“android”实际上就是用于调试的;
2:如果需要实现多人单独调试,建议奖注册者的debug.keystore复制给团队其他人。
3:真正开发时候是不用这样做的。对于Gradle而言,最好的手段是为每一个项目单独生成keyStore文件。
把这个文件放在工程目录下面。--------------------------------------------
------------------------------------------------------------------------
?????????????????????????????????????
关于.android文件夹,凡是配置了ANDROID_SDK_HOME的变量的,
.android文件的文件夹位置就是配置的变量的位置。
C:\Documents and Settings\Administrator\.android>keytool -list -v -keystore debug.keystore
输入keystore密码:
Keystore 类型: JKS
Keystore 提供者: SUN
您的 keystore 包含 1 输入
别名名称: androiddebugkey
创建日期: 2015-10-21
项类型: PrivateKeyEntry
认证链长度: 1
认证 [1]:
所有者:CN=Android Debug, O=Android, C=US
签发人:CN=Android Debug, O=Android, C=US
序列号:5626e634
有效期: Wed Oct 21 09:11:16 CST 2015 至Fri Oct 13 09:11:16 CST 2045
证书指纹:
MD5:57:04:03:9E:FE:8C:F6:DD:C3:45:9A:27:23:27:D0:23
SHA1:61:E6:03:08:2F:02:7C:DE:CF:40:0B:54:AE:88:C9:EF:2D:6D:97:12
签名算法名称:SHA1withRSA
版本: 3
把SHA1放到申请里面:
得到AK:
EZnt3mkL94jEx6WlLQ0jEi4f
Baidu SDK 的 libs代表标准android工程的代码,里面的jar和我们之前手动的拷贝v4包一样。
里面的.so是c语言写的。
这样的包android studio里面是没法用的。
---------------------------------------
android 的libs里面脂肪jar 包。
将jar包放到libs 里面
然后再main 的文件夹下新建jniLibs。
将除了jar文件的文件夹放到jniLibs里面了。
点击rebuild,或者右边栏的gradle的刷新按钮。
--------------------------------------
参考:
Android Studio工程配置方法
第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,放入libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。
第二步:导入jar包。菜单栏选择File->Project Structor->Modules->Dependencies,点击+号,选择File dependency,选择jar包导入。
通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。
---------------------------------------------------------------------------------------
<!--baidu的整合和配置
注册的AK,对饮本台的.android/debug.keystore.如果没有配置AK,那么百度地图不可用
-->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="EZnt3mkL94jEx6WlLQ0jEi4f" />
<!--访问网络状态 -->
<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"/>
<!--修改wifi设置-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--访问wifi设置-->
<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" />
<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
baidu地图必须要初始化:
而且要在setContentView之前执行。
//初始化百度map的内部使用的数据。
SDKInitializer.initialize(getApplicationContext());
//因为在布局中定义的MapView,在加载的时候,就需要使用这个数据了。
// 所以才要调用初始化方法,
setContentView(R.layout.activity_main);
<!--应用程序启动之后,第一个执行的java代码,在application 中
默认情况,application不指定name属性的情况下,android就会在程序启动的时候,
创建一个默认的application 类对象,作为整个应用的全局入口
如果有一些代码,需要在整个应用程序启动的时候,在Activity 启动之前,或者service启动之前,也就是说四大
组件启动之前,(其实是三大组件,不包含contentProvider)执行自定义的初始化代码,那么就需要指定自己的applicaiton类。
Application 子类,有时候也作为全局的,唯一的数据存储区,每一个组件都可以直接方法这个存储区
-->
新建一个MainApplication 继承Application
onCreate方法
public class MainApplication extends Application {
/**
* 在所有的应用程序组件启动之前,程序刚刚启动的时候,回调这个方法,
*
*/
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.initialize(getApplicationContext());
}
}
然后删除掉mainActivity 里面的onCreate 里面的那句话
清单文件里面添加:
android:name=".MainApplication"
mapView = (MapView)findViewById(R.id.map_view);
//百度地图,核心: 内部的各宗操作,配置,都是通过BaiduMap来完成的。
BaiduMap map = mapView.getMap();
//设置地图类型:普通2D,卫星图
map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
分享:
wamp,wordpress
draw9patch
保存的命名必须是.9
自v2.3.5 版本开始,地图才开始支持Fragment的框架。
注意已经要注意
实施交通图,
//2.是否显示交通路况
map.setTrafficEnabled(true);
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnAddMarker"
android:text="添加一个机器人"/>
覆盖物需要通过覆盖物参数对象来设置信息
public void btnAddMarker(View view) {
//在地图上添加一个图片显示的标记(Marker)
//用于地图上显示图像(场景:地图上标记用户头像,搜索结果大头钉。)
//添加的步骤,1:准备覆盖物参数,只能通过参数来添加。
//2:通过baidumap 来添加参数,生成真正的覆盖物对象
//3. 设置覆盖物的参数,实现动态的处理:
MarkerOptions options = new MarkerOptions();
//覆盖物是与地图绑定的,内部采用仅为度作为位置定义
LatLng position = new LatLng(39.963175,116.400244);
options.position(position);
//latitue 维度
//longitute 经度
//参数一:维度
//参数二:进度
//所有的覆盖物都是与地图相关的
//!!!Marker 必须设置图片,否则抛出异常
BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
options.icon(descriptor);
//通过Options 来添加Marker
//Overlay 代表覆盖物的意思,我们的mark 就是覆盖物
map.addOverlay(options);
//marker的特点是地图缩小,机器人还不缩小。
}
=================================================================
Marker 叫做标记标记,Overlay 才叫做覆盖物========================
=================================================================
如果想要覆盖物可以移动,
//添加Marker 可以设置是否可以拖拽
options.draggable(true);
覆盖物的继承关系:
OverlayOptions 父类
MarkerOptions 是子类
map.addOverlay(options)的返回值是一个Overlay
Overlay 是父类
Marker 是子类。
Marker marker = (Marker)map.addOverlay(options);
//marker的特点是地图缩小,机器人还不缩小。
// 覆盖物的继承关系:
// OverlayOptions 父类
// MarkerOptions 是子类
//
// map.addOverlay(options)的返回值是一个Overlay
// Overlay 是父类
// Marker 是子类。
//3.设置Marker的拖拽处理
//所有关于地图中的额股改无的师傅支持,都是由BaiduMap类对象来实际完成的
//设置拖拽监听也是由BaiduMap 来完成的。
map.setOnMarkerDragListener(this);
实现接口:
//百度地图 内部Marker覆盖物拖拽的事件处理方法;
/**
* 移动中回调
* @param marker
*/
@Override
public void onMarkerDrag(Marker marker) {
}
/**
* 拖拽移动完成时候回调
* @param marker
*/
@Override
public void onMarkerDragEnd(Marker marker) {
//获取当前Marker的位置
//获取的就是经纬度。
LatLng latLng = marker.getPosition();
Toast.makeText(this,latLng.toString(),Toast.LENGTH_LONG).show();
}
/**
* 拖着开始的时候回调
* @param marker
*/
@Override
public void onMarkerDragStart(Marker marker) {
}
下午第二课:
添加附加属性:
在btn的方法里面:
//添加附加属性:
//通过Bundle 可以传递附加的特定与当前Mark的信息
Bundle info = new Bundle();
info.putString("name","天安门"+System.currentTimeMillis());
options.extraInfo(info);//为了实现点击不同的处理和显示;
在onMarkerClick 方法里面添加:
public boolean onMarkerClick(Marker marker) {
//通过marker 中的extraInfo 可以来区分和显示不同的内容
Bundle extraInfo = marker.getExtraInfo();
String name="无名称";
if(extraInfo !=null){
if(extraInfo.containsKey("name")){
name = extraInfo.getString("name");
}
}
Toast.makeText(this,"点击了一个"+name,Toast.LENGTH_LONG).show();
//Toast.makeText(this,"点击了一个"+marker.getPosition(),Toast.LENGTH_LONG).show();
return false;
}
定位。POI检索,路劲规划,
http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0
定位和地图到底是一个什么关系。
通过GPS,手机,网络来进行当前手机位置的定位,最终通过回调接口获取当前的维经度位置
定位的使用:
申请Key,只要地图申请了Key ,定位一样使用;
关于SDK的下载,1:如果只用到白的的定位ie,那么值下载百度的定位的SDK就好了
2:如果需要定位和地图两个功能,那么一次下载全部选择,不要单独下载
1:关于定位的整合,
在application标签中生命service 组件,每个app拥有自己的
<!-- 百度定位服务,不写这个服务,定位无法操作,名称固定不变
process 属性代表,当前指定的Service 运行在哪一个进程中
属性值代表进程的名称,凡是以“:”开头的名称,都代表在当前程序中执行的时候创建一个私有的进程
也就是说一个程序可以同时包含两个进程,
service运行在独立的进程中;
-->
<service android:name="com.baidu.location.f"/>
2:权限:
完整的拷贝过来。
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
3://百度定位部分
//用于定位操作的主要的工具类:
private LocationClient mLocationClient;
mLocationClient = new LocationClient(getApplicationContext());
//定位功能需要设置定位结果回调接口,不论定位成功还是失败,
mLocationClient.registerLocationListener(this);
//---------------------------------------
//定位结果回调
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//TODO: 利用BDLoacation.getLocType()来判断成功和失败,以及定位类型
int locType = bdLocation.getLocType();
//可以通过BDLocation.TypeXxxxXxxx来判断类型代表的内容
double latitute =bdLocation.getLatitude();
double longtitute=bdLocation.getLongitude();
Log.d("Location", "" + latitute + " " + longtitute);
}
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnCheckLocation"
android:text="定位当前位置"/>
如果使用百度定位,然后定位的信息显示在高德地图上,那么需要使用gcj02
/**
* 手动定位一次
* @param view
*/
public void btnCheckLocation(View view) {
//准备参数
LocationClientOption option = new LocationClientOption();
//设置定位的模式,最要在于定位的精度,高精度,低功耗,仅设备
// LocationClientOption.LocationMode.Hight_Accuracy;
// LocationClientOption.LocationMode.Battery_Saving;
// LocationClientOption.LocationMode.Device_Sensors;
option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);
//默认的情况下,百度定位返回的坐标系百度地图使用的时候会有偏差。
//使用bd09ll 代表百度地图自身使用的经纬度latitue longtitue,我们就是使用这个bd09ll
//使用“gcj02” 代表“国家测绘局”使用的坐标系数据。
//使用“bd09”墨卡托投影
//如果使用百度定位,然后定位的信息显示在高德地图上,那么需要使用gcj02.
//-----------------
option.setCoorType("bd09ll");//注意后面的是字母l,而不是1
//设置定位的扫描间隔,如果小于1000,代表执行一次;对于只执行一次的而言,不设置更好
//如果大于1000,代表每间隔多少毫米,进行一次定位刷新,
option.setScanSpan(5000);
//设置是否返回当前的街道名称地址
option.setIsNeedAddress(true);
//是否打开Gps
option.setOpenGps(true);
//推荐使用的,但是没有意义,百度定位用于统计客户端信息的,可能以后会给开发者查看报表
option.setProdName("xueziqiang");
//给LocationClient 来设置参数,
mLocationClient.setLocOption(option);
//获取定位地址(一次or循环)
mLocationClient.start();//start开始定位,如果setScanSpan()大于1000会重复定位,除非stop
//如果想单独一次,请求一次定位就行了
mLocationClient.requestLocation();
}
在Destory 里面:
mLocationClient.unRegisterLocationListener(this);
mLocationClient.stop();
更新:
----------------------------------------------------------------
//---------------------------------------
//定位结果回调
private void updateCurrentLocationMarker(BDLocation location){
MarkerOptions options =new MarkerOptions();
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
options.position(latLng);
BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
options.icon(icon);
map.addOverlay(options);
}
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//TODO: 利用BDLoacation.getLocType()来判断成功和失败,以及定位类型
int locType = bdLocation.getLocType();
//可以通过BDLocation.TypeXxxxXxxx来判断类型代表的内容
switch (locType){
case BDLocation.TypeNetWorkLocation:
case BDLocation.TypeCacheLocation:
case BDLocation.TypeGpsLocation:
double latitute =bdLocation.getLatitude();
double longtitute=bdLocation.getLongitude();
bdLocation.getCountry();//国家
bdLocation.getProvince();//省
bdLocation.getCity();//市
bdLocation.getDistrict();//区
bdLocation.getStreet();//街道
bdLocation.getStreetNumber();//街道号
bdLocation.getAddrStr();
Log.d("Location", "" + latitute + " " + longtitute);
updateCurrentLocationMarker(bdLocation);
break;
default:
//定位失败
break;
}
}
----------------------------------------------------------------
这个时候会有很多的Marker
设置一个成员变量Marker
//---------------------------------------
//定位结果回调
private Marker currentLocationMarker;
private void updateCurrentLocationMarker(BDLocation location){
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
if(currentLocationMarker==null) {
MarkerOptions options = new MarkerOptions();
options.position(latLng);
BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
options.icon(icon);
//map.addOverlay(options);
currentLocationMarker=(Marker)map.addOverlay(options);
}else{
currentLocationMarker.setPosition(latLng);
}
}
------------------------------------------------------------------
百度地图怎么跟着中心位置移动呢?
百度地图状态更新:包括缩放级别。
1:状态
2:当前显示的地图中心位置设置
3:设置地图的缩放级别
//动态的切换当前的地图位置以定位的坐标为中心点;
//需要动态的更新地图状态,
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(latLng);//设置中心点
map.setMapStatus(mapStatusUpdate);
完整的就是:
//---------------------------------------
//定位结果回调
private Marker currentLocationMarker;
private void updateCurrentLocationMarker(BDLocation location){
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
//更新当前位置的图标:
if(currentLocationMarker==null) {
MarkerOptions options = new MarkerOptions();
options.position(latLng);
BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
options.icon(icon);
//map.addOverlay(options);
currentLocationMarker=(Marker)map.addOverlay(options);
}else{
currentLocationMarker.setPosition(latLng);
}
//动态的切换当前的地图位置以定位的坐标为中心点;
//需要动态的更新地图状态,
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(latLng);//设置中心点
map.setMapStatus(mapStatusUpdate);
}
-------------------------------------------------------------------------
如果我要查询当前500米以内的美食,公交站台。
定位里面的:Poi point of interesting。
地图里面的:的Poi,http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_6_1/
PoiSearch
修改Scan为0,就是只执行一次。
//用于搜索周边信息的
private PoiSearch poiSearch;
onCreate()-->poiSearch = PoiSearch.newInstance();
onDestory()--> poiSearch.destroy();
public void btnFindFoodNearby(View view) {
//TODO: 查找周边的美食
//需要使用PoiSearch引擎,最好是一个成员变量,onCreate 去初始化。onDestory销毁
//查找周边
if(currentLocationMarker!=null) {
PoiNearbySearchOption option = new PoiNearbySearchOption();
option.location(currentLocationMarker.getPosition());
option.keyword("美食").radius(1000);//半径500,1000,2000
poiSearch.searchNearby(option);
}
}
onCreat 里面设置poiSearch.setOnGetPoiSearchResultListener(this);
继承
//poi结果回调
@Override
public void onGetPoiResult(PoiResult poiResult) {
//结果包含在poi中
List<PoiInfo> allPoi = poiResult.getAllPoi();
if (allPoi != null) {
for(PoiInfo poi:allPoi){
LatLng location = poi.location;
String name = poi.name;
String address = poi.address;
MarkerOptions options = new MarkerOptions();
options.position(location).title(name);
//BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
BitmapDescriptor icon = BitmapDescriptorFactory.fromAsset("Icon_mark1.png");
options.icon(icon);
Bundle bundle = new Bundle();
bundle.putString("address",address);
options.extraInfo(bundle);
map.addOverlay(options);
}
}
}
缩放级别:
使用MapController 类的setZoom方法。
Eg:mapView.getController().setZoom(13);支持缩放级别范围为3-18
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(15).build()));//设置缩放级别