Android--百度地图定位功能的具体实现<百度地图SDK版本 v3.7.3>

以下是Activity中的Fragment使用百度地图定位的具体实现,此代码同样可用于在Activity中直接使用,具有同样的实现效果。
请在真机环境下运行,模拟器运行会无法正确定位。

package com.example.fragmentviewpager;

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.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.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/* 使用之前,导入百度地图SDK,获取APP的密钥,申请定位所需要的权限 此步骤参考百度地图SDK使用文档 */

public class Fragment03 extends Fragment {
    //该fragment的view
    View mView;
    //百度地图控件
    MapView mMapView = null;
    //百度地图
    BaiduMap mBaiduMap;
    //定位客户端
    LocationClient client;
    //定位监听器
    MyBDLocationListener listner;


    public Fragment03() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext 
        //如果在activity中,注意该方法要再setContentView方法之前实现 
        SDKInitializer.initialize(getActivity().getApplicationContext());
        mView = inflater.inflate(R.layout.fragment_fragment03, container, false);
        mMapView = (MapView) mView.findViewById(R.id.bMapView);//获取地图控件
        mBaiduMap = mMapView.getMap();//获取地图
        //百度地图中位图工具,可自定义一些覆盖物和标记点的图标
        BitmapDescriptor bitmap = BitmapDescriptorFactory
                .fromResource(R.drawable.point_blue);

        mBaiduMap.setMyLocationEnabled(true);//打开定位图层
        //设置定位配置
        MyLocationConfiguration config = new MyLocationConfiguration(
                com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL,
                /*定位模式*/ 
                false, /*箭头方向是否和手机一致*/
                bitmap);//定位点的图标,null为默认的蓝点
        //地图中使用定位配置
        mBaiduMap.setMyLocationConfigeration(config);
        //初始化定位客户端
        client = new LocationClient(getActivity());
        //定位客户点参数
        LocationClientOption option = new LocationClientOption();
        //定位客户端参数设定,更多参数设置,查看百度官方文档
        option.setLocationMode(LocationMode.Hight_Accuracy);// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
        option.setScanSpan(5000);//每隔5秒发起一次定位
        option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系,注意:这里是“BD09LL”,不是“BD0911”,类型选错定位会不准确
        option.setOpenGps(true);//是否打开gps
        option.setIsNeedLocationDescribe(true);
        /*可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” 该参数若不设置,则在4G状态下,会出现定位失败,将直接定位到天安门广场 */
        //定位客户端使用参数
        client.setLocOption(option);
        listner = new MyBDLocationListener();//初始化定位监听器
        client.registerLocationListener(listner);//客户端注册监听器
        client.start();//发起定位请求

        return mView;
    }

    //自定义的监听器要实现百度地图SDK中的BDLocationListener
    private class MyBDLocationListener implements BDLocationListener{

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location==null || mMapView == null) {
                return;
            }
            //定位点数据建立者
            MyLocationData.Builder builder = new MyLocationData.Builder(); 
            builder.accuracy(location.getRadius());//设置定位点的半径
            builder.latitude(location.getLatitude());//获取纬度
            builder.longitude(location.getLongitude());//获取经度
            MyLocationData data = builder.build();//创建定位点数据
            //地图中引入定位点数据,可对该数据进行定位
            mBaiduMap.setMyLocationData(data);
            //创建定位点的点对象
            LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
            //获取中心点
            MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll );
            //移动屏幕中心点
            mBaiduMap.animateMapStatus(msu);
            // 到此定位成功,没有必要反复定位
            // 应该停止客户端再发送定位请求
            if (client.isStarted()) {
                client.unRegisterLocationListener(listener);
                client.stop();
            }

        }

    }

    @Override
    public void onResume() {
        //在组件生命周期中,同样对mMapView的生命周期进行管理
        //如有需要,还要将定位客户端生命周期也进行管理
        mMapView.onResume();
        super.onResume();
    }

    @Override
    public void onPause() {
        // TODO Auto-generated method stub
        mMapView.onPause();
        super.onPause();
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        client.stop();
        mMapView.onDestroy();
        super.onDestroy();
    }

Fragment03的布局xml文件,需要使用百度地图SDK的MapView

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.fragmentviewpager.Fragment03" >

    <!-- TODO: Update blank fragment layout -->

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

</FrameLayout>

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