版权声明:本文为博主原创文章,欢迎转载,转载请在文章显眼处说明文章出处并给出连接。 https://blog.csdn.net/To_be_Designer/article/details/48685475
这一节我们使用Baidu的定位服务,我们同样要向上一篇博客一样下载Baidu定位的SDK。因为在《Android 位置服务——BaiduMap的使用 》这篇博客中我们已经讲过下载步骤,这里我们不在重复讲解下载的过程,不明白的可以直接去上一篇博客中学习。
这一节的讲解是以上一节中百度地图为基础的,使用的是上一节的项目工程。建议大家先看一下《Android 位置服务——BaiduMap的使用 》。
其实这里的步骤和Baidu定位中提供的文档是差不多的,此处整理的目的只为加深楼主的印象。
Baidu定位环境配置
1. 首先将jar包拷贝到libs文件夹下。
2. 通过Android Studio “File——>Project Structure——>Dependencies”中的File Dependency将我们刚才拷贝的.jar包导入。
3. 其次在main文件夹下创建一个“jniLibs”的文件夹,将包含.so文件的文件夹复制到此处。
4. 配置AndroidManifext.xml.
- 在application标签中声明service组件,每个app拥有自己单独的定位service
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"></service>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="key" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
Baidu定位使用
再次声明下这里使用的项目是基于《Android 位置服务——BaiduMap的使用 》这篇博客的,在此基础上进行定位功能呢的添加。
1.初始化LocationClient类。
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
public void onCreate() {
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener( myListener );
}
2. 配置定位SDK参数。
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy
);
option.setCoorType("bd09ll");
int span=1000;
option.setScanSpan(span);
option.setIsNeedAddress(true);
option.setOpenGps(true);
option.setLocationNotify(true);
option.setIsNeedLocationDescribe(true);
option.setIsNeedLocationPoiList(true);
option.setIgnoreKillProcess(false);
option.SetIgnoreCacheException(false);
option.setEnableSimulateGps(false);
mLocationClient.setLocOption(option);
}
高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;
低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);
仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。
3. 实现BDLocationListener接口,在舰艇中对定位进行处理。这里我们做的处理是在定位处方放置定位符号,并添加连线。
@Override
public void onReceiveLocation(BDLocation location) {
if (location.getLocType() == BDLocation.TypeServerError) {
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
} else {
mTextViewLocation.setText(location.getAddress().address);
currentLongtitude = location.getLongitude();
currentLatitude = location.getLatitude();
mBaiduMap.addOverlay(new MarkerOptions().position(new LatLng(currentLatitude, currentLongtitude))
.icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka)));
LatLng p = new LatLng(currentLatitude, currentLongtitude);
points.add(p);
}
}
}
结果如下:
![这里写图片描述]()
全部代码如下:
public class MainActivity extends Activity implements View.OnClickListener {
private Button mButtonStart;
private Button mButtonOne;
private Button mButtonTwo;
private Button mButtonLine;
private TextView mTextViewLocation;
MapView mMapView = null;
BaiduMap mBaiduMap;
private List<LatLng> points = new ArrayList<LatLng>();
GeoCoder mSearch = null;
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(myListener);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult
.getLocation()));
LatLng p = new LatLng(geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
points.add(p);
String strInfo = String.format("纬度:%f 经度:%f",
geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
Log.d("data", strInfo);
Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
}
});
mButtonStart = (Button) findViewById(R.id.button_start);
mButtonOne = (Button) findViewById(R.id.button_one);
mButtonTwo = (Button) findViewById(R.id.button_two);
mButtonLine = (Button) findViewById(R.id.button_three);
mTextViewLocation = (TextView) findViewById(R.id.textview_location);
mButtonStart.setOnClickListener(this);
mButtonOne.setOnClickListener(this);
mButtonTwo.setOnClickListener(this);
mButtonLine.setOnClickListener(this);
PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, "5CjXwt6IZgRSfYxwA8dtOuG5");
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
);
option.setCoorType("bd09ll");
int span = 1000;
option.setScanSpan(span);
option.setIsNeedAddress(true);
option.setOpenGps(true);
option.setLocationNotify(true);
option.setIsNeedLocationDescribe(true);
option.setIsNeedLocationPoiList(true);
option.setIgnoreKillProcess(false);
option.SetIgnoreCacheException(false);
option.setEnableSimulateGps(false);
mLocationClient.setLocOption(option);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_start:
initLocation();
mLocationClient.start();
break;
case R.id.button_one:
mSearch.geocode(new GeoCodeOption().city("北京市").address("海淀区中关村海龙大厦"));
break;
case R.id.button_two:
mSearch.geocode(new GeoCodeOption().city("北京市").address("西城区西便门"));
break;
case R.id.button_three:
OverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);
mBaiduMap.addOverlay(ooPolyline);
break;
}
}
private double currentLongtitude;
private double currentLatitude;
class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location.getLocType() == BDLocation.TypeServerError) {
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
} else {
mTextViewLocation.setText(location.getAddress().address);
currentLongtitude = location.getLongitude();
currentLatitude = location.getLatitude();
mBaiduMap.addOverlay(new MarkerOptions().position(new LatLng(currentLatitude, currentLongtitude))
.icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka)));
LatLng p = new LatLng(currentLatitude, currentLongtitude);
points.add(p);
}
}
}
}