一、基础部分

转载请注明出处:https://blog.csdn.net/Hunter2916/article/details/82867205

1、下载百度地图的SDK

下载地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download

2、申请key值

注册百度账号——>登录百度地图官网——>控制台—–>创建应用

具体方法地址:http://lbsyun.baidu.com/apiconsole/key

3、解压后的jar包放到app下的libs中,并右键add到build.gradle中

build.gradle中添加ndk

ndk {//选择要添加的对应 cpu 类型的.so 库。abiFilters 'armeabi', 'armeabi-v7a', 'armeabi64-v8a', 'x86', 'x86_64'// 还可以添加 'x86', 'x86_64', 'mips', 'mips64'}dependencies{
//百度定位架包compile files('libs/BaiduLBS_Android.jar')
}

4、在manifest.xml中添加key和service

 <meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="你自己申请的key" /><!-- 声明service组件 --><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote" />

5、添加权限

<!-- 这个权限用于进行网络定位-->
<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>//切记有些权限在Android5.0以后还需要在代码中动态获取
//例如:private void requestRunPermissions() {List<PermissionItem> permisson = new ArrayList<>();permisson.add(new PermissionItem(Manifest.permission.READ_PHONE_STATE, "电话状态", R.drawable.permission_ic_phone));permisson.add(new PermissionItem(Manifest.permission.ACCESS_COARSE_LOCATION, "地理位置", R.drawable.permission_ic_location));permisson.add(new PermissionItem(Manifest.permission.ACCESS_FINE_LOCATION, "地理位置", R.drawable.permission_ic_location));if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {permisson.add(new PermissionItem(Manifest.permission.READ_EXTERNAL_STORAGE, "读取权限", R.drawable.permission_ic_storage));permisson.add(new PermissionItem(Manifest.permission.WRITE_EXTERNAL_STORAGE, "写入权限", R.drawable.permission_ic_storage));}HiPermission.create(this).title("开启地图权限").permissions(permisson).filterColor(ResourcesCompat.getColor(getResources(), R.color.colorAccent, getTheme())).style(R.style.PermissionBlueStyle).msg("我们需要获得以下权限才能为您提供服务").checkMutiPermission(new PermissionCallback() {@Overridepublic void onClose() {}@Overridepublic void onFinish() {
//                        showToastShort("所有权限申请完成");}@Overridepublic void onDeny(String permission, int position) {}@Overridepublic void onGuarantee(String permission, int position) {}});}//添加权限第三方框架
compile 'me.weyye.hipermission:library:1.0.7'

6、主界面布局

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

7、Activity中的代码

private BaiduMap mBaiduMap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = DataBindingUtil.setContentView(this, R.layout.activity_main);mBaiduMap = binding.bmapView.getMap();//initView();//在定位之前进行一次动态的获取权限requestRunPermissions();}

在不设置任何属性的情况下,定位在北京比例为5公里

7.1、设置缩放比例并使用静态定位

private void initView() {//更新地图//设置初始化比例  500米左右   zoom越大则地图越详细LatLng latLng = new LatLng(30.272858,120.15941);MapStatus mMapStatus = new MapStatus.Builder().target(latLng).zoom(16).build();MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);        //改变地图状态mBaiduMap.setMapStatus(mMapStatusUpdate);}

二、定位以及长按地图获取地理信息

1、Activity中代码

public class MainActivity extends BaseActivity {ActivityMainBinding binding;private Context context;private BaiduMap mBaiduMap;//定位相关private LocationClient mLocationClient;private MyLocationListener mLocationListener = new MyLocationListener();private Boolean isFirstIn = true;private double latitude;private double longtitude;//定位图标private BitmapDescriptor mIconLocation;private MyOrientationListener myOrientationListener;private float mCurrentX;private LatLng mDestLocationData;private LatLng mLastLocationData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
//        mLocationListener = new MyLocationListener();context = this;binding = DataBindingUtil.setContentView(this, R.layout.activity_main);geoCoder = GeoCoder.newInstance();mBaiduMap = binding.bmapView.getMap();initView();//在定位之前进行一次动态的获取权限
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {requestRunPermissions();
//        }initLocation();}private void initListener() {binding.typeNone.setOnClickListener(this);binding.typeNoraml.setOnClickListener(this);
//        binding.typeSatellite.setOnClickListener(this);binding.typeTraffic.setOnClickListener(this);binding.location.setOnClickListener(this);binding.overlay.setOnClickListener(this);}private void requestRunPermissions() {List<PermissionItem> permisson = new ArrayList<>();permisson.add(new PermissionItem(Manifest.permission.READ_PHONE_STATE, "电话状态", R.drawable.permission_ic_phone));permisson.add(new PermissionItem(Manifest.permission.ACCESS_COARSE_LOCATION, "地理位置", R.drawable.permission_ic_location));permisson.add(new PermissionItem(Manifest.permission.ACCESS_FINE_LOCATION, "地理位置", R.drawable.permission_ic_location));if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {permisson.add(new PermissionItem(Manifest.permission.READ_EXTERNAL_STORAGE, "读取权限", R.drawable.permission_ic_storage));permisson.add(new PermissionItem(Manifest.permission.WRITE_EXTERNAL_STORAGE, "写入权限", R.drawable.permission_ic_storage));}HiPermission.create(this).title("开启地图权限").permissions(permisson).filterColor(ResourcesCompat.getColor(getResources(), R.color.colorAccent, getTheme())).style(R.style.PermissionBlueStyle).msg("我们需要获得以下权限才能为您提供服务").checkMutiPermission(new PermissionCallback() {@Overridepublic void onClose() {}@Overridepublic void onFinish() {
//                        showToastShort("所有权限申请完成");}@Overridepublic void onDeny(String permission, int position) {}@Overridepublic void onGuarantee(String permission, int position) {}});}/*** 定位的方法*/private void initLocation() {
//        binding.LocationResult.setMovementMethod(ScrollingMovementMethod.getInstance());myOrientationListener = new MyOrientationListener(this);mLocationClient = new LocationClient(this);mLocationClient.registerLocationListener(mLocationListener);LocationClientOption option = new LocationClientOption();option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//精确定位option.setCoorType("bd09ll");//可选,设置返回的定位结果坐标系option.setIsNeedAddress(true);//获取详细地址option.setOpenGps(true);//设置是否使用GPS
//        option.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocationoption.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要mLocationClient.setLocOption(option);//定位后的图标 初始化图标mIconLocation = BitmapDescriptorFactory.fromResource(R.mipmap.navi_map_gps_locked);
//设置自定以图标MyLocationConfiguration configuration = newMyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, mIconLocation);mBaiduMap.setMyLocationConfiguration(configuration);}private void initView() {//更新地图//设置初始化比例  500米左右   zoom越大则地图越详细MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);mBaiduMap.setMapStatus(msu);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.type_noraml://普通地图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);break;
//            case R.id.type_satellite://卫星模式
//                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//                break;case R.id.type_none:mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);break;case R.id.type_traffic:if (mBaiduMap.isTrafficEnabled()) {mBaiduMap.setTrafficEnabled(false);binding.typeTraffic.setText("实时路况(开)");} else {mBaiduMap.setTrafficEnabled(true);binding.typeTraffic.setText("实时路况(关)");}break;}}/**** Stop location service*/@Overrideprotected void onStop() {super.onStop();//停止定位mBaiduMap.setMyLocationEnabled(false);mLocationClient.stop();}@Overrideprotected void onStart() {super.onStart();//开启定位mBaiduMap.setMyLocationEnabled(true);//判断的时候注意if (!mLocationClient.isStarted()) {mLocationClient.start();}}@Overrideprotected void onResume() {super.onResume();binding.bmapView.onResume();}@Overrideprotected void onPause() {super.onPause();binding.bmapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();binding.bmapView.onDestroy();}/*** 定位结果回调,重写onReceiveLocation方法,定位的回调  latitude 纬度*/private class MyLocationListener extends BDAbstractLocationListener {if (location == null || binding.bmapView == null) {return;}MyLocationData data = new MyLocationData.Builder().accuracy(location.getRadius()).latitude(location.getLatitude()).longitude(location.getLongitude()).build();mBaiduMap.setMyLocationData(data);@Overridepublic void onReceiveLocation(BDLocation location) {if (isFirstIn) {LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.animateMapStatus(msu);isFirstIn = false;Toast.makeText(context, "我的位置信息为::" + location.getDistrict(),Toast.LENGTH_SHORT).show();}}}}

2、点击按钮回到定位的地方

private double latitude;//纬度
private double longtitude;//经度/*** 获取当前的定位方法*/private void getMyLocation() {LatLng latLng = new LatLng(latitude, longtitude);MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.animateMapStatus(msu);}/*** 定位结果回调,重写onReceiveLocation方法,定位的回调  latitude 纬度*/private class MyLocationListener extends BDAbstractLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {if (location == null || binding.bmapView == null) {return;}MyLocationData data = new MyLocationData.Builder().accuracy(location.getRadius()).direction(mCurrentX)//方向传感器.latitude(location.getLatitude()).longitude(location.getLongitude()).build();mBaiduMap.setMyLocationData(data);latitude = location.getLatitude();longtitude = location.getLongitude();if (isFirstIn) {LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.animateMapStatus(msu);isFirstIn = false;
//                Toast.makeText(context, "我的位置信息为::" + poiList.get(0).getName(),
//                        Toast.LENGTH_SHORT).show();Toast.makeText(context, "我的位置信息为::" + location.getDistrict(),Toast.LENGTH_SHORT).show();}}}

3、长按定位显示信息

 /*** 长按定位图标*/mBaiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {@Overridepublic void onMapLongClick(LatLng latLng) {
//                MapStatus maps = new MapStatus.Builder().target(latLng).zoom(15).build();
//                MapStatusUpdate m = MapStatusUpdateFactory.newMapStatus(maps);//改变地图状态
//                mBaiduMap.setMapStatus(m);//                showToastShort("设置目的地成功");
//                showToastShort("设置目的地成功"+latLng.toString());
//                mDestLocationData = latLng;latlngToAddress(latLng);addDestInfoOverLay(latLng);}});/*** 经纬度或地址相互转换** @param latlng*/private void latlngToAddress(LatLng latlng) {// 设置反地理经纬度坐标,请求位置时,需要一个经纬度
//        geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latlng));//设置地址或经纬度反编译后的监听,这里有两个回调方法,geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {//经纬度转换成地址@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "找不到该地址!", Toast.LENGTH_SHORT).show();}
//                tv_address.setText("地址:" + result.getAddress());assert result != null;showToastShort("地址:" + result.getAddress());}//把地址转换成经纬度@Overridepublic void onGetGeoCodeResult(GeoCodeResult result) {// 详细地址转换在经纬度String address = result.getAddress();}});// 设置反地理经纬度坐标,请求位置时,需要一个经纬度//切记一定要放在下面不然第一次长按定位不走该方法geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latlng));}/*** 长按添加覆盖物** @param latLng*/private void addDestInfoOverLay(LatLng latLng) {//清除所有的覆盖物mBaiduMap.clear();OverlayOptions options = new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_myloc)).zIndex(5);//层数mBaiduMap.addOverlay(options);}

Android集成百度地图-----显示地图、定位、长按显示地址信息相关推荐

  1. android百度导航实现,Android 集成百度地图实现设备定位

    Android 集成百度地图实现设备定位 步骤1: 申请android 端SDK : http://lbsyun.baidu.com/ 步骤2: 下载基础版SDK 步骤3: 下载示例程序 步骤4: 开 ...

  2. Android 集成百度地图之申请TTS授权最新版

    Android 集成百度地图之申请TTS授权最新版. 前提:登录百度地图开放平台,且已创建好应用. 开发文档-Android 导航SDK-TTS授权申请. 这里有个坑,简单说下,进入http://yu ...

  3. Android集成百度定位以及导航详解

    Android集成百度定位以及导航详解                    百度地图Android SDK 官方下载地址:                            包括类参考.示例代码 ...

  4. Android集成百度定位,超详细,拒绝坑,附demo!!!

    众所周知,百度地图作为定位,地图,导航界的大佬之一,我们的项目中有这方面的需求,百度地图集成也是个不错的选择. 百度地图集成成本极低,首先,它免费,官网文档清晰,demo明确,但还是有很多人要才坑,正 ...

  5. Android集成百度语音识别到HelloWorld需要注意什么?(保姆级教学)

    Android集成百度语音识别怎么避坑? 首先先放一张集成失败的图(记得一定要用真机,因为它不支持VAD,我这里使用Pixel2): 首先你去百度搜索"百度语音识别",或者点击我下 ...

  6. Android集成百度地图接口,实现定位+路径规划。新手教程

    本文主要内容包括:如何根据百度地图接口实现定位,并实现从A到B的路径规划功能(驾车,公交,步行).本文主要提供给新手参考,如果有错误希望博友们指出以便及时改正. 1.申请百度地图SDK的密钥(填写安全 ...

  7. Android集成百度地图SDK

    本Demo中所含功能 1:定位,显示当前位置 2:地图多覆盖物(地图描点,弹出该点的详细信息) 3:坐标地址互相换算 4:POI兴趣点检索 5:线路查询(步行,驾车,公交) 6:绘制线路(OpenGL ...

  8. Android 集成百度地图AR识别SDK(二)

    废话 今天我们开始集成百度地图AR识别SDK(后面简称AR SDK)的第二章,这一章我们主要讲Android Studio如何配置AR SDK 我们如果单单只看文档的话,很难看懂如何集成,我们需要结合 ...

  9. Android 集成百度地图AR识别SDK(一)

    废话 我最近一直在想手机上如何实现AR功能,很多方法都试过了,但是要不是一些官方文档看不懂,要不就是集成起来特别麻烦,总之就是无从下手 有一天,一位同事突然和我说百度地图有AR功能,于是我赶紧试了下, ...

  10. [隐私安全]PC端网页版百度地图是如何定位你的真实地址的

    本文转载自https://blog.catscarlet.com/201612122637.html 注:本文适用于网页版百度地图,同样适用于阿里的高德地图,以及搜狗地图等. PC端打开网页版百度地图 ...

最新文章

  1. 找不到第三方怎么理赔_车子被撞,找不到肇事者怎么办?
  2. Oracle EBS-SQL (INV-3):检查仓库库存价值明细.sql
  3. WINCE6.0深入理解TOC
  4. BugKuCTF WEB 头等舱
  5. python怎么画圆并改变线条颜色_基于logi的matplotlib中线条颜色的改变
  6. python解密_Python解密
  7. android 自动打包工具,AutopackingAndroid
  8. c++容器(vector|map)中使用函数指针
  9. 解决本地工具无法连接服务器上的mysql的问题
  10. 【转载】完全手册 Flex 3.0 RIA开发详解(光盘内容)(书下载以及书的源代码下载)...
  11. Java Web提交任务到Spark Spark通过Java Web提交任务
  12. 把IE武装到牙齿,IE插件全攻略(转)
  13. 2017华为面试算法题小结
  14. 卡刷su+android7,supersu最新版卡刷包
  15. C语言新手入门贪吃蛇的链表实现-控制光标位置,流畅不闪屏
  16. 对计算机课程的总体认识,对计算机基础课程的认识(浅谈计算机基础课程教学中计算思维的培养)...
  17. Youtube更改视频原始语言
  18. 于仕琪老师libfacedetection最新开源代码使用测试配置
  19. 台式计算机机箱型号及价格,顶级组装台式电脑配置清单
  20. 用c语言验证欧拉定理,欧拉定理_欧拉定理的意义

热门文章

  1. 泰拉瑞亚测试速度的软件,泰拉瑞亚移动速度最快的道具排名
  2. 微信小程序(四)json数据循环展示
  3. 一文看懂基站无源交调
  4. 如何看待比亚迪将会为特斯拉提供电池产品?
  5. mysql 临时表 主键_MySQL中临时表的基本创建与使用教程(CREATETEMPORARY TABLE)
  6. 2022-09-20 mysql列存储引擎-问题定位-去除索引逻辑后引发crash
  7. html 数据校验,表单数据校验
  8. MySQL之自带四库之mysql库
  9. 大数据、AI...从概念到落地,数据智能践行者-袋鼠云有话说 | 附沙龙视频
  10. Python+PyQt5实现五子棋游戏(人机博弈+深搜+α-β剪枝)