安卓:百度地图开发(超详细)

一、百度地图介绍

百度地图SDK是一套供开发者使用的软件开发工具包(SDK),用于在Android应用程序中集成和使用百度地图功能。通过使用百度地图SDK,开发者可以实现在自己的应用中显示地图、获取定位信息、进行搜索、导航等功能。

百度地图SDK提供了许多常用的类和方法,用于实现各种地图相关功能。以下是一些常用的类及其方法:

1. MapView类:

MapView 类是百度地图SDK提供的一个控件类,用于在应用程序的界面上显示地图。它是一个自定义的 View,可以与 BaiduMap 类关联,实现地图的显示和交互功能。

常用方法:

  • **getMap():**获取百度地图对象(BaiduMap)的实例。
  • **onResume():**在Activity的生命周期方法中调用,用于恢复地图控件的绘制和定位功能。
  • onPause():在Activity的生命周期方法中调用,用于暂停地图控件的绘制和定位功能。
  • **onDestroy():**在Activity的生命周期方法中调用,用于销毁地图控件。

2. BaiduMap类:

BaiduMap 类是百度地图SDK中的核心类,用于管理和操作地图。它提供了一系列方法和接口,用于显示地图、控制地图状态、添加覆盖物、定位等功能。

常用方法:

  • **setMapType():**设置地图显示类型,如普通地图、卫星地图等。
  • setMapStatus():设置地图的状态,包括中心点坐标、缩放级别、倾斜角度和旋转角度等。
  • **addOverlay():**添加覆盖物(Overlay),如标记点(Marker)、折线(Polyline)和多边形(Polygon)等。
  • **clear():**清除地图上的所有覆盖物。
  • **setOnMapClickListener():**设置地图点击事件监听器。
  • **setOnMarkerClickListener():**设置标记点点击事件监听器。

3. GeoCoder类:

GeoCoder 类是百度地图SDK提供的一个地理编码和反地理编码工具类,用于将地址信息与地理坐标之间进行转换。通过 GeoCoder 类,开发者可以实现将地址解析为经纬度坐标(地理编码),或者将经纬度坐标解析为地址信息(反地理编码)。

常用方法:

  • **newInstance():**创建 GeoCoder 实例。
  • **setOnGetGeoCodeResultListener():**设置地理编码查询结果监听器。
  • **setOnGetReverseGeoCodeResultListener():**设置反地理编码查询结果监听器。
  • **geocode():**发起地理编码查询,将地址信息转换为经纬度坐标。
  • **reverseGeoCode():**发起反地理编码查询,将经纬度坐标转换为地址信息。

4. LocationClient类:

LocationClient 类是百度定位SDK提供的核心类,用于实现设备的定位功能。通过 LocationClient 类,开发者可以获取设备的当前位置信息,包括经纬度坐标、速度、方向等。

常用方法:

  • **registerLocationListener():**注册定位监听器。
  • **start():**开始定位。
  • **stop():**停止定位。

5. RoutePlanSearch类:

RoutePlanSearch 类是百度地图SDK提供的路线规划搜索类,用于实现不同交通方式的路线规划功能。通过 RoutePlanSearch 类,开发者可以根据起点和终点的坐标,进行驾车、步行、公交等多种交通方式的路线规划,并获取详细的路线信息。

常用方法:

  • setOnGetRoutePlanResultListener():设置路径规划结果监听器。
  • **drivingSearch():**发起驾车路线规划。
  • **walkingSearch():**发起步行路线规划。
  • **transitSearch():**发起公交路线规划。

6.LatLng 类:

LatLng 类是百度地图SDK提供的一个表示经纬度坐标的类。它用于存储地理位置的经度和纬度信息,并提供了一些方法来获取和设置经纬度值。

常用方法:

  • **latitude():**获取纬度值。
  • **longitude():**获取经度值。
  • **equals(LatLng other):**判断当前 LatLng 对象是否与另一个 LatLng 对象相等。
  • **toString():**返回 LatLng 对象的字符串表示。

7. PoiSearch 类:

PoiSearch 类是百度地图SDK提供的一个兴趣点搜索类,用于实现地图上的兴趣点检索功能。通过 PoiSearch 类,开发者可以根据关键词、地理位置等条件进行兴趣点的搜索,并获取相关的搜索结果。

常用方法:

  • **newInstance():**创建 PoiSearch 实例。
  • **searchInCity(PoiCitySearchOption option):**在指定城市内搜索兴趣点。需要创建一个 PoiCitySearchOption 对象,并设置要搜索的城市名称、关键词等参数,然后调用该方法进行搜索。
  • **searchNearby(PoiNearbySearchOption option):**在指定位置附近搜索兴趣点。需要创建一个 PoiNearbySearchOption 对象,并设置中心点坐标、搜索半径、关键词等参数,然后调用该方法进行搜索。
  • **searchInBound(PoiBoundSearchOption option):**在指定矩形区域内搜索兴趣点。需要创建一个 PoiBoundSearchOption 对象,并设置矩形区域的左下角和右上角坐标、关键词等参数,然后调用该方法进行搜索。
  • **setOnGetPoiSearchResultListener(OnGetPoiSearchResultListener listener):**设置兴趣点搜索结果的监听器。需要实现 OnGetPoiSearchResultListener 接口,并将其注册给 PoiSearch 对象,以接收搜索结果的回调。
  • **searchPoiDetail(PoiDetailSearchOption option):**根据兴趣点的 UID 获取详细信息。需要创建一个 PoiDetailSearchOption 对象,并设置兴趣点的 UID,然后调用该方法进行详情查询。
  • **searchPoiIndoor(PoiIndoorOption option):**在室内地图中搜索兴趣点。需要创建一个 PoiIndoorOption 对象,并设置室内ID、关键词等参数,然后调用该方法进行搜索。
  • searchPoiPage(int pageNum) 加载下一页的搜索结果。需要指定要加载的页码,通过设置之前的搜索选项对象的 pageNum 属性来实现分页加载。
  • **destroy():**销毁 PoiSearch 对象,释放相关资源。

8.PoiResult 类:

PoiResult 类是百度地图SDK中的一个类,用于表示兴趣点搜索的结果集。它包含了符合搜索条件的一组兴趣点数据,并提供了相关的方法来获取和操作这些数据。

  • getAllPoi():获取搜索到的所有结果。
  • error:表示搜索结果的错误码。

9.PoiInfo 类:

PoiInfo 类是百度地图SDK中的一个类,用于表示兴趣点的信息。它包含了兴趣点的名称、地址、经纬度坐标等详细信息,并提供了相关的方法来获取和操作这些数据。

  • name:POI 名称。
  • address:POI 地址。

10.PoiOverlay 类:

PoiOverlay 类是百度地图SDK中的一个类,用于在地图上绘制兴趣点标注覆盖物。它可以将 PoiResult 中的兴趣点数据在地图上展示,并提供了一些方法用于自定义标注样式和点击事件处理。

  • setData():设置搜索到的 POI 数据。
  • addToMap():将兴趣点标注添加到地图上。
  • zoomToSpan():缩放地图以适应所有兴趣点。

二、使用例子

例1:获取当前位置:

MainActivity :

java 复制代码
package com.example.location;



import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;

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 com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.model.LatLng;

import com.baidu.mapapi.search.geocode.GeoCoder;

import com.baidu.mapapi.search.poi.PoiSearch;


public class MainActivity extends AppCompatActivity {
    LocationClient mLocationClient;
    MapView mMapView;
    BaiduMap mBaiduMap;
    boolean isFirstLocate = true;
    
    PoiSearch mPoiSearch;
    TextView tv_Lat; // 经度
    TextView tv_Lon; // 纬度
    TextView tv_Add; // 地址
    GeoCoder mGeoCoder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 初始化地图应用
        SDKInitializer.setAgreePrivacy(this.getApplicationContext(), true);
        LocationClient.setAgreePrivacy(true);
        // 初始化百度地图SDK。这个方法必须在使用百度地图相关功能之前调用,否则无法正常使用地图功能。
        SDKInitializer.initialize(this.getApplicationContext());
        setContentView(R.layout.activity_main);
        mMapView = findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        tv_Lat = findViewById(R.id.tv_Lat);
        tv_Lon = findViewById(R.id.tv_Lon);
        tv_Add = findViewById(R.id.tv_Add);
//        search = findViewById(R.id.search);

//        // 初始化 PoiSearch 和 GeoCoder 对象
//        mPoiSearch = PoiSearch.newInstance();
//        mGeoCoder = GeoCoder.newInstance();

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        } else {
            requestLocation();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "没有定位权限!", Toast.LENGTH_SHORT).show();
                    finish();
                } else {
                    requestLocation();
                }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    private void requestLocation() {
        // 定位前初始化
        initLocation();
        // 发起定位
        mLocationClient.start();
    }

    private void initLocation() {
        try {
            mLocationClient = new LocationClient(getApplicationContext());
            mLocationClient.registerLocationListener(new MyLocationListener());

            // 定位客户端操作
            LocationClientOption option = new LocationClientOption();
            // 设置扫描时间
            option.setScanSpan(1000);
            // 设置定位模式
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            option.setIsNeedAddress(true); // 设置需要地址信息
            // 保存定位参数
            mLocationClient.setLocOption(option);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 内部类,百度位置监听器
    private class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            tv_Lat.setText(String.valueOf(bdLocation.getLatitude()));
            tv_Lon.setText(String.valueOf(bdLocation.getLongitude()));
            tv_Add.setText(bdLocation.getAddrStr());
            // GPS 定位或网格定位时
            if (bdLocation.getLocType() == BDLocation.TypeGpsLocation || bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
                navigateTo(bdLocation);
            }
        }

        private void navigateTo(BDLocation bdLocation) {
            if (isFirstLocate) {
                LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
                MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
                // 以动画更新方式,实现对手势引起的地图状态的更新
                mBaiduMap.animateMapStatus(update);
                // 创建自定义标记
                BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.arrow_icon);
                MarkerOptions markerOptions = new MarkerOptions().position(ll).icon(bitmap).anchor(0.5f, 0.5f);
                mBaiduMap.addOverlay(markerOptions);

                isFirstLocate = false;
            }
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mMapView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
        // 释放 PoiSearch 和 GeoCoder 对象
//        mPoiSearch.destroy();
//        mGeoCoder.destroy();
    }

    
}

activity_main:

html 复制代码
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    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"
    tools:context=".MainActivity">

<com.baidu.mapapi.map.MapView
    android:id="@+id/bmapView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"/>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#E0474141"
        >
        
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="12dp"
        android:layout_marginTop="20dp"
        android:orientation="horizontal"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="纬度:"
            android:textColor="#ffffff"
            android:textSize="15dp"
            />
        <TextView
            android:id="@+id/tv_Lat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textColor="#ffffff"
            android:textSize="15sp"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="12dp"
        android:layout_marginTop="10dp"
        android:orientation="horizontal"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="经度:"
            android:textColor="#ffffff"
            android:textSize="15dp"
            />
        <TextView
            android:id="@+id/tv_Lon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textColor="#ffffff"
            android:textSize="15sp"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="12dp"
        android:layout_marginTop="10dp"
        android:orientation="horizontal"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="地址:"
            android:textColor="#ffffff"
            android:textSize="15dp"
            />
        <TextView
            android:id="@+id/tv_Add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textColor="#ffffff"
            android:textSize="15sp"
            />
    </LinearLayout>
    </LinearLayout>
</FrameLayout>

AndroidManifest:

html 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.location">
    <uses-permission android:name="android.permission.ACCESS_COARSE_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.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <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/Theme.UI"

        >
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="你的Key" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <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>

运行结果:

未完待续。。。

相关推荐
rocpp4 小时前
Android 相册选择与拍照接入实践:MediaStore 分页、权限适配与 FileProvider
android
Flynt5 小时前
升级Flutter 3.44,我踩了HCPP和AGP 9的坑
android·flutter·dart
白色牙膏6 小时前
Cocos Creator 2.4.x 接入 AdMob 插件的迁移实践
android
我命由我123457 小时前
C++ - 面向对象 - 常成员函数
android·java·linux·c语言·开发语言·c++·算法
tryqaaa_8 小时前
学习日志(四)【php反序列化魔术方法以及pop构造配实战】
android
Java小学生丶9 小时前
记录一下我的 Gradle 开发环境配置过程
android·java·gradle·maven·安卓
问心无愧051310 小时前
ctf show web 入门256
android·前端·笔记
霸道流氓气质10 小时前
MySQL 索引设计实战指南
android·数据库·mysql
R语言爱好者11 小时前
叠氮酸介绍
android
方白羽11 小时前
Android WebView 中实现第三方 QQ 登录的架构与流程详解
android·app