基于高德地图实现Android定位功能实现(二)

news2024/11/15 21:22:09

基于高德地图实现Android定位功能实现(二)

在实现的高德地图的基本显示后,我们需要不断完善地图的功能

地图界面设计(悬浮按钮等)

首先就是地图页面的布局,这个根据大家的实际需求进行设计即可,此次演示的布局效果如下:

638b6e4dfa479c57b2f7142ff4a6d166_720

这里需要使用悬浮按钮实现其效果:

首先需要倒入依赖库:

implementation 'com.getbase:floatingactionbutton:1.10.1'    //悬浮按钮

然后开始设计布局界面:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.getbase.floatingactionbutton.FloatingActionsMenu
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="10dp"
        app:fab_addButtonSize="normal"
        app:fab_expandDirection="up"> <!-- 设置展开方向为向上 -->

        <com.getbase.floatingactionbutton.FloatingActionButton
            android:id="@+id/btn_scanner"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:fab_colorNormal="#FFF"
            app:fab_icon="@drawable/baseline_center_focus_strong_24"
            app:fab_size="normal" />

        <com.getbase.floatingactionbutton.FloatingActionButton
            android:id="@+id/btn_Traffic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:fab_colorNormal="#FFF"
            app:fab_icon="@drawable/baseline_traffic_24"
            app:fab_size="normal" />

        <com.getbase.floatingactionbutton.FloatingActionButton
            android:id="@+id/btn_Map_Type"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:fab_colorNormal="#FFF"
            app:fab_icon="@drawable/baseline_map_24"
            app:fab_size="normal" />
    </com.getbase.floatingactionbutton.FloatingActionsMenu>

</RelativeLayout>

其中的图标文件大家自行选择即可,第一个功能目前是实现扫码功能,第二个切换交通图层,第三个开启地图的不同模式;

通过悬浮按钮实现切换地图类型

使MainActivity继承View.OnClickListener

public class MainActivity extends Activity implements View.OnClickListener{
  //相关代码
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
				//代码块...
    }
  
     @Override
     public void onClick(View view) {
        
     }
}

绑定组件的id

private FloatingActionButton mBtnScanner, mBtnTraffic, mBtnMapType;

//绑定组件
mBtnScanner = findViewById(R.id.btn_scanner);
mBtnTraffic = findViewById(R.id.btn_Traffic);
mBtnMapType = findViewById(R.id.btn_Map_Type);

//设置点击时间
mBtnTraffic.setOnClickListener(this);
mBtnScanner.setOnClickListener(this);
mBtnMapType.setOnClickListener(this);

设置对应的点击事件:

@Override
public void onClick(View view) {
   switch (view.getId()) {
       case R.id.btn_scanner:
           Toast.makeText(this, "开始扫码", Toast.LENGTH_SHORT).show();
           break;
       case R.id.btn_Traffic:
           //切换交通图层显示状态
           isTrafficEnabled = !isTrafficEnabled;
           aMap.setTrafficEnabled(isTrafficEnabled);
           Toast.makeText(this, "切换图层显示状态", Toast.LENGTH_SHORT).show();
           break;
       case R.id.btn_Map_Type:
           if (flag == 0) {
               //设置夜间模式
               Toast.makeText(this, "夜间模式", Toast.LENGTH_SHORT).show();
               aMap.setMapType(AMap.MAP_TYPE_NIGHT);
           } else if (flag == 1) {
               //设置卫星模式
               Toast.makeText(this, "卫星模式", Toast.LENGTH_SHORT).show();
               aMap.setMapType(AMap.MAP_TYPE_SATELLITE);
           } else if (flag == 2) {
               //设置正常模式
               Toast.makeText(this, "正常模式", Toast.LENGTH_SHORT).show();
               aMap.setMapType(AMap.MAP_TYPE_NORMAL);
           }
           flag = (flag + 1) % 3;
           break;
       default:
           Toast.makeText(this, "其他error", Toast.LENGTH_SHORT).show();
           break;
   }
}

效果如下:
在这里插入图片描述

UISetting控件交互

官方文档:控件交互

控件是指浮在地图图面上的一系列用于操作地图的组件,例如缩放按钮、指南针、定位按钮、比例尺等。

UiSettings 类用于操控这些控件,以定制自己想要的视图效果。UiSettings 类对象的实例化需要通过 AMap 类来实现:

//地图的 UISettings 对象,给aMap设置地图的内嵌控件
private UiSettings mUiSettings = null;

//获取UISettings
mUiSettings = aMap.getUiSettings();//实例化UiSettings类对象
  1. 缩放按钮

    缩放按钮是提供给 App 端用户控制地图缩放级别的交换按钮,每次点击改变1个级别,默认打开,但是可以通过下面方法将其隐藏起来:

    //缩放按钮
    mUiSettings.setZoomControlsEnabled(false);
    
  2. 指南针

    指南针用于向 App 端用户展示地图方向,默认不显示。通过下面方法可以显示:

    //指南针
    mUiSettings.setCompassEnabled(true);
    
  3. 定位按钮

    App 端用户可以通过点击定位按钮在地图上标注一个蓝色定位点,代表其当前位置。不同于以上控件,定位按钮内部的逻辑实现依赖 Android 定位 SDK。

    //定位按钮
    mUiSettings.setMyLocationButtonEnabled(true);   //显示默认的定位按钮
    
  4. 比例尺控件

    比例尺控件(最大比例是1:10m,最小比例是1:1000Km),位于地图右下角,可控制其显示与隐藏,设置的方法是

    //比例尺控件
    mUiSettings.setScaleControlsEnabled(true);  //控制比例尺控件是否显示
    

在这里插入图片描述

  1. 地图logo控件

    高德地图的 logo 默认在左下角显示,不可以移除,但支持调整到固定位置。设置的方法是:

    //地图logo
    mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_RIGHT);
    // 地图logo只能显示三个位置,底部的左、中、右三个地方
    // 对应的属性分别为AMapOptions.LOGO_POSITION_BOTTOM_LEFT、AMapOptions.LOGO_POSITION_BOTTOM_CENTER、AMapOptions.LOGO_POSITION_BOTTOM_RIGHT
    

在这里插入图片描述

开启定位服务

在开启定位服务时,不需要重新导包,因为地图SDK中包含了开启定位服务的功能,并且提供了两种不同的接口。

官方文档:[开发 Android 定位SDK 开发指南 获取位置 获取定位数据](https://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation)

首先,配置AndroidManifest.xml

  1. 首先,声明Service组件

    <service android:name="com.amap.api.location.APSService"></service>
    
  2. 声明权限(覆盖之前的权限即可)

    <!--用于进行网络定位-->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <!--用于访问GPS定位-->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <!--用于访问网络,网络定位需要上网-->
        <uses-permission android:name="android.permission.INTERNET" />
        <!--用于写入缓存数据到扩展存储卡-->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <!--用于申请调用A-GPS模块-->
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <!--如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限-->
        <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
        <!--如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明-->
        <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    
  3. 正文部分

    首先需要声明两个对象,其实就是创建一个客户端定位句柄:

    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    //声明定位毁掉监听器
    public AMapLocationListener mLocationListener = null;
    
    //onCreate()函数部分代码
    //初始化定位
    try {
        mLocationClient = new AMapLocationClient(getApplicationContext());
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    //设置定位回调监听
    mLocationClient.setLocationListener(mLocationListener);
    

    接下来就是配置参数并启动定位了,在配置参数之前,首先创建一个对象,方便给定位客户端设置属性:

    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption = null;
    
    //初始化AMapLocationClientOption对象---onCreate()函数部分
    mLocationOption = new AMapLocationClientOption();
    

    接下来就可以配置参数了,配置参数方面,可以设置设置单次定位、选择定位模式、自定义连续定位等,这里设置了自定义连续定位了,方便查看:

    //自定义连续定位
    //设置定位间隔,单位毫秒,默认为2000ms,最低1000ms
    mLocationOption.setInterval(3000);
    //将option设置给client对象
    mLocationClient.setLocationOption(mLocationOption);
    

    那么如何获取定位数据呢?AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,回调参数是AMapLocation。接下来就需要给客户端句柄设置监听器处理服务器返回的数据:

    //设置定位会调监听--获取定位结果
    mLocationClient.setLocationListener(new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
           
        }
    });
    

    接下来可以查看定位数据的具体内容了:

    if (aMapLocation != null) {
        if (aMapLocation.getErrorCode() == 0) {
            //可在其中解析aMapLocation获取相应内容
        } else {
            //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
            Log.e("aMapError", "location Error, ErrCode:"
                    + aMapLocation.getErrorCode() + ", errInfo:"
                    + aMapLocation.getErrorInfo());
        }
    }
    

    为了方便我们直观的观看数据,在控制台打印我们需要查看的数据即可:

    Log.e(TAG, "国家:" + aMapLocation.getCountry());
    Log.e(TAG, "当前地址:" + aMapLocation.getAddress());
    Log.e(TAG, "当前城市:" + aMapLocation.getCity());
    Log.e(TAG, "经度:" + aMapLocation.getLongitude());
    Log.e(TAG, "纬度:" + aMapLocation.getLatitude());
    Log.e(TAG, "城区:" + aMapLocation.getDistrict());
    Log.e(TAG, "街道:" + aMapLocation.getStreet());
    Log.e(TAG, "街道门牌号:" + aMapLocation.getStreetNum());
    Log.e(TAG, "城市编码:" + aMapLocation.getCityCode());
    Log.e(TAG, "区域编码:" + aMapLocation.getAdCode());
    Log.e(TAG, "当前位置POI名称:" + aMapLocation.getPoiName());
    Log.e(TAG, "当前位置所处AOI名称:" + aMapLocation.getAoiName());
    Log.e(TAG, "---------------------------------");
    

    需要其他数据可以查找官方文档查看对应的接口即可 https://developer.amap.com/api/android-location-sdk/guide/android-location/getlocation

    最后就是启动定位了:

    //启动定位
    mLocationClient.startLocation();
    

    最后运行程序,查看我们是否实现了定位数据:
    在这里插入图片描述

至此,就拿到了定位数据了了,下篇将会讲述如何实现以自我为中心展示地图了;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机图像目标检测

本仓库是人工智能课程的课程作业仓库&#xff0c;主要是完成无人机图像目标检测的任务&#xff0c;我们对visdrone数据集进行了处理&#xff0c;在yolo和ssd两种框架下进行了训练和测试&#xff0c;并编写demo用于实时的无人机图像目标检测。 requirements依赖&#xff1a; ss…

数据结构之‘串’

目录 一. 串的定义二. 串的基本操作三. 串的存储结构3.1 顺序存储3.2 链式存储3.3 基于顺序存储的基本操作 \quad 一. 串的定义 \quad \quad \quad \quad 二. 串的基本操作 \quad \quad 三. 串的存储结构 \quad \quad 3.1 顺序存储 \quad 得一个一个遍历 结合方案一和方案二的优…

[React 进阶系列] useSyncExternalStore hook

[React 进阶系列] useSyncExternalStore hook 前情提要&#xff0c;包括 yup 的实现在这里&#xff1a;yup 基础使用以及 jest 测试 简单的提一下&#xff0c;需要实现的功能是&#xff1a; yup schema 需要访问外部的 storage外部的 storage 是可变的React 内部也需要访问同…

SpringBoot整合阿里云RocketMQ对接,商业版

1.需要阿里云开通商业版RocketMQ 普通消息新建普通主题,普通组,延迟消息新建延迟消息主题,延迟消息组 2.结构目录 3.引入依赖 <!--阿里云RocketMq整合--><dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</…

【C language】扫雷

目录 1.概要2.实现核心思想3.实现过程3.1游戏框架3.2游戏逻辑初始化棋盘 MineInit打印棋盘 MinePrint设置雷 SetMines扫雷 ClearMines 4.总结 1.概要 为了提高C初学者对C语言基本语法的掌控能力&#xff0c;一个极简版的扫雷游戏是十分适合锻炼代码能力的。下面分享仅用数组、…

14_Shell重定向输入输出

14_Shell重定向输入输出 输出重定向&#xff1a;一般情况&#xff0c;输出是在终端直接显示&#xff0c;改变输出位置&#xff0c;改变到文件中&#xff0c;这就是输出重定向 输入重定向&#xff1a;一般情况&#xff0c;输入是读取用户终端输入&#xff0c;改变输入位置&#…

026-GeoGebra中级篇-曲线(2)_极坐标曲线、参数化曲面、分段函数曲线、分形曲线、复数平面上的曲线、随机曲线、非线性动力系统的轨迹

除了参数曲线、隐式曲线和显式曲线之外&#xff0c;还有其他类型的曲线表示方法。本篇主要概述一下极坐标曲线、参数化曲面、分段函数曲线、分形曲线、复数平面上的曲线、随机曲线、和非线性动力系统的轨迹&#xff0c;可能没有那么深&#xff0c;可以先了解下。 目录 1. 极坐…

VScode:前端项目中yarn包的安装和使用

一、首先打开PowerShell-管理员身份运行ISE 输入命令&#xff1a; set-ExecutionPolicy RemoteSigned 选择“全是”&#xff0c;表示允许在本地计算机上运行由本地用户创建的脚本&#xff0c;没有报错就行了 二、接着打开VScode集成终端 输入 npm install -g yarn 再次输入以下…

IoT数据采集网关在企业应用中扮演的角色-天拓四方

随着物联网&#xff08;IoT&#xff09;技术的不断发展&#xff0c;越来越多的企业开始利用IoT技术实现智能化、自动化的生产和管理。在这个过程中&#xff0c;Iot数据采集网关作为连接物理世界与数字世界的桥梁&#xff0c;发挥着至关重要的作用。 IoT数据采集网关是一种硬件…

4.定时器

原理 时钟源&#xff1a;定时器是内部时钟源&#xff08;晶振&#xff09;&#xff0c;计数器是外部计时长度&#xff1a;对应TH TL计数器初值寄存器(高八位,低八位)对应的中断触发函数 中断源中断处理函数Timer0Timer0_Routine(void) interrupt 1Timer1Timer1_Routine(void) …

c++初阶知识——类和对象(中)

目录 1.类的默认成员函数 2.构造函数 3.析构函数 4.拷贝构造函数 5.运算符重载 5.1 赋值运算符重载 5.2 使用运算符重载等特性实现日期类 6.取地址运算符重载 6.1 const成员函数 6.2 取地址运算符重载 1.类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#…

网站开发:使用VScode安装yarn包和运行前端项目

一、首先打开PowerShell-管理员身份运行ISE 输入命令&#xff1a; set-ExecutionPolicy RemoteSigned 选择“全是”&#xff0c;表示允许在本地计算机上运行由本地用户创建的脚本&#xff0c;没有报错就行了 二、接着打开VScode集成终端 输入 npm install -g yarn 再次输入以…

防火墙双机热备带宽管理综合实验

拓扑图和要求如下&#xff1a; 之前的步骤可以去到上次的实验 1.步骤一&#xff1a; 首先在FW3防火墙上配置接口IP地址&#xff0c;划分区域 创建心跳线&#xff1a; 下面进行双机热备配置&#xff1a; 步骤二&#xff1a; 先将心跳线连接起来 注意&#xff1a;一定要将心跳…

Django select_related()方法

select_related()的作用 select_related()是Django ORM&#xff08;对象关系映射&#xff09;中的一种查询优化方法&#xff0c;主要用于减少数据库查询次数&#xff0c;提高查询效率。当你在查询一个模型实例时&#xff0c;如果这个实例有ForeignKey关联到其他模型&#xff0…

Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器

章节内容 上节我们完成了&#xff1a; ZNode的基本介绍ZNode节点类型的介绍事务ID的介绍ZNode实机测试效果 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff…

Python JSON处理:兼容性与高级应用

JSON&#xff08;JavaScript Object Notation&#xff09;作为当前最流行的数据传输格式&#xff0c;在Python中也有多种实现方式。由于JSON的跨平台性和简便易用性&#xff0c;它在数据交互中被广泛应用。本文将重点讨论如何熟练应用Python的JSON库&#xff0c;将JSON数据映射…

【区块链 + 智慧政务】中国铁塔区块链委托代征开票应用 | FISCO BCOS应用案例

中国铁塔是全球规模最大的通信铁塔基础设施服务提供者。通信塔站址点多面广&#xff0c;业主构成复杂&#xff0c;因此产生海量税务、合同、票据等信息。为进一步提高场租或供电取票的及时性和规范性&#xff0c;严格遵循税务相关的要求&#xff0c;中国铁塔采用国产开源联盟链…

python--实验12

目录 知识点 第一部分&#xff1a;文件概述 第二部分&#xff1a;文件的基本操作 第三部分&#xff1a;目录管理 第四部分&#xff1a;CSV文件读写 第五部分&#xff1a;openpyxl等模块 小结 实验 知识点 第一部分&#xff1a;文件概述 文件标识&#xff1a;找到计算机…

尚硅谷大数据技术-数据湖Hudi视频教程-笔记03【Hudi集成Spark】

大数据新风口&#xff1a;Hudi数据湖&#xff08;尚硅谷&Apache Hudi联合出品&#xff09; B站直达&#xff1a;https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘&#xff1a;https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

【ARM】MDK-服务器与客户端不同网段内出现卡顿问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录不同网段之间的请求发送情况以及MDK网络版license文件内设置的影响。 2、 问题场景 客户使用很久的MDK网络版&#xff0c;在获取授权时都会出现4-7秒的卡顿&#xff0c;无法对keil进行任何操作&#xff0c;彻底…