一、功能说明

  1. 掌握Android定位的基本概念,能编写定位过程;
  2. 掌握第三方地图调用的基本概念,查看第三方官方文档,能实现基础地图调用操作。
  3. 需实现的具体功能为:百度地图调用及定位。

二、设计分析与核心代码

1 注册和获取密钥

配置开发秘钥,这里就不展开了

2 Android Studio配置

在百度地图官方网站中下载Android地图SDK,并导入项目中使用。

3 配置AndroidManifest.xml文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.mybaidumap"><applicationandroid:name=".DemoApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="OKC9aGS3foO00qP86rVkXlyKGxrYfZlD" /><service android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"/></application><!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 --><uses-permission android:name="android.permission.INTERNET" /><!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 这个权限用于进行网络定位 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 这个权限用于访问GPS定位 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

4  在布局文件中添加地图容器,并使用FrameLayout布局在地图上方显示定位信息的经纬度和地址

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><!--百度地图控件--><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:clickable="true" /><!--位置文本布局的背景色代码的前2位代码为透明度--><LinearLayoutandroid:layout_width="394dp"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:background="@android:color/background_light"android:orientation="vertical"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="12dp"android:layout_marginTop="20dp"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="纬度:"android:textColor="#000000"android:textSize="15dp" /><TextViewandroid:id="@+id/tv_Lat"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="#000000"android:textSize="15dp" /></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="12dp"android:layout_marginTop="10dp"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="经度:"android:textColor="#000000"android:textSize="15dp" /><TextViewandroid:id="@+id/tv_Lon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="#000000"android:textSize="15dp" /></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="12dp"android:layout_marginTop="10dp"android:layout_marginBottom="10dp"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="地址:"android:textColor="#000000"android:textSize="15dp" /><TextViewandroid:id="@+id/tv_Add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="#000000"android:textSize="15dp" /></LinearLayout></LinearLayout>
</FrameLayout>

5 地图初始化

在使用SDK各组件之前初始化context信息,传入ApplicationContext

6 创建地图Activity,管理MapView生命周期

7 判断应用是否具有定位权限。如果没有,则动态申请;如果有,则发起定位

8 LocationListener添加百度位置监听器

private class MyLocationListener  implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation bdLocation) {tv_Lat.setText(bdLocation.getLatitude()+"");tv_Lon.setText(bdLocation.getLongitude()+"");tv_Add.setText(bdLocation.getAddrStr());if(bdLocation.getLocType()==BDLocation.TypeGpsLocation || bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){navigateTo(bdLocation);}}}

9 初始化定位数据

private void initLocation() {  //初始化MyLocationListener myLocationListener= new MyLocationListener();mLocationClient = new LocationClient(getApplicationContext());mLocationClient.registerLocationListener(myLocationListener);SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);mapView = findViewById(R.id.bmapView);baiduMap = mapView.getMap();baiduMap.setMyLocationEnabled(true);tv_Lat = findViewById(R.id.tv_Lat);tv_Lon = findViewById(R.id.tv_Lon);tv_Add = findViewById(R.id.tv_Add);/*** 对定位的图标进行配置,需要MyLocationConfiguration实例,这个类是用设置定位图标的显示方式的*/MyLocationConfiguration config=new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, BitmapDescriptorFactory.fromResource(R.drawable.location));baiduMap.setMyLocationConfiguration(config);LocationClientOption option = new LocationClientOption();option.setOpenGps(true); // 打开gpsoption.setCoorType("bd09ll"); // 设置坐标类型option.setScanSpan(1000);//设置扫描时间间隔//设置定位模式,三选一option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);/*option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);*///设置需要地址信息option.setIsNeedAddress(true);//保存定位参数mLocationClient.setLocOption(option);}

10 MainActivity.java中开启定位图层,并关联监听器

 public class MainActivity extends AppCompatActivity {private MapView mMapView = null;private BaiduMap mBaiduMap = null;private LocationClient mLocationClient = null;// 是否是第一次定位private boolean isFirstLocate = true;// 当前定位模式private MyLocationConfiguration.LocationMode locationMode;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取地图控件引用mMapView = (MapView) findViewById(R.id.bmapView);// 得到地图mBaiduMap = mMapView.getMap();// 开启地图定位图层mBaiduMap.setMyLocationEnabled(true);// 动态申请权限List<String> permissionList = new ArrayList<>();if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);}if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.READ_PHONE_STATE);}if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);}if (!permissionList.isEmpty()) {String[] permissions = permissionList.toArray(new String[permissionList.size()]);ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);}//定位初始化mLocationClient = new LocationClient(this);//通过LocationClientOption设置LocationClient相关参数LocationClientOption option = new LocationClientOption();option.setOpenGps(true); // 打开gpsoption.setCoorType("bd09ll"); // 设置坐标类型option.setScanSpan(1000);option.setIsNeedAddress(true); // 设置地址信息option.setIsNeedLocationDescribe(true);//设置是否需要地址描述//设置locationClientOptionmLocationClient.setLocOption(option);locationMode = MyLocationConfiguration.LocationMode.FOLLOWING;//注册LocationListener监听器MyLocationListener myLocationListener = new MyLocationListener();mLocationClient.registerLocationListener(myLocationListener);//开启地图定位图层mLocationClient.start();}public class MyLocationListener extends BDAbstractLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {//mapView 销毁后不在处理新接收的位置if (location == null || mMapView == null){return;}// 如果是第一次定位LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());if (isFirstLocate) {isFirstLocate = false;//给地图设置状态mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(ll));}MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 此处设置开发者获取到的方向信息,顺时针0-360.direction(location.getDirection()).latitude(location.getLatitude()).longitude(location.getLongitude()).build();mBaiduMap.setMyLocationData(locData);}}@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}@Overrideprotected void onDestroy() {mLocationClient.stop();mBaiduMap.setMyLocationEnabled(false);mMapView.onDestroy();mMapView = null;super.onDestroy();}
}

要注意的内容:

1)BaiduMap组件需要和MapView容器相关联:mBaiduMap = mMapView.getMap();否则定位无法显示

2)添加动态申请权限代码

三、界面展示

四、源码参考

https://gitee.com/xiao-tangtao/MyBaiduMap

https://blog.csdn.net/qq_44677790/article/details/111087393

Android定位与百度位置应用相关推荐

  1. Android定位与百度定位

    Android定位与百度定位 AS开发作业四:LBS Android定位与百度定位 前言 一.实验内容与界面展示 1. 实验内容与技术 2. 界面展示 二.实现过程 1. 项目配置 2. activi ...

  2. Android定位,百度SDK,百度定位

    百度地图定位SDK提供了GPS.基站.WiFi.地磁.蓝牙.传感器等多种定位方式,适用于室内.室外多种定位场景,定位精度高.覆盖率广.网络定位请求流量小.定位速度快: 官方API:Android定位S ...

  3. js百度地图android定位不准,百度地图js定位不准

    浏览器H5定位即navigator.geolocation,通过IP或者域名的形式,如:http://172.21.3.82:8080 和http://b.cunzhang.com进行访问时,调用na ...

  4. android百度定位定位点返回非常慢,Android 定位之百度地图定位 问题总结

    之前做百度地图定位这个功能,碰到的问题非常多,这里总结一下,百度地图官方文档里面解释的很清楚,现在百度定位采用的是GPS,基站,Wi-Fi等多种定位方式,适用于室.内外多种定位场景,但是这个优先级我们 ...

  5. Android 定位服务和位置权限

    做地图功能时,在之前只需要一个位置权限即可,但不知道什么时候加了个定位服务,还是在系统设置里面. 看代码:lm.isProviderEnabled(LocationManager.GPS_PROVID ...

  6. 在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)

    使用最新版本的百度地图需要注意的几个地方: 1.libs文件夹下要有android-support-v4.jar.baidumapapi_v2_1_0.jar.locSDK_3.1.jar三个jar包 ...

  7. 百度Android定位API使用指南

    本文转自百度API官方文档,仅作为方便学习使用. 1 导入库文件 2 设置AndroidManifest.xml 2.1 在application标签中声明service组件,每个app拥有自己单独的 ...

  8. 利用百度地图Android定位SDK获取经纬度

    环境的搭建(参考上一次的文章) 百度地图Android定位SDK的使用 2.在Android studio里设计程序来获取经纬度 界面布局activity_main.xml文件的源代码: <?x ...

  9. 基于百度地图实现Android定位功能实现(详解+教程)

    基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...

最新文章

  1. 【计算理论】计算复杂性 ( coNP 问题 | coNP 完全 | P、NP、coNP 相互关系 )
  2. Elicpse创建Maven项目
  3. 用css3写遨游的logo
  4. VS2010 C++下编译调试MongoDB源码
  5. Leetcode题库 15.三数之和_0(双指针 C实现)
  6. 简易中控紫猫插件版(3)压缩包使用说明
  7. 《飞秋2010下载》的开头说
  8. 为什么 Java 在 25 年之后依旧如此年轻:一个架构师的看法
  9. unity中静态变量的使用
  10. 一文详解Python中的*可变参数与**关键字参数
  11. C++迭代器 iterator
  12. 英文版的java项目简历_java开发英文简历范文
  13. 计算机技术在多晶体衍射中的应用,材料研究分析方法(研究生)-XRD2.ppt
  14. 关于BOM的一些基本知识以及表格的操作
  15. Listen1:让你畅听全网音乐,支持多平台
  16. 最快的PID参数整定口诀
  17. 金项奖入围展播 | 梦系来客,星耀有礼
  18. 华为荣耀8青春版计算机在哪里,华为荣耀8青春版比荣耀8青春在哪里?
  19. python+编译器 下载、安装
  20. Easymock十分钟入门

热门文章

  1. php 限制微信登陆,微信在什么情况下会被限制登录?
  2. 轻松搞定ExtJs 3.4
  3. 联合两个索引查询,已解决: 还有个进行多条件搜索 and 与 or 的操作
  4. java毕业设计‘网上宠物店(附源码、数据库)
  5. 美拍里萌宠搞笑视频的保存
  6. TikTok跨境电商:每天必上的10大网站,学习与爆单两不误
  7. Practical Apache Struts 2 Web 2.0 Projects
  8. IDesign C#编程规范(一)
  9. Origin | 自定义函数图像绘制
  10. Paper reading (六十):Multidomain analyses of a intestinal cleanout perturbation experiment