以下是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>