一、百度地图
0.获取debug.keystore中的证书指纹
Mac中,debug.keystore位于:/Users/wangxianbing/.android/debug.keystore
Window中,debug.keystore位于:C:\Users\Administrator.android\debug.keystore
获取keystore中的指纹:
keytool -v -list -keystore /Users/wangxianbing/.android/debug.keystore
参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak
1、注册
1.百度地图首页
2.点击立即注册
3.打开新页面
http://lbsyun.baidu.com/apiconsole/key/create
需要同意服务条款
4.打开我的应用页面
5.创建应用
6.填入sha1和packagename后点击提交,创建完成
注意,sha1是上文中提到的方法获得
注意访问应用(AK)
参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/androidstudio
2、下载sdk
1.进入http://lbsyun.baidu.com/,点击Android地图SDK
2.点击自定义下载
3.出了默认选中的基础地图,检索功能,LBS云检索,计算工具之外,加上全量定位
4.点击下载开发包
参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/androidstudio
3、集成sdk,显示基本地图
1.新建工程
注意包名(application id)需要和上文平台里配置的一致
2.把下载的jar和so拷贝到新建工程中
3.gradle配置sourceSets
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
4.gradle的dependencies中增加
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation files("libs/BaiduLBS_Android.jar")
5.manifest中新增:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
6.manifest中的application中增加
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="0rcm6GVBb60pHwxDTQGwY8r3BoLmZFpj" />
注意替换value的值
7.新建application的子类,并在manifest中配置
8.在新建的application中初始化
// 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
// 默认本地个性化地图初始化方法
SDKInitializer.initialize(this);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
9.新建Activity,并在manifest中配置
10.新activity的layout中,增加
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
11.新建Activity的onCreate中新增
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/showmap
4、切换地图显示
MapView mMapView;
BaiduMap mBaiduMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_type);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
findViewById(R.id.normal).setOnClickListener(v -> {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
});
findViewById(R.id.satellite).setOnClickListener(v -> {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
});
findViewById(R.id.none).setOnClickListener(v -> {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
});
}
参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/maptype
5、显示定位(我的当前位置)
MapView mMapView;
BaiduMap mBaiduMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_loation);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
mBaiduMap.setMyLocationEnabled(true);
findViewById(R.id.button).setOnClickListener(v -> {
init();
});
}
LocationClient mLocationClient;
private void init() {
//定位初始化
mLocationClient = new LocationClient(this);
//通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
//设置locationClientOption
mLocationClient.setLocOption(option);
//注册LocationListener监听器
MyLocationListener myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层
mLocationClient.start();
}
public class MyLocationListener extends BDAbstractLocationListener {
boolean isFirstLoc = true;
private LatLng mLatLng;
@Override
public void onReceiveLocation(BDLocation location) {
//mapView 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
mLatLng = new LatLng(location.getLatitude(), location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(mLatLng).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
}
参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/location
6、 地理编码及逆地理编码
public class GeoCodeActivity extends AppCompatActivity {
GeoCoder mCoder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_geo_code);
findViewById(R.id.geo_code).setOnClickListener(v -> {
mCoder.geocode(new GeoCodeOption()
.city("北京")
.address("北京上地十街10号"));
});
findViewById(R.id.reverse_geo_code).setOnClickListener(v -> {
LatLng point = new LatLng(39.266847, 117.11638);
mCoder.reverseGeoCode(new ReverseGeoCodeOption()
.location(point)
// 设置是否返回新数据 默认值0不返回,1返回
.newVersion(1)
// POI召回半径,允许设置区间为0-1000米,超过1000米按1000米召回。默认值为1000
.radius(500));
});
init();
}
private void init() {
mCoder = GeoCoder.newInstance();
mCoder.setOnGetGeoCodeResultListener(listener);
}
OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (null != geoCodeResult && null != geoCodeResult.getLocation()) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
//没有检索到结果
return;
} else {
double latitude = geoCodeResult.getLocation().latitude;
double longitude = geoCodeResult.getLocation().longitude;
Toast.makeText(GeoCodeActivity.this, "latitude: " + latitude + " longitude: " + longitude, Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
//没有找到检索结果
return;
} else {
//详细地址
String address = reverseGeoCodeResult.getAddress();
//行政区号
int adCode = reverseGeoCodeResult.getCityCode();
Toast.makeText(GeoCodeActivity.this, reverseGeoCodeResult.toString(), Toast.LENGTH_SHORT).show();
}
}
};
}
参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/search/geo
7、 电子围栏
public class FenceActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fence);
init();
findViewById(R.id.button).setOnClickListener(v-> {
addFence();
});
}
private void addFence() {
//创建一个中心点坐标
DPoint centerPoint = new DPoint(39.266847,117.11638);
//设置中心点纬度
centerPoint.setLatitude(39.266847);
//设置中心点经度
centerPoint.setLongitude(117.11638);
//设置中心点坐标系类型
//public static final String BD09LL 百度经纬度坐标
//public static final String BD09MC 百度墨卡托米制坐标
//public static final String GCJ02 国测局坐标系
//public static final String WGS84 GPS获取的坐标
mGeoFenceClient.addGeoFence (centerPoint,GeoFenceClient.BD09LL,1000,"0001");
}
GeoFenceClient mGeoFenceClient;
private void init() {
//实例化地理围栏客户端
mGeoFenceClient = new GeoFenceClient(getApplicationContext());
//设置希望侦测的围栏触发行为,默认只侦测用户进入围栏的行为
//public static final int GEOFENCE_IN 进入地理围栏
//public static final int GEOFENCE_OUT 退出地理围栏
//public static final int GEOFENCE_STAYED 在地理围栏内停留
//public static final int GEOFENCE_IN_OUT 进入、退出地理围栏
//public static final int GEOFENCE_IN_STAYED 进入地理围栏、在地理围栏内停留
//public static final int GEOFENCE_OUT_STAYED 退出地理围栏、在地理围栏内停留
//public static final int GEOFENCE_IN_OUT_STAYED 进入、退出、停留
mGeoFenceClient.setActivateAction(GeoFenceClient.GEOFENCE_IN_OUT_STAYED);
/**
* setTriggerCount(int in, int out, int stay)
* 设置进入围栏、离开围栏、在围栏内停留三种侦听行为的触发次数
* @param in 进入围栏的触发次数,类型为int,必须是>=0
* @param out 离开围栏的触发次数,类型为int,必须是>=0
* @param stay 在围栏内停留的触发次数,类型为int,必须是>=0
*/
mGeoFenceClient.setTriggerCount(3, 3, 2);
/**
* setStayTime(int interval)
* 当设置了在围栏内停留的侦听行为,可以通过这个方法设置停留时长,单位秒,默认停留时长为10分钟
* @param interval,单位秒
*/
mGeoFenceClient.setStayTime(180);
//创建回调监听
GeoFenceListener fenceListenter = new GeoFenceListener() {
@Override
public void onGeoFenceCreateFinished(List<GeoFence> list, int i, String s) {
if(i == GeoFence.ADDGEOFENCE_SUCCESS){//判断围栏是否创建成功
Toast.makeText(FenceActivity.this, "添加围栏成功!!", Toast.LENGTH_SHORT).show();
//geoFenceList是已经添加的围栏列表,可据此查看创建的围栏
} else {
Toast.makeText(FenceActivity.this, "添加围栏失败!!", Toast.LENGTH_SHORT).show();
}
}
};
mGeoFenceClient.setGeoFenceListener(fenceListenter);//设置回调监听
//创建并设置PendingIntent
mGeoFenceClient.createPendingIntent(GEOFENCE_BROADCAST_ACTION);
IntentFilter filter = new IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(GEOFENCE_BROADCAST_ACTION);
registerReceiver(mGeoFenceReceiver, filter);
}
private BroadcastReceiver mGeoFenceReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(GEOFENCE_BROADCAST_ACTION)) {
//获取Bundle
Bundle bundle = intent.getExtras();
//获取围栏行为:
int status = bundle.getInt(GeoFence.BUNDLE_KEY_FENCESTATUS);
//获取自定义的围栏标识:
String customId = bundle.getString(GeoFence.BUNDLE_KEY_CUSTOMID);
//获取围栏ID:
String fenceId = bundle.getString(GeoFence.BUNDLE_KEY_FENCEID);
//获取当前有触发的围栏对象:
GeoFence fence = bundle.getParcelable(GeoFence.BUNDLE_KEY_FENCE);
Toast.makeText(FenceActivity.this, ""+fence.toString(), Toast.LENGTH_SHORT).show();
}
}
};
//定义接收的action字符串
public static final String GEOFENCE_BROADCAST_ACTION = "com.location.apis.geofencedemo.broadcast";
}
参考:
http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/loc-geofence
8、路径规划
将BaiduMapsApiASDemo中的assets资源以及overlayutil中的代码拷贝过来
public class DrivingRouteActivity extends AppCompatActivity {
MapView mMapView;
BaiduMap mBaiduMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_driving_route);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
findViewById(R.id.button).setOnClickListener(v -> {
PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "西二旗地铁站");
PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "百度科技园");
mSearch.drivingSearch((new DrivingRoutePlanOption())
.from(stNode)
.to(enNode));
});
init();
}
RoutePlanSearch mSearch;
private void init() {
mSearch = RoutePlanSearch.newInstance();
mSearch.setOnGetRoutePlanResultListener(listener);
}
OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
}
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
}
@Override
public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
//创建DrivingRouteOverlay实例
DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaiduMap);
if (drivingRouteResult.getRouteLines().size() > 0) {
//获取路径规划数据,(以返回的第一条路线为例)
//为DrivingRouteOverlay实例设置数据
overlay.setData(drivingRouteResult.getRouteLines().get(0));
//在地图上绘制DrivingRouteOverlay
overlay.addToMap();
}
}
@Override
public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
}
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
}
};
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
}
参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/route/drive