import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MapFragment extends Fragment {
static MapView mMapView = null;
private MapController mMapController = null;
// 定位相关
LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
MyLocationOverlay myLocationOverlay = null;
LocationData locData = null;
static MapFragment newInstance() {
MapFragment f = new MapFragment();
return f;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DemoApplication app = (DemoApplication) getActivity().getApplication();
if (app.mBMapManager == null) {
app.mBMapManager = new BMapManager(getActivity());
app.mBMapManager.init(DemoApplication.strKey, new DemoApplication.MyGeneralListener());
}
// LocationClient just init once;
// start() is moved
mLocClient = new LocationClient(getActivity());
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
// option.setScanSpan(5000); //设置发起定位请求的间隔时间,单位毫秒
mLocClient.setLocOption(option);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.activity_locationoverlay, container, false);
mMapView = (MapView) v.findViewById(R.id.bmapView);
mMapController = mMapView.getController();
mMapView.getController().setZoom(14);
mMapView.getController().enableClick(true);
mMapView.setBuiltInZoomControls(true);
myLocationOverlay = new MyLocationOverlay(mMapView);
locData = new LocationData();
myLocationOverlay.setData(locData);
mMapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableCompass();
mMapView.refresh();
return v;
}
/**
* 监听函数,有新位置的时候,格式化成字符串,输出到屏幕中
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null)
return;
costTime = System.currentTimeMillis() - startTime;
Log.d("MapFragment", "" + costTime);
locData.latitude = location.getLatitude();
locData.longitude = location.getLongitude();
locData.accuracy = location.getRadius();
locData.direction = location.getDerect();
myLocationOverlay.setData(locData);
mMapView.refresh();
mMapController.animateTo(new GeoPoint((int) (locData.latitude * 1e6), (int) (locData.longitude * 1e6)));
// if request location success , stop it
stopRequestLocation();
}
public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null) {
return;
}
}
}
/**
* warning: this method is callback by activity manager; Be careful it's
* lifecycle : It is called after oncreate , before oncreateview; see
* detail:
* http://developer.android.com/reference/android/support/v4/app/Fragment
* .html#setUserVisibleHint(boolean)
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) { //核心方法,避免因Fragment跳转导致地图崩溃
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser == true) {
// if this view is visible to user, start to request user location
startRequestLocation();
} else if (isVisibleToUser == false) {
// if this view is not visible to user, stop to request user
// location
stopRequestLocation();
}
}
private void stopRequestLocation() {
if (mLocClient != null) {
mLocClient.unRegisterLocationListener(myListener);
mLocClient.stop();
}
}
long startTime;
long costTime;
private void startRequestLocation() {
// this nullpoint check is necessary
if (mLocClient != null) {
mLocClient.registerLocationListener(myListener);
mLocClient.start();
mLocClient.requestLocation();
startTime = System.currentTimeMillis();
}
}
@Override
public void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
public void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
public void onDestroy() {
if (mLocClient != null)
mLocClient.stop();
mMapView.destroy();
super.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
}