[android学习]__使用百度地图开放api编写地图定位app

时间:2021-12-12 16:11:34
  • 前言

在前面我已经记录关于如何使用百度地图api,以及如何配置相关的androidstudio配置了,接下来将记录如何使用百度地图api开发简单的地图定位apk,我将决定不定期持续更新本篇笔记,在每个大的优化改动后.


  • 1.0 简单的地图显示以及定位

首先我们打开对应的application项目(我们在之前申请百度地图ak密钥所对应的项目).如果你并没有,你可以新建一个项目,并申请ak密钥,然后将下载好的地图SDK导入,编写相关的配置.

这些都可以参看其开发文档:

百度地图SDK开发文档

当然,里面也有比较详细api的使用案例和说明,我们可以参考其案例和说明编写程序.

  • 配置开发密钥ak

    我们在项目的配置文件AndroidManifest.xml文件中添加以下代码配置:
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者 key" />
</application>
  • 申请相关的权限
//获取设备网络状态,禁用后无法获取网络状态
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
//网络权限,当禁用后,无法进行检索等相关业务
<uses-permission android:name="android.permission.INTERNET" />
//读取设备硬件信息,统计数据
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
//读取系统信息,包含系统版本等信息,用作统计
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
//获取设备的网络状态,鉴权所需网络代理
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
//允许sd卡写权限,需写入地图数据,禁用后无法显示地图
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
//这个权限用于进行网络定位
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
//这个权限用于访问GPS定位
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
//获取统计数据
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
//使用步行AR导航,配置Camera权限
<uses-permission android:name="android.permission.CAMERA" />
//程序在手机屏幕关闭后后台进程仍然运行
<uses-permission android:name="android.permission.WAKE_LOCK" />
  • 地图初始化

新建application类初始化地图

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

并在配置文件AndroidManifest.xml文件中声明:

<application
android:name=".demoApplication"

  • 布局文件

添加两个控制显示地图类型的单选button控件,两个控制可重复显示的地图类型的checkBox复选框控件.以及添加百度地图的MapView容器.声明id便于在后面设置事件监听器.

<?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">
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<RadioButton
android:id="@+id/Rbtn_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="普通图"
android:layout_marginLeft="10dp"/>
<RadioButton
android:id="@+id/Rbtn_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="卫星图"/> <CheckBox
android:id="@+id/cb_1"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="路况图"
/>
<CheckBox
android:id="@+id/cb_2"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="城市热力图"
/>
</RadioGroup>
<com.baidu.mapapi.map.MapView
android:id="@+id/mMapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
></com.baidu.mapapi.map.MapView> </LinearLayout>

  • activity文件

定义initView方法初始化地图,在方法体类为几个button,checkbox设置监听器,并实现其功能将当前地图类型切换.

定义定义监听函数,通过百度定位SDK中相应的方法实现简单的地图定位功能.

具体的方法使用,参考api开发文档.里面有较详细的说明和案例

package cn.gemuxiaoshe.gpsapplication;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast; import com.baidu.location.BDAbstractLocationListener;
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.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity {
private MapView mapView = null;
private RadioButton rbtn_1, rbtn_2;
private CheckBox cb_1, cb_2;
private boolean isFirstLoc = true;
private LocationClient locationClient; public MyLocationListenner myListener = new MyLocationListenner(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main); // 获取地图控件的引用
mapView = (MapView) findViewById(R.id.mMapView);
// 开启定位图层
mapView.getMap().setMyLocationEnabled(true);
//定位初始化
locationClient = new LocationClient(this); locationClient.registerLocationListener(myListener); //定位配置信息
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setCoorType("bd0911");
option.setScanSpan(1000);
locationClient.setLocOption(option);
locationClient.start();
initView(); } /**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener { @Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mapView.getMap().setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mapView.getMap().animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
} public void onReceivePoi(BDLocation poiLocation) {
}
} private void initView() {
rbtn_1 =(RadioButton)findViewById(R.id.Rbtn_1);
rbtn_2 =(RadioButton)findViewById(R.id.Rbtn_2); cb_1 = (CheckBox) findViewById(R.id.cb_1);
cb_2 = (CheckBox) findViewById(R.id.cb_2); rbtn_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { // 设置为普通图
mapView = (MapView) findViewById(R.id.mMapView);
mapView.getMap().setMapType(BaiduMap.MAP_TYPE_NORMAL);
}
});
rbtn_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { // 设置为卫星图
mapView = (MapView) findViewById(R.id.mMapView);
mapView.getMap().setMapType(BaiduMap.MAP_TYPE_SATELLITE);
}
});
// 设置复选框监听事件,选中与取消选中的两种事件.
cb_1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (b){
mapView.getMap().setTrafficEnabled(true);
// 可以自定义设置路况显示的颜色,四个参数,分别代表严重拥堵,拥堵,缓行,畅通
mapView.getMap().setCustomTrafficColor("#ffba0101", "#fff33131", "#ffff9e19", "#00000000");
// 对地图状态做更新,否则可能不会触发渲染.造成自定义无效.
MapStatusUpdate u = MapStatusUpdateFactory.zoomTo(13);
mapView.getMap().animateMapStatus(u);
}else
mapView.getMap().setTrafficEnabled(false);
}
}); cb_2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (b){
mapView.getMap().setBaiduHeatMapEnabled(true);
}else
mapView.getMap().setBaiduHeatMapEnabled(false);
}
});
} // 重写父类方法,管理各部分生命周期.
@Override
protected void onResume() {
mapView.onResume();
super.onResume(); } @Override
protected void onPause() {
mapView.onPause();
super.onPause();
} @Override
protected void onDestroy() {
locationClient.stop();
mapView.getMap().setMyLocationEnabled(false);
mapView.onDestroy();
super.onDestroy();
}
}

  • 演示

[android学习]__使用百度地图开放api编写地图定位app

这里,由于模拟器是没有gps定位模块了,所以这里的定位是不准确的.这样,一个基于百度地图api的简单地图定位apk就算是完成了.

(这里,我在手机测试,发现定位并不是非常精确,之后会更新新版本,使其更加实用)


更新时间:

2019-4-21

0:44

[android学习]__使用百度地图开放api编写地图定位app的更多相关文章

  1. 百度LBS开放平台个性化地图 制作一款独一无二的地图

    百度LBS开放平台个性化地图  制作一款独一无二的地图 天天用百度地图的亲们是否已不再满足仅仅看例如以下的地图样式了呢? 默认百度地图样式 是否特别渴望看特别不一样的地图呢.如带京城81号气息的午夜蓝 ...

  2. Bing必应地图中国API - 在地图上画圆

    Bing必应地图中国API - 在地图上画圆 2011-05-24 14:49:37|  分类: Bing&Google|字号 订阅     <变形金刚2>上映4日国内票房过亿,基 ...

  3. Android 系统api实现定位及使用百度提供的api来实现定位

    目前在国内使用定位的方法主要是 1. Android系统提供的 LocationManager locationManager = (LocationManager) getSystemService ...

  4. Android学习笔记之百度地图

    步行路线搜索及RouteOverlay 方式与驾车路线搜索类似,只需将mMKSearch.drivingSearch(null, start, null, end)修改为mMKSearch.walki ...

  5. 百度地图坐标转换API和地图API

    利用百度地图的服务将经纬度转换为米单位坐标 using System; using System.Collections.Generic; using System.Linq; using Syste ...

  6. 关于百度地图js api的getCurrentPosition定位不准确的解决方法

    很久之前帮大叔解决了一个gps坐标转换为百度地图坐标的问题.今天大叔又给我讲百度地图定位不准.我查了一下api,用了官方给出的这样一组函数. //创建查询对象 var geolocation = ne ...

  7. 百度地图离线API及地图数据下载工具

    全面介绍,请看下列介绍地址,改写目前最新版本的百度V2.0地图,已全面实现离线操作,能到达在线功能的95%以上 http://api.jjszd.com:8081/apituiguang/gistg. ...

  8. Google地图接口API之地图类型&lpar;六&rpar;

    1. Google 地图- 基本地图类型 Google Maps API 中提供了以下地图类型: MapTypeId.ROADMAP,用于显示默认的道路地图视图 MapTypeId.SATELLITE ...

  9. Google地图接口API之地图控件集&lpar;五&rpar;

    1.默认控件集 当使用一个标准的google地图,它的控件默认设置如下: (1). Zoom-显示一个滑动条来控制map的Zoom级别,如下所示:

随机推荐

  1. Ubuntu 14&period;04 LTS 安装 spark 1&period;6&period;0 (伪分布式)-26号开始

    需要下载的软件: 1.hadoop-2.6.4.tar.gz 下载网址:http://hadoop.apache.org/releases.html 2.scala-2.11.7.tgz 下载网址:h ...

  2. css之display&colon;inline-block

    display:inline-block: 作用:将对象呈现为inline对象,但是对象的内容作为block对象呈现.之后的内联对象会被排列在同一行内.比如我们可以给一个link(a元素)inline ...

  3. js中同步与异步请求方式

    异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST ...

  4. HTML的奇葩嵌套规则

    一.HTML 标签包括 块级元素(block).内嵌元素(inline) 1.块级元素 一般用来搭建网站架构.布局.承载内容……它包括以下这些标签: address.blockquote.center ...

  5. 【socket】一分钟理清 socket udpsocket tcpsocket tcplistener TCPClient和 UDPClient

    socket 套接字接口是各种语言tcp udp的网络操作的基础. 直接用socket 对象开发 可以选择 udpsocket  或者 tcpsocket ,两者在使用上仅一些方法和参数不同,所有的底 ...

  6. PHP 文件包含之文件路径截断&lpar;转&rpar;

    PHP 文件包含之文件路径截断 以下是网络摘要: 1. 本来还以为挖到金矿了,跟黑哥交流后发现只能应用于Win32平台,使这个BUG的威力暴减,基本没有太大危害了,因为在WIN32平台使用PHP的实在 ...

  7. windows apache 配置多个服务 站点 Apache Service Monitor

    把Apache安装为多个Window NT服务 ~~~ 可以在 services.msc中查看到1. 在DOS下跳到Apache安装目录里的bin目录(~~~或者用path命令 把apache的安装目 ...

  8. Lua语言的介绍和编程语言的归类

    Lua 本条目介绍的是一种编程语言.关于关于Lua在*中的使用,请见"*:Lua".关于"Lua"一词的其他意思,请见"卢阿". ...

  9. Rhel6&period;6---执行命令df -h卡住不动

    问题描述 nfs服务宕掉后,df -h卡住不动,使用xftp也无法打开文档路径 -bash-4.1# mount /dev/mapper/vg_root-LogVol00 on / type ext4 ...

  10. 面向对象课程 - 寒假第四次作业 - C&plus;&plus;计算器项目计算部分

    C++计算器项目计算部分 零.项目源文件地址 地址:Calculator 2.0 一.项目信息相关 项 目 : Calculator 版 本 : 2 . 0 日 期 : 2016 . 4 . 14 实 ...