Android中级篇之基于百度地图Android SDK v3.4.0开发实现定位

本文介绍如何使用百度地图Android SDK v3.4.0实现应用内的地理位置定位功能。通过具体的代码示例,展示了如何初始化地图组件、配置定位选项、解析定位结果及在地图上展示定位位置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android中级篇之基于百度地图Android SDK v3.4.0开发实现定位

我们先来看看我们需要哪些包:
百度地图的包

这几个包都可以在百度地图API官网下载链接
给一个百度地图API官网

package com.jzlg.excellentwifi.activity;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
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 com.jzlg.excellentwifi.R;

import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MapActivity extends BaseActivity {
    private Context context;
    private MapView mMapView;
    private BaiduMap mbaiduMap;
    // 定位相关
    private LocationClient mLocationClient;
    private MyLocationListener mLocationListener;
    private boolean isFirstIn = true;
    private double mLatitude;//纬度
    private double mLongitude;//经度

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 在使用SDK各组件之前初始化context信息,传入ApplicationContext
        // 注意该方法要在setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.layout_map);
        this.context = this;
        // 初始化组件
        initView();
        // 初始化定位
        initLocation();
    }

    // 定位初始化
    private void initLocation() {
        mLocationClient = new LocationClient(this); 
        // 定位监听器
        mLocationListener = new MyLocationListener();
        // 注册
        mLocationClient.registerLocationListener(mLocationListener);
        // 设置一些必要的配置
        setLocationOption();
        mLocationClient.start();
    }

    //定位设置
    private void setLocationOption(){
        LocationClientOption option = new LocationClientOption();
        option.setCoorType("db09ll");// 返回的定位结果是百度经纬度,默认值gcj02
        option.setAddrType("all");//返回的定位结果包含地址信息
        option.setIsNeedAddress(true);// 位置,一定要设置,否则后面得不到地址
        option.setOpenGps(true);// 打开GPS
        option.setScanSpan(10000);// 多长时间进行一次请求
        option.setLocationMode(LocationMode.Battery_Saving);// 网络定位优先
        mLocationClient.setLocOption(option);// 使用设置
    }

    private void initView() {
        // 获取地图控件引用
        mMapView = (MapView) findViewById(R.id.map_bmapView);
        mbaiduMap = mMapView.getMap();

        // 设置地图放大缩小参数
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
        mbaiduMap.setMapStatus(msu);
    }

    // 菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_map, menu);
        return true;
    }

    // 菜单点击方法
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // 普通
        case R.id.map_common:
            mbaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
            break;
        // 卫星
        case R.id.map_site:
            mbaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
            break;
        // 实时
        case R.id.map_traffic:
            // 是否显示了实时地图
            if (mbaiduMap.isTrafficEnabled()) {
                mbaiduMap.setTrafficEnabled(false);
                item.setTitle("实时交通off");
            } else {
                mbaiduMap.setTrafficEnabled(true);
                item.setTitle("实时交通on");
            }
            break;
        case R.id.map_location:
            centerToMyLocation();
            break;

        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

    // 定位到我的位置
    private void centerToMyLocation() {
        LatLng latLng = new LatLng(mLatitude, mLongitude);
        // 设置经纬度
        MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
        mbaiduMap.animateMapStatus(msu);
    }

    @Override
    protected void onDestroy() {
        mLocationClient.stop();
        mbaiduMap.setMyLocationEnabled(false);
        // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
    }

    @Override
    protected void onResume() {
        // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
        super.onResume();
    }

    @Override
    protected void onStart() {
        // 开启定位允许
        mbaiduMap.setMyLocationEnabled(true);
        if (!mLocationClient.isStarted()) {
            mLocationClient.start();
        }
        super.onStart();
    }

    @Override
    protected void onStop() {
        // 停止定位
        mbaiduMap.setMyLocationEnabled(false);
        mLocationClient.stop();
        super.onStop();
    }

    @Override
    protected void onPause() {
        // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
        super.onPause();
    }

    private class MyLocationListener implements BDLocationListener {

        // 定位成功之后的回调
        @Override
        public void onReceiveLocation(BDLocation location) {
            MyLocationData data = new MyLocationData.Builder()// 经度
                    .accuracy(location.getRadius())//
                    .latitude(location.getLatitude())//
                    .longitude(location.getLongitude())//
                    .build();

            //设置我的定位
            mbaiduMap.setMyLocationData(data);

            //取出经纬度
            mLatitude = location.getLatitude();
            mLongitude = location.getLongitude();

            //是否是第一次定位
            if (isFirstIn) {
                LatLng latLng = new LatLng(location.getLatitude(),
                        location.getLongitude());

                // 设置经纬度
                MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);

                mbaiduMap.animateMapStatus(msu);

                isFirstIn = false;
            }

            Toast.makeText(
                    context,
                    "定位成功:纬度" + location.getLatitude() + "经度:"
                            + location.getLongitude() + "地址是:"
                            + location.getAddrStr()+"城市是:"+location.getCity(), 0).show();

        }
    }

}

以上是Activity的代码,下面就是我们的布局文件了
我取名是:layout_map.xml
当然了,大家可以自己取名

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

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

</LinearLayout>

那么说完了布局,我们来看看我们的清单文件AndroidManifest.xml是怎么写的,需要注意哪些事项,呈上我们的清单文件AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jzlg.excellentwifi"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="14" />
    <!-- 以下是使用wifi访问网络所需的权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 使用百度地图所需的权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="qkGCDjO9o5Ey62NINwYra7nS" />

        <!-- 注册MapActivity -->
        <activity android:name="com.jzlg.excellentwifi.activity.MapActivity" >
            <!-- 设置主活动 -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 注册LocationDemo -->
        <activity android:name="com.jzlg.excellentwifi.activity.LocationDemo">

        </activity>

        <!-- 定位服务 -->
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.baidu.location.service_v2.2" />
            </intent-filter>
        </service>
    </application>

</manifest>

这里需要注意的是,wifi访问网络所需的权限百度地图所需权限都需要,之所以我分了两个说明,但是需要全部写上,否则会定位失败!

y1笑而过的优快云博客
y1笑而过的博客园
y1笑而过的新浪博客
y1笑而过的安卓巴士博客
y1笑而过的51CTO技术博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y1笑而过song

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值