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;