步骤

  • 系列文章
  • 前言
  • 介绍api
    • 实现效果
    • activity_main.xml
    • AndroidManifest.xml
    • MainActivity.java(修改)
    • 附录.参考资料
    • 下载资源
  • 总结

系列文章

提示:转到安卓学习专栏,观看更多内容!
点我直达–>安卓学习专栏


前言

新建一个项目,项目名为LBSTest。
百度地图(6)移动到我的位置(图文+代码)
地图是成功显示出来了,但也许这并不是你想要的。因为这是一张默认
的地图,显示的是北京市中心的位置,而你可能希望看到更加精细的地
图信息,比如说自己所在位置的周边环境。显然,通过缩放和移动的方
式来慢慢找到自己的位置是一种很愚蠢的做法。那么本小节我们就来学
习一下,如何才能在地图中快速移动到自己的位置。


介绍api

百度LBS SDK的API中提供了一个BaiduMap 类,它是地图的总控制器,调用MapView的getMap()方法就能获取到BaiduMap 的实例。

BaiduMap baiduMap = mapView.getMap();

有了BaiduMap后,我们就能对地图进行各种各样的操作了,比如设置
地图的缩放级别以及将地图移动到某一个经纬度上。百度地图将缩放级别的取值范围限定在3到19之间,其中小数点位的值也是可以取的,值越大,地图显示的信息就越精细。比如我们想要将缩
放级别设置成12.5:
MapStatusUpdateFactory的zoomTo() 方法接收一个float 型的参
数,就是用于设置缩放级别的,这里我们传入12.5f。zoomTo() 方法返
回一个MapStatusUpdate 对象,我们把这个对象传入BaiduMap的
animateMapStatus() 方法当中即可完成缩放功能。

MapStatusUpdate update = MapStatusUpdateFactory.zoomTo(12.5f);
baiduMap.animateMapStatus(update);

让地图移动到某一个经纬度需要借助LatLng类了。其实LatLng存放经纬度值的,它的构造方法接收两个参数,第一个参数是纬度值,第二个参数是经度值。之后调用MapStatusUpdateFactory的newLatLng() 方法将LatLng 对象传入,newLatLng() 方法返回的也是一个MapStatusUpdate 对象,我们再把这个对象传入BaiduMap的animateMapStatus() 方法当中,就可以将地图移动到指定的经纬度上,实现将地图移动到北纬39.915度、东经116.404度这个位置的代码:

LatLng ll = new LatLng(39.915, 116.404);
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);

实现效果


activity_main.xml

  1. 布局文件中的内容非常简单,只有一个TextView控件,用于稍后显示当
    前位置的经纬度信息。
  2. 在布局文件中新放置了一个MapView控件,并让它填充满整个屏
    幕。这个MapView是由百度提供的自定义控件,所以在使用它的时候需
    要将完整的包名加上。另外,之前用于显示定位信息的TextView现在暂
    时用不到了,我们将它的visibility 属性指定成gone ,让它在界面上
    隐藏起来。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:id="@+id/position_text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone" /><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true" />
</LinearLayout>

AndroidManifest.xml

  1. AndroidManifest.xml文件改动比较多,我们来仔细阅读一下。可以看到,这里首先添加了很多行权限声明,每一个权限都是百度LBS SDK内部要用到的。然后在 标签的内部添加了一个<metadata> 标签,这个标签的android:name 部分是固定的,必须com.baidu.lbsapi.API_KEY ,android:value 部分则应该填入我们在前面的文章
    安卓学习专栏——安卓获取SHA1指纹申请百度地图API Key使用百度LBS定位功能(图文保姆级)
    申请到的API Key。
  2. 如果你的“android:name=“com.baidu.location.f””飘红说明前面的jar配置有问题
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.lbstest"><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.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.WAKE_LOCK" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/Theme.AppCompat"><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="填写你前面申请到的api key" /><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service></application>
</manifest>

MainActivity.java(修改)

加入了一个navigateTo() 方法。将BDLocation 对象中的地理位置信息取出并封装到LatLng 对象中,然后调用MapStatusUpdateFactory的newLatLng() 方法并将LatLng 对象传入,接着将返回的MapStatusUpdate 对象作为参数传入到BaiduMap的animateMapStatus() 方法当中,和上面介绍的用法是一模一样的。并且这里为了让地图信息可以显示得更加丰富一些,我们将缩放级别设置
成了16。
上述代码当中我们使用了一个isFirstLocate 变量,这个变量的作用是为了防止多次调用animateMapStatus() 方法,因为将地图移动到我们当前的位置只需
要在程序第一次定位的时候调用一次就可以了。
写了navigateTo() 方法之后,剩下的事情就简单了,当定位到设备当前位置的时候,我们在onReceiveLocation() 方法中直接把BDLocation 对象传给navigateTo() 方法,这样就能够让地图移动到设备所在的位置了。

package com.example.lbstest;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {public LocationClient mLocationClient;private TextView positionText;private MapView mapView;//修改内容开始private BaiduMap baiduMap;private boolean isFirstLocate = true;//修改内容结束@Overrideprotected void onCreate(Bundle savedInstanceState) {//修改内容开始//首先需要调用SDKInitializer的//initialize() 方法来进行初始化操作,initialize() 方法接收一//个Context 参数,这里我们调用getApplicationContext() 方法来获//取一个全局的Context 参数并传入。注意初始化操作一定要//在setContentView() 方法前调用,不然的话就会出错。接下来我们调//用findViewById() 方法获取到了MapView的实例super.onCreate(savedInstanceState);mLocationClient = new LocationClient(getApplicationContext());mLocationClient.registerLocationListener(new MyLocationListener());SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);mapView = (MapView) findViewById(R.id.bmapView);baiduMap = mapView.getMap();//修改内容结束positionText = (TextView) findViewById(R.id.position_text_view);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);} else {requestLocation();}}private void navigateTo(BDLocation location) {if (isFirstLocate) {LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);baiduMap.animateMapStatus(update);update = MapStatusUpdateFactory.zoomTo(16f);baiduMap.animateMapStatus(update);isFirstLocate = false;}}public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {if (location.getLocType() == BDLocation.TypeGpsLocation|| location.getLocType() == BDLocation.TypeNetWorkLocation) {navigateTo(location);}}}private void requestLocation() {initLocation();mLocationClient.start();}private void initLocation() {LocationClientOption option = new LocationClientOption();option.setScanSpan(5000);option.setIsNeedAddress(true);mLocationClient.setLocOption(option);}//要重写onResume() 、onPause() 和onDestroy() 这3个方//法,在这里对MapView进行管理,以保证资源能够及时地得到释放。@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();mLocationClient.stop();mapView.onDestroy();}//新修改的内容实时更新位置结束@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0) {for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();finish();return;}}requestLocation();} else {Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();finish();}break;default:}}
}

附录.参考资料

《第一行代码》11.5 移动到我的位置


下载资源

安卓学习者百度地图(6)移动到我的位置


总结

大家喜欢的话,给个

安卓学习专栏——百度地图(6)移动到我的位置(图文+代码)相关推荐

  1. 安卓学习专栏——百度地图(1)获取SHA1指纹申请百度地图API Key使用百度LBS定位功能(图文保姆级)

    步骤 系列文章 前言 1.前期准备 2.创建应用 3.获取发布版SHA1和开发版SHA1 3.1找到.android文件夹位置 3.2Android Studio的Terminal中cd路径 3.3输 ...

  2. 安卓学习专栏——从文件中读取数据、openFileInput(图文+代码)

    步骤 系列文章 前言 1.实现效果 1.1启动时初始化填写读取的数据,或是点击读取显示数据 1.2保存新数据 1.3点击读取按钮读取数据 1.4重启查看效果 2.xml外观文件 3.java功能文件 ...

  3. 安卓学习之百度地图定位

    1.基于位置服务的简介 基于位置的服务简称 LBS:Location Based Service 2.申请API Key 1.登录你的百度账号,并打开http://developer.baidu.co ...

  4. 安卓学习专栏——安卓报错Version 28 (intended for Android Pie and below) is the last version of the legacy suppor

    步骤 系列文章 前言 1.报错效果 2.修改方法 总结 系列文章 提示:转到安卓学习专栏,观看更多内容! 点我直达–>安卓学习专栏 前言 'com.android.support:appcomp ...

  5. 安卓学习专栏——安卓报错android.support.v4.widget.SwipeRefreshLayout飘红

    步骤 系列文章 1.报错效果 2.修改方法使用新的标签名 总结 系列文章 提示:转到安卓学习专栏,观看更多内容! 点我直达–>安卓学习专栏 1.报错效果 第一行代码酷欧天气实战时飘红 安卓报错a ...

  6. 安卓学习专栏——实战项目酷欧天气(4)给天气页面加上背景图片

    步骤 系列文章 前言 实现效果 项目结构 1.获取必应每日一图 1.1修改修改activity_weather.xml 1.2修改WeatherActivity 2.背景图和状态栏效果修改 2.1修改 ...

  7. 安卓学习专栏——实战项目酷欧天气(2)遍历全国省市县数据

    步骤 系列文章 前言 1.实现效果 2.项目结构 util包 util包下新建HttpUtil util包下新建Utility 3.新建choose_area.xml布局 4.新建ChooseArea ...

  8. 安卓学习专栏——安卓报错android.support.v4.widget.DrawerLayout飘红

    步骤 系列文章 1.报错效果 2.修改方法使用新的标签名 总结 系列文章 提示:转到安卓学习专栏,观看更多内容! 点我直达–>安卓学习专栏 1.报错效果 第一行代码酷欧天气实战时飘红 安卓报错a ...

  9. 安卓学习专栏——查看安卓数据库,用navicat premium与sqlitestudio可视化查看数据库(图文保姆级)

    步骤 系列文章 前言 1.找到数据库文件 1.1打开Device File Explerer 文件查找工具 1.2找到数据库资源路径 1.3保存在文件夹 2.navicat premium可视化 2. ...

最新文章

  1. POJ 3233 Matrix Power Series (矩阵分块,递推)
  2. linux进程号转换成16进制,Shell脚本中不同进制数据转换的例子(二进制、八进制、十六进制、base64)...
  3. 勒索病毒攻击应急防范
  4. 【Ext.Net学习笔记】01:在ASP.NET WebForm中使用Ext.Net
  5. 积分图像追踪目标 (一)
  6. [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列
  7. 应用随机过程笔记(二):泊松过程
  8. 自定义铃声行业如何为应用商店铺平了道路,然后消失了
  9. Ckeditor5 整合Ckfinder3 防出错实战教程(二)整合篇
  10. 使照片带有妙的电影色彩55款工具套件的lr微妙的电影调色预设
  11. 史上官场吃喝风:与送礼一样成为通用的规则
  12. 开发视频实时直播需要用到哪些技术?
  13. 买房贷款,“房贷20年”和“房贷30年”,哪个更划算?为什么?
  14. 一条 SQL 语句是如何执行的
  15. (教程)教你如何自己办理商标注册事宜
  16. php表格中的caption,html中caption标签的使用方法及实例详解
  17. vscode中编写代码时tab键不能用
  18. 【C语言】基本常识及知识点
  19. laravel-admin 省市区三级联动的爬坑问题
  20. XML和Dom4j、正则表达式

热门文章

  1. 目前从事工作的想法和建议
  2. python start方法_进程方法 run和start的区别
  3. 苹果你深深的伤害了我,还不让我说
  4. 位运算符最详细的解释(java)
  5. 全部希腊字母读音-数学公式中常用
  6. 讯时网关路由规则小结
  7. 解决图像目标检测两框重叠问题
  8. 一键重装系统win7旗舰版系统教程
  9. HashMap 容量为2次幂的原因
  10. oracle文章收藏