百度地图API:使用百度定位

准备工作:

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中的代码。

  1 import android.Manifest;
  2 import android.content.pm.PackageManager;
  3 import android.os.Bundle;
  4 import android.support.annotation.NonNull;
  5 import android.support.v4.app.ActivityCompat;
  6 import android.support.v4.content.ContextCompat;
  7 import android.support.v7.app.AppCompatActivity;
  8 import android.widget.TextView;
  9 import android.widget.Toast;
 10
 11 import com.baidu.location.BDLocation;
 12 import com.baidu.location.BDLocationListener;
 13 import com.baidu.location.LocationClient;
 14
 15 import java.util.ArrayList;
 16 import java.util.List;
 17
 18 public class MainActivity extends AppCompatActivity {
 19
 20     public LocationClient mLocationClient;
 21     private TextView positionText;
 22
 23     @Override
 24     protected void onCreate(Bundle savedInstanceState) {
 25         super.onCreate(savedInstanceState);
 26         //创建一个LocationClient的实例,接受的context通过getApplicationContext()方法获取。
 27         mLocationClient = new LocationClient(getApplicationContext());
 28         //调用LocationClient的registerLocationListener()方法来注册一个监听器 当获取到位置信息的时候,就会回调这个定位监听器
 29         mLocationClient.registerLocationListener(new MyLocationListener());
 30         setContentView(R.layout.activity_main);
 31
 32         positionText = (TextView)findViewById(R.id.position_text_view);
 33         /*
 34         * 之前在AndroidManifest.xml内声明了很多权限。
 35         * 其中有4个是危险权限。不过ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION都属于一个权限组,所以两者只需要申请其中一个就可以了。
 36         * 如何在运行时一次申请三个权限呢?
 37         * 首先创建一个空的List集合,然后依次判断这三个权限有没有被授权,如果没有授权就添加到List集合中,最后将List集合转化成数组,在调用ActivityCompat.requestPermissions()方法就可以一次性申请。
 38          */
 39         List<String> permissionList = new ArrayList<>();
 40         if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
 41             permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
 42         }
 43         if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
 44             permissionList.add(Manifest.permission.READ_PHONE_STATE);
 45         }
 46         if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
 47             permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
 48         }
 49         if(! permissionList.isEmpty()){
 50             String[] permissions = permissionList.toArray(new String[permissionList.size()]);
 51             ActivityCompat.requestPermissions(this,permissions,1);
 52         }else{
 53             requestLocation();
 54         }
 55     }
 56
 57     private void requestLocation(){
 58         //调用start方法会回调到我们注册的监听器上面
 59         mLocationClient.start();
 60     }
 61
 62     @Override
 63     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 64         switch (requestCode){
 65             case 1:
 66                 if(grantResults.length > 0){
 67                     //将每个申请的权限都进行判断 如果存在一个没有被授权,那么就调用finish()方法关闭程序。
 68                     for(int result : grantResults){
 69                         if(result != PackageManager.PERMISSION_GRANTED){
 70                             Toast.makeText(MainActivity.this,"必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();
 71                             finish();
 72                             return ;
 73                         }
 74                     }
 75                     //所有权限都已经授权,那么直接调用requestLocation()方法开始定位。
 76                     requestLocation();
 77                 }else{
 78                     Toast.makeText(MainActivity.this,"发生未知错误", Toast.LENGTH_SHORT).show();
 79                     finish();
 80                 }
 81                 break;
 82             default: break;
 83         }
 84     }
 85
 86     public class MyLocationListener implements BDLocationListener{
 87         @Override
 88         public void onReceiveLocation(final BDLocation location) {
 89             runOnUiThread(new Runnable() {
 90                 @Override
 91                 public void run() {
 92                     StringBuilder currentPosition = new StringBuilder();
 93                     //通过BDLocation的getLatitude()方法获取当前位置的纬度
 94                     currentPosition.append("纬度").append(location.getLatitude()).append("\n");
 95                     //通过BDLocation的getLongitude()方法获取当前位置的经度。
 96                     currentPosition.append("经线").append(location.getLongitude()).append("\n");
 97                     //getLocType()方法获取当前的定位方式。
 98                     if(location.getLocType() == BDLocation.TypeGpsLocation){
 99                         currentPosition.append("GPS");
100                     }else if(location.getLocType() == BDLocation.TypeNetWorkLocation){
101                         currentPosition.append("网络");
102                     }
103                     positionText.setText(currentPosition);
104                 }
105             });
106         }
107
108         @Override
109         public void onConnectHotSpotMessage(String s, int i) {
110
111         }
112     }
113 }

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

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

修改MainActivity中的代码

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

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

1  private void initLocation(){
2         LocationClientOption option = new LocationClientOption();
3         option.setScanSpan(5000);
4         mLocationClient.setLocOption(option);
5     }

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

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

1  @Override
2         protected void onDestroy(){
3             super.onDestroy();
4             mLocationClient.stop();
5         }

选择定位模式

定位模式有三种:

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

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

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

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

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

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

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

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

High_Accuracy是默认的模式。

修改initLocation()中的代码

1 private void initLocation(){
2         LocationClientOption option = new LocationClientOption();
3         option.setScanSpan(5000);
4         option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
5         mLocationClient.setLocOption(option);
6     }

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

看的懂的位置信息

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

修改MainActivity中的initLocation()方法

1  private void initLocation(){
2         LocationClientOption option = new LocationClientOption();
3         option.setScanSpan(5000);
4         option.setIsNeedAddress(true);
5         mLocationClient.setLocOption(option);
6     }

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

然后修改MainActivity中的MyLocationListener

 1 public class MyLocationListener implements BDLocationListener{
 2         @Override
 3         public void onReceiveLocation(final BDLocation location) {
 4             runOnUiThread(new Runnable() {
 5                 @Override
 6                 public void run() {
 7                     StringBuilder currentPosition = new StringBuilder();
 8                     //通过BDLocation的getLatitude()方法获取当前位置的纬度
 9                     currentPosition.append("纬度").append(location.getLatitude()).append("\n");
10                     //通过BDLocation的getLongitude()方法获取当前位置的经度。
11                     currentPosition.append("经线").append(location.getLongitude()).append("\n");
12                     currentPosition.append("国家").append(location.getCountry()).append("\n");
13                     currentPosition.append("省").append(location.getProvince()).append("\n");
14                     currentPosition.append("市").append(location.getCity()).append("\n");
15                     currentPosition.append("区").append(location.getDistrict()).append("\n");
16                     currentPosition.append("街道").append(location.getStreet()).append("\n");
17                     //getLocType()方法获取当前的定位方式。
18                     if(location.getLocType() == BDLocation.TypeGpsLocation){
19                         currentPosition.append("GPS");
20                     }else if(location.getLocType() == BDLocation.TypeNetWorkLocation){
21                         currentPosition.append("网络");
22                     }
23                     positionText.setText(currentPosition);
24                 }
25             });
26         }
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()方法中,就可以让设备当前的位置显示在地图上了。

时间: 2024-12-26 07:22:20

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

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

自从HTML5的标准确定以后,越来越多的网站使用HTML5来进行开发.虽然对HTML5支持的浏览器不是很多,但是依然抵挡不了大伙对HTML5开发的热情.今天为大家带来的是使用HTML5调用百度地图API进行地理定位实例.请看下面代码: <!DOCTYPE html> <html> <title>HTML5调用百度地图API进行地理定位实例</title> <head> <meta http-equiv="Content-Type&

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

原文:如何利用[百度地图API]进行定位?非GPS定位 如果你可以上网,如果你有火狐浏览器,那么恭喜你.你能很容易使用以下代码进行定位! ------------------------------------------------------------------------------- 百度地图API是一套由JavaScript语言编写的应用程序接口,它能够帮助您在网站中构建功能丰富.交互性强的地图应用程序. 其中,有Geolocation这个类,可以帮助你进行定位. 它的原理是,利用

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

百度地图API提供了Geolocation 和 LocalCity两个服务类. 这俩API可以分别供用户在JavaScript中进行定位和城市确认. 1 本质上,Geolocation这个类是使用了支持HTML5浏览器提供的Geolocation API 来进行定位的.目前Internet Explorer 9.Firefox.Chrome.Safari 以及 Opera 支持地理定位(因为他们支持HTML5). 2 本质上,LocalCity这个类是利用用户IP地址去百度数据库里查询得到IP所

PHP利用百度地图API进行IP定位和GPS定位

最近在做一个手机端的webapp地图应用,而核心内容当然是定位了,但是定位的话有几种方式,IP定位,GPS定位,基站定位(这个貌似webapp用不了), 那么剩下核心的gps定位和ip定位了,我们知道,html5有定位API,但是该API拿到的GPS数据是硬件坐标,无法直接显示在地图上. 后来上百度LBS云看到有地图IP定位API和GPS坐标转换API,地址:http://developer.baidu.com/map/ 百度地图API的调用需要申请KEY,这里就不具体介绍了,直接贴上本人写了两

ionic 调用百度地图API,并定位当前位置示例

首先,可以参考JS版本的百度地图API示例. 由于在ionic程序中,我们一般使用的ES5 或 ES6 或者是Typescript. 这与JS 还有有一些区别的.所以,在我们的程序中,代码与官方示例代码格式上不完全相同. 下面,简单说明一下如何在 ionic 程序中 调用 百度地图API. 1. 在ionic程序中,定位到文件: \src\index.html.  添加如下代码 , 注意将"您的密钥" 替换成 您申请的密钥 <script type="text/java

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

<?php /** * 根据地理坐标获取国家.省份.城市,及周边数据类(利用百度Geocoding API实现) * 百度密钥获取方法:http://lbsyun.baidu.com/apiconsole/key?application=key(需要先注册百度开发者账号) * Date: 2015-07-30 * Author: fdipzone * Ver: 1.0 * * Func: * Public getAddressComponent 根据地址获取国家.省份.城市及周边数据 * Pri

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

运行百度地图自带的BaiduMap_AndroidSDK_v4.1.0_Sample里面的BaiduMapsApiASDemo发现点击上面的按钮会闪退,控制台报的是xml的问题 查了一下,官方文档特别交代了要加入SDKInitializer.initialize(getApplicationContext()); 但是Demo里面没有,因而要加上. 即可解决Demo的Bug.

百度地图实现普通地图、定位、周边搜索功能

注意:此Demo是用Android Studio实现的 //--------------一下是普通地图的实现----------------------------------- 1:打开百度地图APi进去,如果没有注册过的需要注册,注册过的登录进入 2:点击开发--Android地图SDk--点击获取密钥--点击创建应用--然后你就创建一个新的项目3:打开你项目下的res--values--string.xml把项目名:比如BaiDuMap复制到应用名称中去4:应用类型选择:Android S

网页嵌入百度地图和使用百度地图api自定义地图的详细步骤

在网页中插入百度地图 如果想在自己的网页上面加入百度地图的话,可以用百度地图的api.具体使用方法如下: 第一步:进入百度创建地图的网站http://api.map.baidu.com/lbsapi/creatmap/,搜索出自己要展示的位置,如下图所示. 第二步:设置地图,大家可以对网站显示地图的宽高进行设置,其余选项不动. 第三步:添加标注.点击第一个图标后,在右侧找到自己的位置,单击鼠标左键可定位.标记图标处可更换图标形状,名称和备注填入位置相关信息. 第四步:获取代码.将代码贴到你的网页

百度地图API(一)

对于个人来说,在编写程序时,可能需要用到一些数据,这些数据是我们一般难以直接采集的.所以,学会使用大公司和国家的数据和API接口是相当重要的. 最近,我在写一个个人管理工具,需要用到本地实时天气数据. 这个可以考虑做一个多功能数据采集器,采集户外户内数据,再结合气象模型,预测模型.不过这些都比较高端了,我还完成不了. 简单一点,找一个企业级的天气API,就可以查看本地的天气,除此之外,还可以查看其它地方,及预测之后一段时间的天气. 通过网上搜索,百度地图的API使用非常广泛.相应的使用方法和资料