准备工作:

1.申请百度地图API

2.下载百度地图的SDK

3.将SDK包中的BaiduLBS_Android.jar文件放到,项目里的app/libs里面

4.在src/main目录下创建一个名为jniLibs的目录,然后将SDK包中的其他所有目录放在里面。

5.同步一下项目。

首先修改布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:id="@+id/position_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

用一个TextView控件用于显示经纬度。

然后修改AndroidManifest.xml文件,代码如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="co.example.leo.lbstest"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android: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-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="N5yXI1cjwQXw631GaapHpD5Fdv43t8KW"/>

<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:exported="true"
android:process=":remote">
</service>
</application> </manifest>

里面添加了很多的权限,每一个都是百度LBS SDK内部要用到的, 然后在<application>标签内部添加了一个<meta -data>标签。

这个标签的androi:name部分是固定的,必须填写com.baidu.lbsapi.API_KEY

android:value部分填入申请的APIKey。

最后还要对LBS SDK中的服务进行注册。

最后修改MainActivity中的代码。

 import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
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.widget.TextView;
import android.widget.Toast; import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { public LocationClient mLocationClient;
private TextView positionText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建一个LocationClient的实例,接受的context通过getApplicationContext()方法获取。
mLocationClient = new LocationClient(getApplicationContext());
//调用LocationClient的registerLocationListener()方法来注册一个监听器 当获取到位置信息的时候,就会回调这个定位监听器
mLocationClient.registerLocationListener(new MyLocationListener());
setContentView(R.layout.activity_main); positionText = (TextView)findViewById(R.id.position_text_view);
/*
* 之前在AndroidManifest.xml内声明了很多权限。
* 其中有4个是危险权限。不过ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION都属于一个权限组,所以两者只需要申请其中一个就可以了。
* 如何在运行时一次申请三个权限呢?
* 首先创建一个空的List集合,然后依次判断这三个权限有没有被授权,如果没有授权就添加到List集合中,最后将List集合转化成数组,在调用ActivityCompat.requestPermissions()方法就可以一次性申请。
*/
List<String> permissionList = new ArrayList<>();
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if(ContextCompat.checkSelfPermission(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(this,permissions,);
}else{
requestLocation();
}
} private void requestLocation(){
//调用start方法会回调到我们注册的监听器上面
mLocationClient.start();
} @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case :
if(grantResults.length > ){
//将每个申请的权限都进行判断 如果存在一个没有被授权,那么就调用finish()方法关闭程序。
for(int result : grantResults){
if(result != PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,"必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();
finish();
return ;
}
}
//所有权限都已经授权,那么直接调用requestLocation()方法开始定位。
requestLocation();
}else{
Toast.makeText(MainActivity.this,"发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
default: break;
}
} public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(final BDLocation location) {
runOnUiThread(new Runnable() {
@Override
public void run() {
StringBuilder currentPosition = new StringBuilder();
//通过BDLocation的getLatitude()方法获取当前位置的纬度
currentPosition.append("纬度").append(location.getLatitude()).append("\n");
//通过BDLocation的getLongitude()方法获取当前位置的经度。
currentPosition.append("经线").append(location.getLongitude()).append("\n");
//getLocType()方法获取当前的定位方式。
if(location.getLocType() == BDLocation.TypeGpsLocation){
currentPosition.append("GPS");
}else if(location.getLocType() == BDLocation.TypeNetWorkLocation){
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
});
} @Override
public void onConnectHotSpotMessage(String s, int i) { }
}
}

默认情况下,调用Location的start()方法只会定位一次。

如果想要实时更新当前的位置怎么办呢?

修改MainActivity中的代码

 private void requestLocation(){
//调用start方法会回调到我们注册的监听器上面
initLocation();
mLocationClient.start();
}

这里在requestLocation()方法内增加了一个initLocation()方法

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

在initLocation()方法中创建了一个LocationClientOption对象,然后调用它的setScanSpan()方法来设置更新的间隔。单位为毫秒。

最后记得,在活动销毁的时候要调用LocationClient的Stop()方法来停止定位。

  @Override
protected void onDestroy(){
super.onDestroy();
mLocationClient.stop();
}

选择定位模式

定位模式有三种:

高精确度:允许使用GPS,无线网络,蓝牙或者移动网络来进行定位。

节电:仅允许使用WLAN,蓝牙或移动网络确定位置。

仅限设备:仅限GPS来进行定位。

也就是说,如果要想使用GPS定位功能,那么必须要选择高精确度模式,或者是仅限设备模式。

我们可以在之前的initLocation()方法中对百度LBS SDK的定位模式进行指定。

一共有三种模式可选:High_Accuracy,Battery_Saving,和Device_Sensors。

Hight_Accuracy表示高精确度模式,会在GPS信号正常的情况下优先使用GPS定位。

Device_Sensors表示传感器模式,只会用GPS进行定位。

High_Accuracy是默认的模式。

修改initLocation()中的代码

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

这里调用了setLocationMode()方法将定位模式指定成传感器模式,也就是说只能用GPS进行定位。

看的懂的位置信息

我们可以通过一些简单的接口调用就能得到当前位置各种丰富的地址信息。

修改MainActivity中的initLocation()方法

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

这里调用了LocationClientOption的setIsNeedAddress()方法,并传入了true。这就表示我们需要获取当前位置的详细的地址信息。

然后修改MainActivity中的MyLocationListener

 public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(final BDLocation location) {
runOnUiThread(new Runnable() {
@Override
public void run() {
StringBuilder currentPosition = new StringBuilder();
//通过BDLocation的getLatitude()方法获取当前位置的纬度
currentPosition.append("纬度").append(location.getLatitude()).append("\n");
//通过BDLocation的getLongitude()方法获取当前位置的经度。
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");
//getLocType()方法获取当前的定位方式。
if(location.getLocType() == BDLocation.TypeGpsLocation){
currentPosition.append("GPS");
}else if(location.getLocType() == BDLocation.TypeNetWorkLocation){
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
});
}
getCounty()获取当前所在国家
getProvince()获取当前所在省

以此类推。

需要我们注意的是获取地址信息一定需要用到网络,因此即使我们将定位模式指定成了Device Sensors,也会自动开启网络定位功能。

 

让“我”显示在地图上

百度LBS SDK当中提供了一个MyLocatioData.Builder类,这个类是用来封装设备当前所在位置的。只需要将经纬度信息传入到这个类的相应方法中就可以了。如下所示:

MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
locationBuilder.latitude(39.315);
locationBuilder.longitude(116.404);

MyLocationData.Builder类中还提供了一个builde()方法,当我们把要封装的信息都设置完成之后,只需要调用它的build()方法。就会生成一个MyLocationData的实例。

然后将这个实例传入到BaiduMap的setMyLocationData()方法中,就可以让设备当前的位置显示在地图上了。

百度地图API:使用百度定位的更多相关文章

  1. 如何利用【百度地图API】进行定位?非GPS定位

    原文:如何利用[百度地图API]进行定位?非GPS定位 如果你可以上网,如果你有火狐浏览器,那么恭喜你.你能很容易使用以下代码进行定位! ------------------------------- ...

  2. HTML5调用百度地图API进行地理定位实例

    自从HTML5的标准确定以后,越来越多的网站使用HTML5来进行开发.虽然对HTML5支持的浏览器不是很多,但是依然抵挡不了大伙对HTML5开发的热情.今天为大家带来的是使用HTML5调用百度地图AP ...

  3. 【百度地图API】百度API卫星图使用方法和卫星图对比工具

    原文:[百度地图API]百度API卫星图使用方法和卫星图对比工具 百度地图API推出卫星图接口也有一个月啦~ 本文除了介绍如何使用百度地图API来操作卫星图外,还顺带制作了个卫星图对比工具. 一.百度 ...

  4. 百度地图API的IP定位城市和浏览器定位(转)

    百度地图API提供了Geolocation 和 LocalCity两个服务类. 这俩API可以分别供用户在JavaScript中进行定位和城市确认. 1 本质上,Geolocation这个类是使用了支 ...

  5. php用百度地图API进行IP定位和GPS定位

    <?php /** * 根据地理坐标获取国家.省份.城市,及周边数据类(利用百度Geocoding API实现) * 百度密钥获取方法:http://lbsyun.baidu.com/apico ...

  6. 通过百度地图API将百度坐标转换成GPS经纬度

    百度地图API链接:http://developer.baidu.com/map/index.php?title=webapi/guide/changeposition 百度地图API中,有GPS坐标 ...

  7. 【Android接百度地图API】百度地图Demo点击按钮闪退

    运行百度地图自带的BaiduMap_AndroidSDK_v4.1.0_Sample里面的BaiduMapsApiASDemo发现点击上面的按钮会闪退,控制台报的是xml的问题 查了一下,官方文档特别 ...

  8. JS通过百度地图API获取当前定位信息

    $(function(){ var latlon=null; //ajax获取用户所在经纬度 $.ajax({ url:"http://api.map.baidu.com/location/ ...

  9. 利用百度地图api实现定位

    使用百度地图api前需要先获取一个百度地图开放平台的访问应用AK, 获取百度地图开放平台访问应用AK方式:注册百度账号-->申请百度开发者-->获取密匙-->使用相关功能. 注册账号 ...

  10. 百度地图API开发指南

    简介什么是百度地图API? 百度地图API是一套由JavaScript语言编写的应用程序接口,它能够帮助您在网站中构建功能丰富.交互性强的地图应用.百度地图API包含了构建地图基本功能的各种接口,提供 ...

随机推荐

  1. 关于前端CSS的总结

    CSS语法 CSS语言的基本单位是样式声明:propertyName : value ; CSS语言的使用方式: 1.把CSS样式声明作为HTML标签的style属性值.2.使用CSS选择器 CSS常 ...

  2. oracle_(第二课)监听器配置

    一. 1.首先我们得安装好oracle数据库(上一课有讲) 再来看看我们没有监听器之前的文件 文件路径:%ORACLE_HOME%/NETWORK/ADMIN 2.关闭所有防火墙,win10的要特别注 ...

  3. 新开通blog

    从今天开始我有blog了,,以后要经常总结一些自己接触的东西,提升自己

  4. Elasticsearch-URL查询实例解析

    ES(elasticsearch),以下简称ES ES的查询有query.URL两种方式,而URL是比较简洁的一种,本文主要以实例探讨和总结URL的查询方式 1.语法 curl [ -s][ -g][ ...

  5. day45-多线程(server和多个client通信)

    #server: import socket from threading import Thread def func(conn): conn.send(b'hello client') ret = ...

  6. linux 上安装 keepalive

    1.keepalive 单机安装 1.1 安装环境 yum -y install kernel-devel* openssl-* popt-devel lrzsz openssh-clients li ...

  7. jeesite 去掉 /a

    1.修改 jeesite.properties文件 adminPath=/a为 adminPath= 2.修改 web.xml文件找到如下设置 <filter-mapping> <f ...

  8. Java源码之ArrayList

    本文源码均来自Java 8 总体介绍 Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类.Set和List两个类继承于它.Set中不能包含重复的元素,也没有顺序来存放. ...

  9. TPO1-3 Timberline Vegetation on Mountains

    Wind velocity also increase with altitude and may cause serious stress for trees,as is made evident ...

  10. 12款优秀的 JavaScript 日历和时间选择控件

    这些插件能够帮助  Web 开发人员更快速的实现各种精美的日历和时间选择效果. 1. The Coolest Calendar 界面非常漂亮的一款日期选择插件,有详细的使用文档,最新版本 1.5. 点 ...