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

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笑而过的CSDN博客
y1笑而过的博客园
y1笑而过的新浪博客
y1笑而过的安卓巴士博客
y1笑而过的51CTO技术博客

你可能感兴趣的:(android,定位,百度地图)