超详细的Android百度地图开发:在APP上定位并显示出来

  • 一 写在前面
  • 二 注册百度开发者账户、申请API KEY
  • 三、代码实现
  • 四、问题
  • 五、总结

一 写在前面

由于项目所需,我需要在手机APP中嵌入百度地图。参考的文档是《第一行代码》。其中的功能包括GPS/网络定位、地图的显示、搜索地点并进行导航(这个第一行代码没有,需要自己实现)。今天要实现的功能是,通过GPS/网络来进行定位,并以文本的形式1、将经纬度显示在APP上,2、具体的国省市区街道信息

效果如图所示:

二 注册百度开发者账户、申请API KEY

1、注册百度开发者账户:http://lbsyun.baidu.com/
在右上角按下登录,若有账号直接登录,反之注册。

2、进入百度地图Android定位SDK网页:http://lbsyun.baidu.com/index.php?title=android-locsdk

点击获取密钥

点击创建应用

如图操作:

其中上图第三步,如下图操作所示,将SHA1复制进入上图的两个SHA1空位。

提交之后,你就发现自己已经有一个应用啦。

3、下载百度地图SDK:http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download

点击去下载,网页会提示你需要下载哪些组件,由于我需要定位、地图、检索和导航功能,所以我选择了以下四项,点击开发包下载。

4.新建Android项目
在Android Studio中新建一个名为LBSTest的项目,包名应该会自动被命名为com.example.lbstest。注意本章中的代码最好在手机上运行,因为手机可以得到真实的位置数据,感受会更深刻。

5、将SDK文件放入相关的路径中
下载成功并解压之后,会发现如下文件,点击进入libs。

libs中含有以下文件:

将BaiduLBS_Android.jar文件放在LBSTest文件夹-》app-》libs文件夹下。
将其余文件夹(arm64-v8a、armeabi、armeabi-v7a、x86、x86_64)放在LBSTest-》src-》main-》jniLibs文件夹下
注意:jniLibs文件夹是原本没有的,需要自己创建。

6、重新构建项目
打开LBSTest项目,点击AS右上角的Sync Project with Gradle Files

现在,百度地图所需的基本配置已经完成啦,接下来让我们修改代码部分。

三、代码实现

1、AndroidManifest.xml文件
在这个文件,主要有两个功能:
(1)、声明些所需要用到的权限,比如手机GPS、网络的权限等。(位置:uses-permission)
(2)、将百度地图的API-KEY写进去,下面代码我没有将API-KEY写进去,需要读者自行将自己申请的APIKEY复制输入进去。(位置:meta-data)
(3)、定义百度地图的服务,用于定位。(位置:service)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.lbstest"><!-- 读写sd卡 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 写sd卡 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_GPS" /><!-- 获取精确gps位置 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- 获取粗略位置 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 允许程序访问额外的定位提供者指令获取模拟定位信息 --><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><!-- 网络链接 --><uses-permission android:name="android.permission.INTERNET" /><!-- 获取网络状态 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 更改wifi连状态 --><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!-- 获取wifi状态 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!--允许程序读写手机状态和身份--><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission><applicationandroid: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">
<!--<meta-dataandroid:name="BaiduMobAd_STAT_ID"android:value="48ae76de3f" />
--><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="填写刚申请的API_KEY" /><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><!--定义百度地图的服务,用于定位--><service android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service></application></manifest>

2、activity_main.xml文件,即UI配置文件
一开始,我们就简单地用文本显示定位的经纬度,所以在UI文件中,我们只配置了一个TextView的控件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"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" />
</LinearLayout>

3、MainActivity文件,即主活动文件
这个文件主要写了创建位置客户端,打开相应的权限,以及获取经纬度、字符串拼接并打印在TextView上。
一个需要注意的问题,如果是自己按照书本上敲的代码,出现红色的错误请不要慌。因为要么后面会有函数声明,要么没有import相应的库。后者的解决方法就是同时按下Alt+Enter,系统会自动帮你import相应的库,或者可以直接复制我下面的代码。

package com.example.lbstest;import android.Manifest;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
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 java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {public LocationClient mLocationClient;//private MapView mapview;private TextView positionText;private StringBuilder currentPosition;public MainActivity() {}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mLocationClient = new LocationClient((getApplicationContext()));mLocationClient.registerNotifyLocationListener(new MyLocationListener());setContentView(R.layout.activity_main);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();}}/*初始化函数,并启动位置客户端LocationClient*/ private void requestLocation() {initLocation();mLocationClient.start();}/*初始化函数*/private void initLocation() {LocationClientOption option = new LocationClientOption();option.setScanSpan(5000);mLocationClient.setLocOption(option);}/*只有同意打开相关权限才可以开启本程序*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull 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:}}/*监听线程,获得当前的经纬度,并显示*/public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(final BDLocation location) {runOnUiThread(new Runnable() {@Overridepublic void run() {currentPosition = new StringBuilder();currentPosition.append("纬度:").append(location.getLatitude()).append("\n");currentPosition.append("经度:").append(location.getLongitude()).append("\n");currentPosition.append("定位方式:");if (location.getLocType() == BDLocation.TypeGpsLocation) {currentPosition.append("GPS");} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {currentPosition.append("网络");}positionText.setText(currentPosition);}});}}public void onConnectHotSpotMessage(String s, int i) {}@Overrideprotected void onDestroy(){super.onDestroy();mLocationClient.stop();}}

4、选择定位方式:
聪明的读者已经注意到了,开头的截图显示的是网络定位,众所周知,网络定位精度在室外不如GPS定位,那我们怎么切换成GPS定位呢?
很简单,只要修改initLoation()函数。如下所示:

   private void initLocation() {LocationClientOption option = new LocationClientOption();option.setScanSpan(5000);option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);mLocationClient.setLocOption(option);}

重新编译安装,然后走到室外,你会发现已经是GPS定位了。

5、具体位置显示
由于只看经纬度我们无法一下子知道自己的具体位置,所以引入具体位置显示。只需要修改MainActivity.java即可。
修改部分:
(1)、先是调用了setIsNeedAddress传入true,表示我们需要获取当前具体的位置。

 private void initLocation() {LocationClientOption option = new LocationClientOption();option.setScanSpan(5000);// option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);option.setIsNeedAddress(true);mLocationClient.setLocOption(option);}

(2)、调用getProvince、getCity等函数获得具体的位置信息。

    public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(final BDLocation location) {runOnUiThread(new Runnable() {@Overridepublic void run() {currentPosition = new StringBuilder();currentPosition.append("纬度:").append(location.getLatitude()).append("\n");currentPosition.append("经度:").append(location.getLongitude()).append("\n");currentPosition.append("国家:").append(location.getCountry()).append("\n");currentPosition.append("省:").append(location.getProvince()).append("\n");currentPosition.append("市:").append(location.getCity()).append("\n");currentPosition.append("区:").append(location.getDistrict()).append("\n");currentPosition.append("街道:").append(location.getStreet()).append("\n");currentPosition.append("定位方式:");if (location.getLocType() == BDLocation.TypeGpsLocation) {currentPosition.append("GPS");} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {currentPosition.append("网络");}positionText.setText(currentPosition);}});}}

四、问题

1.错误:从内部类中访问本地变量location;需要被声明为最终类型。
解决方法:加上final
2.Invalid process name remote in package com.example.lbstest: must have at least one
百度了一下INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,发现错误是出现在AndroidManifest.xml里,经检查发现:

红线处少了一个’:'

修改之后:

3.显示地图,但定位总是在北京。

当做完显示地图这个步骤之后,将地图移动到我的位置这一步似乎没有发挥其作用,即总是定位在北京。

检查之后,我觉得是这部分代码可能出现了一些问题。

位置:onReceiveLocation函数

书上这个函数的代码是没有开启线程的,这样的话就不会移动到我的当前位置,所以一直都是北京区域。

所以的话,在此函数增加一条线程代码即可,亲测有效的。^- ^

 public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(final BDLocation location) {runOnUiThread(new Runnable() {@Overridepublic void run() {if (location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation) {navigateTo(location);}}});}}

五、总结

那么这一小节就完成了,效果如开头的手机截图一样。

如果我的文章对你有帮助,欢迎关注,点赞,收藏,有问题可以评论。

超详细的Android百度地图开发:在APP上定位并显示出来相关推荐

  1. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划

    2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划 开发前配置,显示基本地图,实时定位等查看之前代码,此博客紧接上一博客:https://blog.csdn.ne ...

  2. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(6) POI检索, 根据地址输入提示检索 Sug

    POI检索, 根据地址输入提示检索 Sug 参考百度地图官方文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/search/sug ...

  3. android studio百度地图教程,Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(4) 路线规划之起始点地址输入实现规划...

    实现起始点输入的路线规划 要实现输入起始点的路线规划,需要两个输入框,可以将两个输入框设置在和地图同一个Activity中,也可以新建一个Activity,来实现地址的输入,然后通过页面之间的跳转来传 ...

  4. Android百度地图开发(二)定位之自动定位及标注(及定位几日内瓦或坐标4.9E-324问题)

    接上篇Android百度地图开发(一)之Hello BaiduMap 1.环境配置: 新增权限如下 <!-- 这个权限用于进行网络定位--> <uses-permission and ...

  5. Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/11380619 这一篇文章主要讲解的是百度地图的定位功能,然后还有MyLocationOv ...

  6. [android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

           前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Intere ...

  7. android 百度地图开发 别人用不了,Android百度地图开发的那些不足之处

    Android百度地图开发的那些不足之处,最近做的项目中百度地图是很重要的一个模块,其中实现了定位.自定义Marker图标.线路规划.SuggestionSearch检索.地图截图以及导航等功能.因为 ...

  8. Android 百度地图开发(二)

    前面我们一起了解了百度地图的申请与集成Android 百度地图开发(一),今天我们接着来学习百度地图. 今天主要来了解如下问题: 1.百度地图的生命周期控制 上一篇张我们已经在布局文件里增加了mapV ...

  9. Android百度地图开发入门教程

    Android百度地图开发入门教程 1.平台注册登录 2.创建应用 3.Android studio配置 4.代码编写 5.最终效果(建议真机) 1.平台注册登录 登录百度地图开放平台网站注册并登录 ...

最新文章

  1. 0x0F19B7EC (ucrtbased.dll)处(位于 ex6.exe 中)引发的异常: 0xC0000005: 写入位置 0x00740000 时发生访问冲突。
  2. 2193亿,长沙雨花GDP成为中西部区县第一是如何做到的?
  3. JavaScript:Scope(域)的基本指南
  4. [Android] AlertDialog获取网上天气并显示各城市天气
  5. debian9为什么默认是pip2_Debian9 安装后基本配置
  6. JAVA 第1课 开始前的准备
  7. linux安装python3.7
  8. 如何将php改成mp4,如何将swf转换成mp4
  9. 皮尔森相关系数_克莱姆相关系数的计算
  10. 免费IP切换工具有用吗?
  11. 安卓硬件模拟大师_安卓虚拟大师 可以手机运行免root带xp框架模拟器
  12. Auto CAD线性不显示的解决办法
  13. c语言srand函数作用,C语言之rand()和srand()函数
  14. 深度学习之tensorflow:tensorflow-cpu;win10+gtx1050ti+tensorflow-gpu搭建过程以及问题解决
  15. 在MT终端模拟器中使用Termux命令
  16. 女巫小屋的指令Java_我的世界女巫小屋详介绍 我的世界女巫小屋种子代码一览...
  17. 2000、XP、2003所有注册表设置
  18. 【信息系统项目管理师】第二十二章 信息系统安全管理(考点汇总篇)
  19. CLO如何在其软件结构中集成V-RAY
  20. 7-9 彩虹瓶 (25 分)(c++)

热门文章

  1. Web前端开发敲门砖 ——《Web前端工程师修炼之道》
  2. 怎样去设计一个音乐网站
  3. ElasticSearch7.3学习(二十一)----Filter与Query对比、使用explain关键字分析语法
  4. 3、mysql索引优化一:Explain关键字分析
  5. nginx配置完rewrite浏览器提示将您重定向的次数过多
  6. leecode#1051【数组】:高度检查器
  7. 对等网络实时音视频通信技术框架及应用实践
  8. Broadcom LED Interface
  9. 辉煌优配|人民币将可直接买港股 多家港股公司申请 增设人民币柜台
  10. 目标检测算法之CVPR2019 GIoU Loss