基于百度地图实现Android定位功能实现(一)

Android集成百度地图

文章目录

  • Android集成百度地图
    • 前言
    • 准备工作
      • 创建工程
      • 申请密钥
    • 在项目中集成BaiduMap SDK
    • 创建地图

前言

本案例使用百度地图实现在Android中集成地图,并且实现了普通地图/卫星地图,以及路况图和热状图功能;

参考技术文档:Android 地图SDK

软件环境:

image-20240326000911332

准备工作

创建工程

image-20240325204841576

注:新创建的项目的 Name 和 Package name比较重要,后面会使用到

在正式开始之前,给大家看看初始化项目的结构
image-20240325205755427

申请密钥

控制台->我的管理/我的应用->创建应用(这里我已经创建过了,大家忽略即可)

image-20240325210019366
点击创建应用即可跳转到如下界面:
image-20240325210223606

  • 应用类型选择Android SDK,应用名称大家可以根据自己的需求添加名称

页面接续向下滑动,出现了如下界面:
image-20240325210356932
这里必填项就是发布版SHA1PackageName,这两个都比较容易获取,首先最容易获取的就是包名了;

打开刚刚新建的项目工程,然后打开app结构下的build.gradle即可查看PackageName了;
image-20240325210538941
接下来就是填写SHA1了;我使用的操作系统是macOS

官方操作手册:注册和获取密钥

对于Mac用户:

  1. 打开终端,进入 .android目录

    cd .android
    
  2. 打开 debug.keystore

    keytool -list -v -keystore debug.keystore
    
  3. 输入密码
    系统默认的密码是android,输入完后直接回车,最后就可以在终端上面看见SHA1密钥了
    image-20240325210954957
    在终端中即可查看SHA1了,并将其赋值粘贴即可,最后点击确定即可生成新的AK密钥了;
    image-20240325143207108
    最后点击提交后在控制台中置顶的应用为新建应用:
    image-20240325211247992

在项目中集成BaiduMap SDK

百度地图官方提供了两种SDK集成方式,分别为:

  • 下载 SDK 本地依赖(本次采用方法)
  • 通过 Gradle 集成 SDK
  1. 下载开发包

    image-20240325212003257

    这里选择 全量定位+基础地图(含室内图),选择的配置选择jar包即可,点击开发包即可下载

    示例代码+类参考大家自行下载,里面有文档可以查看

  2. 将开发包拷贝至工程app/libs目录下

    1. 添加jar文件

      在libs目录下,选中每一个jar文件(此处只有一个BaiduLbs_Android.jar)右键,选择Add As Library…,此时会发现在app目录的build.gradle的dependencies块中生成了工程所依赖的jar文件的对应说明(此图略)

      image-20240325212323674

    2. 添加so文件

      在src/main/目录下新建jniLibs目录(如果您的项目中已经包含该目录不用重复创建),在下载的开发包中拷贝项目中需要的CPU架构对应的so文件文件夹到jniLibs目录,如图:

      image-20240325212534235

至此,已完成通过本地依赖集成SDK。


创建地图

百度地图SDK为开发者提供了便捷的使用百度地图能力的接口,通过以下几步操作,即可在您的应用中使用百度地图:

  1. 第一步 配置AndroidManifest.xml文件

    在<application>中加入如下代码配置开发密钥(AK)

    <application>  <meta-data  android:name="com.baidu.lbsapi.API_KEY"  android:value="AK" />  
    </application>
    

    这里的AK密钥在我们创建的应用部分即可查看

  2. 在<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" /> 
    
  3. 在布局文件中添加地图容器

    MapView是View的一个子类,用于在Android View中放置地图。MapView的使用方法与Android提供的其他View一样。

    <com.baidu.mapapi.map.MapView  android:id="@+id/bmapView"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:clickable="true" />
    
  4. 地图初始化

    新建一个自定义的Application,在其onCreate方法中完成SDK的初始化。示例代码如下

    public class DemoApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//在使用SDK各组件之前初始化context信息,传入ApplicationContextSDKInitializer.setAgreePrivacy(this,true);  //自Android6.0起部分权限的使用需要开发者在代码中动态申请SDKInitializer.initialize(this);//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。SDKInitializer.setCoordType(CoordType.BD09LL);}
    }
    

    在AndroidManifest.xml文件中声明该Application

    image-20240325213352889

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

    public class MainActivity extends Activity {  private MapView mMapView = null;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);  //获取地图控件引用  mMapView = (MapView) findViewById(R.id.bmapView);  }  @Override  protected void onResume() {  super.onResume();  //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  mMapView.onResume();  }  @Override  protected void onPause() {  super.onPause();  //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  mMapView.onPause();  } @Override  protected void onDestroy() {  super.onDestroy();  //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  mMapView.onDestroy();  }  
    }
    
  6. 完成以上工作即可在您的应用中显示地图

    如果使用的AVD模拟器启动项目的话,项目会出现如下错误:

    如果出现了E/AndroidRuntime: FATAL EXCEPTION: GLThread这个问题,说明项目运行“成功”了;这是因为定位不能用模拟器,你安装到手机上才行,换个夜神模拟器或者雷电模拟器试试说不准就好了;

    下图是真机测试结果(默认是普通地图):

    0e68026e232e138366687e9fb63bb9c3_720

除了这些,平时常见的还有卫星地图,热力图,路况图等;接下来实现这些功能:

修改string.xml文件

<resources><string name="app_name">BaiduMap</string><string name="normal_map">普通地图</string><string name="satellite_map">卫星地图</string><string name="trafficEnable">开启路况图</string><string name="heatMapEnable">开启热力图</string>
</resources>

设置背景颜色gradient_color.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><gradientandroid:angle="0"android:startColor="#FF00AFFF"android:endColor="#FF379EB6"android:type="linear"/>
</shape>

接下来修改activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="@drawable/gradient_color"android:orientation="horizontal"><RadioGroupandroid:id="@+id/rg_type"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><RadioButtonandroid:id="@+id/rb_normal"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/normal_map" /><RadioButtonandroid:id="@+id/rb_satellite"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/satellite_map" /></RadioGroup></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/gradient_color"><CheckBoxandroid:id="@+id/cb_trafficEnable"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/trafficEnable" /><CheckBoxandroid:id="@+id/cb_heatMapEnable"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/heatMapEnable" /></LinearLayout><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"android:focusable="true" /></LinearLayout>

最后修改MainActivity.java文件即可:

package com.weicomp.baidumap;import android.app.Activity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;public class MainActivity extends Activity {private MapView mMapView = null;private RadioGroup mRgType;private RadioButton mRbNormal, mRbSatellite;private CheckBox mCbtTrafficEnable, mCbHeatMapEnable;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取地图控件引用mMapView = (MapView) findViewById(R.id.bmapView);mRgType = findViewById(R.id.rg_type);mRbNormal = findViewById(R.id.rb_normal);mRbSatellite = findViewById(R.id.rb_satellite);mCbtTrafficEnable = findViewById(R.id.cb_trafficEnable);mCbHeatMapEnable = findViewById(R.id.cb_heatMapEnable);initEvent();}private void initEvent() {mRgType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int i) {if (i == mRbNormal.getId()) {mMapView.getMap().setMapType(BaiduMap.MAP_TYPE_NORMAL);} else if (i == mRbSatellite.getId()) {mMapView.getMap().setMapType(BaiduMap.MAP_TYPE_SATELLITE);}}});mCbtTrafficEnable.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {mMapView.getMap().setTrafficEnabled(b);}});mCbHeatMapEnable.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {mMapView.getMap().setBaiduHeatMapEnabled(b);}});}@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() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onDestroy();}
}

最后在真机测试一边,测试结果如下所示:

image-20240325220757182

image-20240325220953130
后面会陆续实现定位等功能;

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

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

相关文章

MTU/TCPMSS/VLAN/ACCESS/TRUNK/HYBRID

MTU RFC标准定义以太网的默认MTU值为1500 最小64字节是为了保证最极端的冲突能被检测到&#xff0c;64字节是能被检测到的最小值&#xff1b;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节&am…

C++入门(二)

目录 函数重载&#xff1a; 函数重载概念&#xff1a; 参数类型不同&#xff1a; 参数个数不同&#xff1a; 参数类型顺序不同&#xff1a; C支持函数重载的原理--名字修饰&#xff1a; 引用&#xff1a; 引用概念&#xff1a; 引用特性&#xff1a; 常引用&#xff1…

JJJ:linux系统中第一个进程

以linux4.19内核linux系统中第一个进程。 执行shell指令 ps -ef 结果如下&#xff1a; xxxxxx-virtual-machine:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 20:55 ? 00:00:02 /sbin/init splash root …

【机器学习300问】58、什么是词袋模型和N-gram模型?

词袋模型&#xff08;Bag of Words, BoW&#xff09;和N-gram模型主要用于早期的自然语言处理任务&#xff0c;上文中我介绍了机器是如何读懂文本的四个阶段&#xff0c;这篇文章带大家来看看在不同阶段中会用到的两个模型——词袋模型和N-gram模型。如果没有读过我之前的文章&…

Nodejs 第六十章(http缓存)

HTTP缓存 HTTP 缓存主要分为两大类&#xff1a;强缓存和协商缓存。这两种缓存都通过 HTTP 响应头来控制&#xff0c;目的是提高网站性能。 强缓存介绍 强缓存之后则不需要向服务器发送请求&#xff0c;而是从浏览器缓存读取分为&#xff08;内存缓存&#xff09;| &#xff…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述&#xff08;FA模型&#xff09; 每个应用项目必须在项目的代码目录下加入配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容&#xff1a; 应用的软件Bundle名称&#xff0c;应用的开发…

ESD保护二极管ESD9B3.3ST5G 以更小的空间实现强大的保护 车规级TVS二极管更给力

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…

SEO文章写作器,批量写作原创SEO收录文章

在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了网站获得流量和曝光度的关键手段之一。而在SEO领域中&#xff0c;内容的质量和原创性是至关重要的。为了应对不断增长的内容需求&#xff0c;越来越多的人开始转向AI写作生成器&#xff0c;这些…

ChatGPT如何升级为GPT-4在国内

通过 WildCard 可以把ChatGPT升级为GPT-4 地址 1: 2155 Bailey Hill Rd 城市: Eugene 邮编: 97405 州: Oregon ChatGPT Plus/Team 一键升级&#xff0c;几分钟即可自动升级到 ChatGPT Plus。 选择我的邮箱账号符合要求 复制这个页面的链接即可 复制上面的link 到请在…

基于springboot实现房产销售系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现房产销售系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了房产销售系统…

CI/CD实战-jenkins结合ansible 7

配置主机环境 在jenkins上断开并删除docker1节点 重新给master添加构建任务 将server3&#xff0c;server4作为测试主机&#xff0c;停掉其上后面的docker 在server2&#xff08;jenkins&#xff09;主机上安装ansible 设置jenkins用户到目标主机的免密 给测试主机创建用户并…

MySQL8 搭建集群方案文档

MySQL8.0.21 InnoDB Cluster 从零搭建集群方案详细文档 InnoDB集群 本文档分享新版本MySQL 8.0.21 Innodb Cluster集群搭建过程 ~ MySQL InnoDB Cluster为MySQL提供了完整的高可用性解决方案。通过使用MySQL Shell附带的AdminAPI&#xff0c; 您可以轻松地配置和管理一组至少…

【力扣hot100】128-最长连续序列、283-移动零

128. 最长连续序列 import java.util.*;public class Test {public static void main(String[] args) {int[] nums {0, 3, 7, 2, 5, 8, 4, 6, 0, 1};int res new Solution().longestConsecutive(nums);System.out.println(res);} }class Solution {public int longestConsecu…

【Entity Framework】创建并配置模型

【Entity Framework】创建并配置模型 文章目录 【Entity Framework】创建并配置模型一、概述二、使用fluent API配置模型三、分组配置四、对实体类型使用EntityTypeConfigurationAttribute四、使用数据注释来配置模型五、实体类型5.1 在模型中包含类型5.2 从模型中排除类型5.3 …

Java基础学习: JDK动态代理

文章目录 一、什么是JDK动态代理二、JDK动态代理的特点三、JDK动态代理类如何使用四、JDK动态代理原理分析1、创建代理对象2、生成代理类 一、什么是JDK动态代理 JDK动态代理是Java提供的一种动态生成代理类和代理对象的技术。它主要利用Java的反射机制实现&#xff0c;在运行…

国产AI大模型推荐(一)

文心一言 主要功能&#xff1a; 各种类型的问答、各种文本创作、推理与数学计算、写代码、聊天交流、图片生成等。 链接&#xff1a;文心一言 讯飞星火 特点&#xff1a; 内容生成能力&#xff1a;我可以进行多风格多任务长文本生成&#xff0c;例如邮件、文案、公文、作文、对…

HTTPS传输过程

HTTPS&#xff1a;超文本传输安全协议 相较于HTTP明文传输&#xff0c;HTTPS增加了SSL/TLS进行了加密增加了通信的安全性。 SSL和TLS是两个不同的加密方法&#xff0c;SSL是TLS的前身&#xff0c;现在绝大多数浏览器使用的是TLS&#xff0c;所以着重了解以下TLS的概念即可。 首…

centos 7 安装磐维(PanWeiDB)数据库(单机)

前置环境准备 文件系统环境要求 文件系统环境所要求的扇区必须为512bytes&#xff0c;查看方法如下&#xff1a; [rootdevops-core-highapp3-b-32 ~]#df -h /apps/ [rootdevops-core-highapp3-b-32 ~]#ll /dev/mapper/vg--docker-lvapp [rootdevops-core-highapp3-b-32 ~]#f…

EfficientNetV2:谷歌又来了,最小的模型,最高的准确率,最快的训练速度 | ICML 2021

论文基于training-aware NAS和模型缩放得到EfficientNetV2系列&#xff0c;性能远优于目前的模型。另外&#xff0c;为了进一步提升训练速度&#xff0c;论文提出progressive learning训练方法&#xff0c;在训练过程中同时增加输入图片尺寸和正则化强度。从实验结果来看&#…

【docker】nexus 本地 maven配置

1、这篇文章中说明了如何搭建私服 【docker】搭建Nexus私服-CSDN博客文章浏览阅读2次。4、点击登陆&#xff08;账号&#xff1a;admin 秘密&#xff1a;在容器内 /nexus-data/admin.password 文件中)注意我的端口号是 10002&#xff0c;注意你的端口号。7、设置maven-central…