//布局文件
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
/>
android:id="@+id/tv_location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="位置:你去哪儿了"
android:layout_centerInParent="true"/>
public class Second
extends AppCompatActivity {
private TextView
text
;
private MapView
mapView
;
private BaiduMap
baiduMap
;
Boolean
isFirstLoc=
true;
public LocationClient
mLocationClient =
null;
public BDLocationListener
myListener =
new MyLocationListener()
;
@Override
protected void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
;
SDKInitializer.
initialize(getApplicationContext())
;
setContentView(R.layout.
first)
;
mapView = (MapView) findViewById(R.id.
bmapView)
;
text = (TextView) findViewById(R.id.
tv_location)
;
//获取地图
baiduMap =
mapView.getMap()
;
//开启定位图层
baiduMap.setMyLocationEnabled(
true)
;
mLocationClient =
new LocationClient(getApplicationContext())
;
//注册监听函数
mLocationClient.registerLocationListener(
myListener)
;
initLocation()
;
mLocationClient.start()
;
}
public class MyLocationListener
implements BDLocationListener {
@Override
public void
onReceiveLocation(BDLocation location) {
//获取定位结果
StringBuffer sb =
new StringBuffer(
256)
;
sb.append(
"time : ")
;
sb.append(location.getTime())
;
//获取定位时间
sb.append(
"
\n
error code : ")
;
sb.append(location.getLocType())
;
//获取类型类型
sb.append(
"
\n
latitude : ")
;
sb.append(location.getLatitude())
;
//获取纬度信息
sb.append(
"
\n
lontitude : ")
;
sb.append(location.getLongitude())
;
//获取经度信息
sb.append(
"
\n
radius : ")
;
sb.append(location.getRadius())
;
//获取定位精准度
//---------------------将地图跟定位关联起来----------------------------------------
MyLocationData locData =
new MyLocationData.Builder() .accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(
100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build()
;
// 设置定位数据
baiduMap.setMyLocationData(locData)
;
if (
isFirstLoc) {
isFirstLoc =
false;
LatLng ll =
new LatLng(location.getLatitude()
,
location.getLongitude())
;
MapStatus.Builder builder =
new MapStatus.Builder()
;
builder.target(ll).zoom(
18.0f)
;
baiduMap.animateMapStatus(MapStatusUpdateFactory.
newMapStatus(builder.build()))
;
}
//---------------------将地图跟定位关联起来----------------------------------------
if (location.getLocType() == BDLocation.
TypeGpsLocation) {
// GPS定位结果
sb.append(
"
\n
speed : ")
;
sb.append(location.getSpeed())
;
// 单位:公里每小时
sb.append(
"
\n
satellite : ")
;
sb.append(location.getSatelliteNumber())
;
//获取卫星数
sb.append(
"
\n
height : ")
;
sb.append(location.getAltitude())
;
//获取海拔高度信息,单位米
sb.append(
"
\n
direction : ")
;
sb.append(location.getDirection())
;
//获取方向信息,单位度
sb.append(
"
\n
addr : ")
;
sb.append(location.getAddrStr())
;
//获取地址信息
sb.append(
"
\n
describe : ")
;
sb.append(
"gps定位成功")
;
}
else if (location.getLocType() == BDLocation.
TypeNetWorkLocation) {
// 网络定位结果
sb.append(
"
\n
addr : ")
;
sb.append(location.getAddrStr())
;
//获取地址信息
sb.append(
"
\n
operationers : ")
;
sb.append(location.getOperators())
;
//获取运营商信息
sb.append(
"
\n
describe : ")
;
sb.append(
"网络定位成功")
;
}
else if (location.getLocType() == BDLocation.
TypeOffLineLocation) {
// 离线定位结果
sb.append(
"
\n
describe : ")
;
sb.append(
"离线定位成功,离线定位结果也是有效的")
;
}
else if (location.getLocType() == BDLocation.
TypeServerError) { sb.append(
"
\n
describe : ")
;
sb.append(
"服务端网络定位失败,可以反馈IMEI号和大体定位时间到[email protected],会有人追查原因")
;
}
else if (location.getLocType() == BDLocation.
TypeNetWorkException) { sb.append(
"
\n
describe : ")
;
sb.append(
"网络不同导致定位失败,请检查网络是否通畅")
;
}
else if (location.getLocType() == BDLocation.
TypeCriteriaException) { sb.append(
"
\n
describe : ")
;
sb.append(
"无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机")
;
} sb.append(
"
\n
locationdescribe : ")
;
sb.append(location.getLocationDescribe())
;
//位置语义化信息
final List
list = location.getPoiList()
;
// POI数据
if (list !=
null) { sb.append(
"
\n
poilist size = : ")
;
sb.append(list.size())
;
for (Poi p : list) { sb.append(
"
\n
poi= : ")
;
sb.append(p.getId() +
" " + p.getName() +
" " + p.getRank())
;
} }
//此方法运行在子线程
runOnUiThread(
new Runnable() {
@Override
public void
run() {
text.setText(
list.get(
2).getName())
;
} })
;
Log.
i(
"BaiduLocationApiDem"
, sb.toString() +
",目前位置:" + list.get(
2).getName())
;
}
@Override
public void
onConnectHotSpotMessage(String s
, int i) { } }
private void
initLocation() { LocationClientOption option =
new LocationClientOption()
;
option.setLocationMode(LocationClientOption.LocationMode.
Hight_Accuracy)
;
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType(
"bd09ll")
;
//可选,默认gcj02,设置返回的定位结果坐标系
int span =
1000
;
option.setScanSpan(span)
;
//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(
true)
;
//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(
true)
;
//可选,默认false,设置是否使用gps
option.setLocationNotify(
true)
;
//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
option.setIsNeedLocationDescribe(
true)
;
//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(
true)
;
//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(
false)
;
//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException(
false)
;
//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(
false)
;
//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
mLocationClient.setLocOption(option)
;
}}