Android开发之百度地图定位

  • 一、效果图
  • 二、下载百度地图SDK
    • 1.打开[百度地图](https://lbsyun.baidu.com/index.php?title=%E9%A6%96%E9%A1%B5)官网,然后点击开发文档选择Android地图SDK
    • 2.使用步骤如图
    • 3.点击申请密钥(AK),完成注册和申请为开发者后(非常简单)
    • 4.登录后将进入API控制台
    • 5.点击“创建应用”开始申请开发密钥
    • 6.填写应用名称,注意应用类型选择“Android SDK”、正确填写SHA1 和 程序包名
    • 7.获取SHA1
      • (1)进入cmd控制台,执行”cd .android”定位到”.android”文件夹下。
      • (2)继续在控制台输入命令:keytool -list -v -keystore debug.keystore
      • (3)输入口令:调试版本默认密码是: android,此时可在控制台显示的信息中获取SHA1值
    • 8.获取包名
      • (1)使用 Android Studio 开发
      • (2)使用Eclipse开发
    • 9.打开Android Studio配置,点击下载开发包
      • (1)选择基础定位
      • (2)选择JAR和标准开发包
    • 10.将下载的SDK解压,将开发包文件复制到app下面的libs文件中
    • 11.将libs文件下的包添加到build中
    • 12.在app目录下的build.gradle的android中配置sourceSets标签
  • 二、代码实现
    • 1.新建application类(MyApplication)进行地图初始化
    • 2.修改AndroidManifest.xml文件
      • (1)在application标签中添加刚才新建的application项目名
      • (2)添加权限
      • (3)在application 标签中写入代码密钥配置,value中的值为AK,修改为自己在百度地图申请的
      • (4)在application标签中放入定位权限
    • 3.build.gradle(:app)中导入Rxpermissions依赖
    • 4.布局文件(activity_bd)
    • 5.java文件(BdActivity)
    • 6.相关图片
    • 7.建议使用真机调试,虚拟机可能会出现定位出错。为避免真机调试安装APP失败,在gradle.properties中添加android.injected.testOnly=false
  • 三、资源下载

一、效果图

二、下载百度地图SDK

1.打开百度地图官网,然后点击开发文档选择Android地图SDK

2.使用步骤如图

3.点击申请密钥(AK),完成注册和申请为开发者后(非常简单)

4.登录后将进入API控制台

5.点击“创建应用”开始申请开发密钥

6.填写应用名称,注意应用类型选择“Android SDK”、正确填写SHA1 和 程序包名

7.获取SHA1

调试版本(debug)和发布版本(release)下的 SHA1 值是不同的,发布 apk 时需要根据发布 apk 对应的 keystore 重新配置 Key。(注意:我们这里使用的是调试版本,在开发时请使用调试版本) 。
Android Studio场景使用keytool

(1)进入cmd控制台,执行”cd .android”定位到”.android”文件夹下。

(2)继续在控制台输入命令:keytool -list -v -keystore debug.keystore

(3)输入口令:调试版本默认密码是: android,此时可在控制台显示的信息中获取SHA1值

8.获取包名

根据您使用的开发工具,包名的获取方式有所不同。

(1)使用 Android Studio 开发

在app目录下的build.gradle文件中找到applicationId,并确保其值与AndroidManifest.xml中定义的package相同。

注意:使用Android Studio开发,如遇到applicationId 与package不一致的情况,以appclicationid为准。

(2)使用Eclipse开发

包名是Android应用程序本身在AndroidManifest.xml 中定义的名称

填写清楚以上内容之后点击提交会为您生成该应用的AK,到这您就可以使用AK来完成您的开发工作了。

9.打开Android Studio配置,点击下载开发包

(1)选择基础定位

(2)选择JAR和标准开发包

10.将下载的SDK解压,将开发包文件复制到app下面的libs文件中

11.将libs文件下的包添加到build中


12.在app目录下的build.gradle的android中配置sourceSets标签

sourceSets {main {jniLibs.srcDirs = ['libs']}}

二、代码实现

1.新建application类(MyApplication)进行地图初始化

package com.example;import android.app.Application;
import com.baidu.location.LocationClient;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//        SDKInitializer.initialize(this);SDKInitializer.setAgreePrivacy(getApplicationContext(),true);SDKInitializer.initialize(getApplicationContext());//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。SDKInitializer.setCoordType(CoordType.BD09LL);LocationClient.setAgreePrivacy(true);}
}

2.修改AndroidManifest.xml文件

(1)在application标签中添加刚才新建的application项目名

android:name=".MyApplication"

(2)添加权限

    <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,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" />

(3)在application 标签中写入代码密钥配置,value中的值为AK,修改为自己在百度地图申请的

 <meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="ionrVhbqggVl3xu3Cf4C88teGrfGshFQ" />

(4)在application标签中放入定位权限

<service android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"/>

3.build.gradle(:app)中导入Rxpermissions依赖

 implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'implementation 'io.reactivex.rxjava2:rxjava:2.0.5'implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.3@aar'

4.布局文件(activity_bd)

<?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"><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:clickable="true" /><ImageButtonandroid:id="@+id/ib_location"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginStart="8dp"android:layout_marginTop="8dp"android:layout_marginEnd="8dp"android:layout_marginBottom="8dp"android:background="@drawable/icon_location"android:onClick="resetLocation"android:visibility="gone" /></LinearLayout>

5.java文件(BdActivity)

package com.example.activity;import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.example.R;
import com.tbruyelle.rxpermissions2.RxPermissions;
public class BdActivity extends AppCompatActivity {private MapView mMapView;private LocationClient mLocClient;private BaiduMap mBaiduMap;private BitmapDescriptor bitmap;//标点的图标private double markerLatitude = 0;//标点纬度private double markerLongitude = 0;//标点经度private ImageButton ibLocation;//重置定位按钮private Marker marker;//标点也可以说是覆盖物@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_bd);initView();//视图初始化try {checkVersion();//检查版本} catch (Exception e) {e.printStackTrace();}mapOnClick();//地图点击}private void checkVersion() throws Exception {if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){RxPermissions rxPermissions = new RxPermissions(this);rxPermissions.request(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(granted -> {if (granted) {//申请成功//发起连续定位请求initLocation();// 定位初始化} else {//申请失败Toast.makeText(BdActivity.this,"权限未开启",Toast.LENGTH_SHORT).show();}});}else {initLocation();// 定位初始化}}private void initView() {// 地图初始化mMapView = (MapView) findViewById(R.id.bmapView);//回到当前定位ibLocation = (ImageButton) findViewById(R.id.ib_location);mMapView.showScaleControl(true);  // 设置比例尺是否可见(true 可见/false不可见)//mMapView.showZoomControls(false);  // 设置缩放控件是否可见(true 可见/false不可见)mMapView.removeViewAt(1);// 删除百度地图LogomBaiduMap = mMapView.getMap();mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker marker) {final String info = (String) marker.getExtraInfo().get("info");Toast.makeText(BdActivity.this, info, Toast.LENGTH_SHORT).show();return true;}});}/*** 地图点击*/private void mapOnClick() {// 设置marker图标bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {@Overridepublic void onMapPoiClick(MapPoi mapPoi) {}//此方法就是点击地图监听@Overridepublic void onMapClick(LatLng latLng) {//获取经纬度markerLatitude = latLng.latitude;markerLongitude = latLng.longitude;//先清除图层mBaiduMap.clear();// 定义Maker坐标点LatLng point = new LatLng(markerLatitude, markerLongitude);// 构建MarkerOption,用于在地图上添加MarkerMarkerOptions options = new MarkerOptions().position(point).icon(bitmap);// 在地图上添加Marker,并显示//mBaiduMap.addOverlay(options);marker = (Marker) mBaiduMap.addOverlay(options);Bundle bundle = new Bundle();bundle.putSerializable("info", "纬度:" + markerLatitude + "   经度:" + markerLongitude);marker.setExtraInfo(bundle);//将bundle值传入marker中,给baiduMap设置监听时可以得到它//点击地图之后重新定位try {initLocation();} catch (Exception e) {e.printStackTrace();}}});}/*** 定位初始化*/public void initLocation() throws Exception {// 开启定位图层mBaiduMap.setMyLocationEnabled(true);// 定位初始化mLocClient = new LocationClient(this);MyLocationListener myListener = new MyLocationListener();mLocClient.registerLocationListener(myListener);LocationClientOption option = new LocationClientOption();option.setOpenGps(true);// 打开gpsoption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置高精度定位option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系option.setScanSpan(0);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setOpenGps(true);//可选,默认false,设置是否使用gpsoption.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要mLocClient.setLocOption(option);mLocClient.start();//开始定位}/*** 点切换到其他标点位置时,重置定位显示,点击之后回到自动定位*/public void resetLocation(View view) throws Exception {markerLatitude = 0;initLocation();marker.remove();//清除标点}/*** 定位SDK监听函数*/public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {Toast.makeText(BdActivity.this,location.getAddrStr(),Toast.LENGTH_SHORT).show();// MapView 销毁后不在处理新接收的位置if (location == null || mMapView == null) {return;}double resultLatitude;double resultLongitude;if (markerLatitude == 0) {//自动定位resultLatitude = location.getLatitude();resultLongitude = location.getLongitude();ibLocation.setVisibility(View.GONE);} else {//标点定位resultLatitude = markerLatitude;resultLongitude = markerLongitude;ibLocation.setVisibility(View.VISIBLE);}MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 设置定位数据的精度信息,单位:米.direction(location.getDirection()) // 此处设置开发者获取到的方向信息,顺时针0-360.latitude(resultLatitude).longitude(resultLongitude).build();mBaiduMap.setMyLocationData(locData);// 设置定位数据, 只有先允许定位图层后设置数据才会生效LatLng latLng = new LatLng(resultLatitude, resultLongitude);MapStatus.Builder builder = new MapStatus.Builder();builder.target(latLng).zoom(20.0f);mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));}}@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();// 退出时销毁定位mLocClient.stop();// 关闭定位图层mBaiduMap.setMyLocationEnabled(false);// 在activity执行onDestroy时必须调用mMapView.onDestroy()mMapView.onDestroy();}
}

6.相关图片

icon_location:

icon_marka:

7.建议使用真机调试,虚拟机可能会出现定位出错。为避免真机调试安装APP失败,在gradle.properties中添加android.injected.testOnly=false

android.injected.testOnly=false

三、资源下载

下载地址:Android开发之百度地图定位
有需要的小伙伴自己下载哦

Android开发之百度地图定位相关推荐

  1. Android开发之百度地图定位打卡

    Android开发之百度地图定位打卡 一.效果图 二.下载百度地图SDK 三.代码实现 1.布局文件(activity_main) 2.布局文件(activity_map) 3.在res文件夹下新建m ...

  2. Android开发之百度地图定位以及简单覆盖物的实现

    直接上代码: 先看下效果图: 我这里主要做了三个功能: 1.一秒钟实时定位功能: 2.添加任意经纬度地点到地图上: 3.判断朝阳门是否在本人定位范围1000米内: 百度地图初始化方法: DemoApp ...

  3. Android开发-基于百度地图API开发仿滴滴出行APP界面的实现

    前 言 近年来,由于移动互联网快速的发展以及基于移动设备的APP的普及,移动互联网改变了人们的生活方式.从线上的电子支付到线下的出行,移动互联网是当今社会人们生活不可或缺的一部分,而线下出行的网约车的 ...

  4. android百度地图自定义图层,百度地图开发之百度地图定位图层基本使用方法讲解...

    (一):基本介绍: 百度地图可以直接提供定位功能,并且把位置信息以图层的形式标注在地图上面(PopupView),同时还支持自定义设置图标,这样便于用户直接查看位置信息.要实现以上的方法,我们主要需要 ...

  5. Android 轻松实现百度地图定位

    最近在做一地图定位软件,下面分享一下自己在做的过程中遇到的问题,希望对大家有帮助: 首先就是要用百度地图的API需要申请一个Key值,要到百度地图API中申请: http://developer.ba ...

  6. 【转载】Android应用之——百度地图定位返回4.9E-324的解决方案

    用百度定位的时候一直定位不到,拿到的经纬度都是4.9E-324,Google了一下,发现不少人出现这个问题,经过一番研究,最终解决了这个问题. 目前看来,出现这个问题说明定位失败了,定位失败返回的就是 ...

  7. Android开发实现高德地图定位详解

     一. 要实现高德地图定位呢,首先需要做好以下几步准备: 1. 在高德开放平台注册帐号 注册地址:http://lbs.amap.com 2. 在开发中下载Android平台下的地图SDK和定位S ...

  8. Android开发之百度地图(soso地图,搜狗地图,阿里云地图)转高德地图经纬度的方法

    //将百度地图经纬度转换为高德地图经纬度CoordinateConverter converter = new CoordinateConverter(this);// CoordType.BAIDU ...

  9. Android开发之百度地图距离判断(判断定位位置是否在圆的范围内)

    直接上代码,简单明了 /*** 返回是否在打卡范围内** @return 返回值*var0表示圆心的坐标,var1代表圆心的半径,var2代表要判断的点是否在圆内*isCircleContainsPo ...

最新文章

  1. 简述在虚拟机中安装 centos 的过程_从零构建Fabric开发运行环境手册(一):安装OS虚拟机(CentOS)...
  2. 感恩工作平台心得体会_感恩有你,一路同行——石龙联社组织举办10月份员工集体生日会...
  3. Eclipse使用Android2.3和3.0的SDK
  4. 密码学系列之:IDEA
  5. 14-Flutter移动电商实战-ADBanner组件的编写
  6. 使用Java制作验证码
  7. Spark standalone 模式下的集群部署
  8. JS——offsetWidth与offsetLeft用法之无缝滚动
  9. 小学计算机二课堂教案,信息技术与小学语文整合教学案例
  10. 机器学习(ML)在材料领域应用专题
  11. SAP License:ML-物料分类账的未分配差异明细
  12. 电机与拖动(电、磁、机械运动)
  13. chrome安装crxMouse鼠标右键手势插件后导致需要双击两次才能打开右键菜单
  14. 分享一下新的echarts离线文档
  15. 学术会议海报制作和参考
  16. E - Skyscrapers (hard version)
  17. 尺寸公差分析尺寸链计算软件:新能源电池行业—模组散热系统之弹簧长度计算
  18. visual studio工程文件介绍
  19. Quantopian自学笔记01
  20. 火车头采集之采集内容获取

热门文章

  1. ubuntu 18.04配置SSH及免密登陆
  2. 视频监控系统选择硬盘,绿盘、蓝盘、紫盘、黑盘、红盘到底选择哪个?
  3. 希望所有计算机专业学生都知道这门课
  4. 【SpringBoot】谷粒商城报错解决:P18 Longblob找不到类型
  5. VR全景旅游,成为数字文旅破局关键!
  6. 目标IT男的第十六天----面向对象第九天
  7. 视频编解码——熵编码的概念
  8. 2023年中国储能产业发展研究报告
  9. Windows Azure SSTP模式×××配置
  10. acwing 1223.最大比例(更相减损术)