上学的时候,学习Android,当时正赶上参加各种比赛的热潮,互联网+…挑战杯…思来想去,决定不如在安卓中嵌入一个地图,实现定位功能,一来可以摆脱学校中所学的基础,可以提高一点项目的*格。然后在高德和百度两家地图做选择,最终,选择了本人平时常用的百度地图…好了,废话不多说了,开始为项目添加百度地图吧!!
第一步
百度地图开发者平台 点击进入
在开发文档中找到,Android开发,这里有很多选项,里面的内容,怎么说呢,我是看的挺懵的,所以按照项目需求来,选择第一项 Android地图SDK
点击获取密匙
创建应用
填写名称、应用类型选择Android SDK
启动服务这块 其实都勾选上也无所谓
注意了 这里需要 添加发布版的SHA1 和项目包名
项目包名简单 发布版的SHA1获取方式如下
首先找到 c盘 用户里 .android文件 然后cd到这个文件中,执行命令:
keytool -list -v -keystore debug.keystore
然后会提示 输入密匙库口令:
输入 android 即可
拿到密匙后 回到界面 创建项目。
这里可能会出现keytool 不是内部或外部命令,解决办法如下
进入到jdk安装目录的bin目录下,再输入以下命令即可获得SHA1
传送门:keytool解决办法
继续进行
拿到 SHA1 和 填入包名后
会有如上的(AK) ,这个就是我们项目需要的东西了
新建Android工程
然后在AndroidManifest.xml里添加
value就是你的 (AK)
然后继续返回到开发者平台
这次我们将需要的相关工具下载下来
JAR下载
选择需要的功能,后续会出导航类项目~
然后将下载好的工具包放入到Android工程中,具体位置如下
将liblocSDK4.so文件拷贝到libs/armeabi目录下。
将locSDK4.0.jar文件拷贝到工程的libs目录下
然后在安卓的build.gradle里添加相关依赖
implementation files(‘libs/BaiduLBS_Android.jar’)
加载一下…
然后在layout里新建 activity_map.xml
或者直接创建新的Activity
在activity_map.xml中添加如下代码
因为我是在Framgent中嵌入百度地图
public class TabMapFragment extends Fragment implements OnGetGeoCoderResultListener {
private static final String TAG="app_safety_Fragment";
private MapView mapView=null;
private BaiduMap baiduMap;
// 定位相关
private LocationClient locationClient;
boolean isFirstLoc = true;// 是否首次定位
LocationClientOption option = null;
GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,
Bundle savedInstanceState) {
SDKInitializer.initialize(getActivity().getApplicationContext());
View view = inflater.inflate(R.layout.activity_map, container, false);
btn =view.findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MenuActivity)getActivity()).setSpinnerAdapter();
}
});
mapView = (MapView) view.findViewById(R.id.bmapView);
baiduMap = mapView.getMap();
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
// 开启定位图层
baiduMap.setMyLocationEnabled(true);
// 定位初始化
locationClient = new LocationClient(getActivity().getApplicationContext());
locationClient.registerLocationListener(new MyLocationListener());//将原代码中public class MyLocationListener implements BDLocationListener改为 public class MyLocationListener extends BDAbstractLocationListener
option = new LocationClientOption();
Log.i(TAG, "==-->option:="+option);
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置定位模式:高精度,低功耗,仅设备
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);//设置每秒更新一次位置信息
// option.disableCache(false);// 禁止启用缓存定位
option.setIsNeedLocationDescribe(true);//设置需要位置描述信息
option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(true);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
option.setNeedDeviceDirect(true);//可选,设置是否需要设备方向结果
option.setOpenAutoNotifyMode(); //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者
locationClient.setLocOption(option);
locationClient.start();
return view;
}
/**
* 定位SDK监听函数
*/
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mapView == null)
return;
// // 反Geo搜索
mSearch.reverseGeoCode(new ReverseGeoCodeOption()
.location(baiduMap.getMapStatus().target));
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
baiduMap.setMyLocationData(locData);
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
// 设置地图中心点
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
.newMapStatus(new MapStatus.Builder().target(latLng)
.overlook(-15).rotate(180).zoom(17).build());
baiduMap.setMapStatus(mapStatusUpdate);
if (isFirstLoc) {
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(u);
if (baiduMap.getLocationData() != null)
if (baiduMap.getLocationData().latitude == location.getLatitude()
&& baiduMap.getLocationData().longitude == location.getLongitude()) {
isFirstLoc = false;
}
}
}
}
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
}
运行效果图:
2020年起,添加了相机功能 后续功能还在开发中