百度地图定位算是比较简单的,用了百度地图官网的api,jar包,还有例子,在上面修修改改就可以了,我这里只有一个activity,代码有注释
package zoombigimage.com.mokeride;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.baidu.android.common.logging.Log;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
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.MapStatus;
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 zoombigimage.com.mokeride.uitl.OrientationListener;
public class MyLocationActivity extends Activity implements View.OnClickListener, BDLocationListener, OrientationListener.OnOrientationListener {
private MapView mMapView = null;
private TextView mMapNormal;
private TextView mMapSate;
private BaiduMap mBaiduMap;
private BitmapDescriptor mCurrentMarker;
/**
* 当前定位的模式
*/
private MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
private LocationClient mLocationClient;
private double mCurrentLongitude;
private double mCurrentLantitude;
private boolean isFristLocation = true;
private OrientationListener mOrientationListener;
private int mXDirection;
private float mCurrentAccracy;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_my_location);
initMyLocation();
initOritationListener();
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mMapNormal = (TextView) findViewById(R.id.normal);
mMapSate = (TextView) findViewById(R.id.satellite);
mMapNormal.setOnClickListener(this);
mMapSate.setOnClickListener(this);
mBaiduMap = mMapView.getMap();
//普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//开启交通图
mBaiduMap.setTrafficEnabled(true);
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(mBaiduMap.getMaxZoomLevel()).build()));
}
private void initMyLocation() {
// 定位初始化
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(this);
// 设置定位的相关配置
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(10000); //设置发起定位请求的间隔时间为5000ms
mLocationClient.setLocOption(option);
}
@Override
protected void onDestroy() {
super.onDestroy();
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.unRegisterLocationListener(this);
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
if (mMapView != null) {
mMapView.onResume();
}
}
@Override
protected void onStop() {
mLocationClient.stop();
mOrientationListener.stop();
super.onStop();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onStart() {
// 开启图层定位
mBaiduMap.setMyLocationEnabled(true);
if (!mLocationClient.isStarted()) {
mLocationClient.start();
}
mOrientationListener.start();
super.onStart();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.normal:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
break;
case R.id.satellite:
//卫星地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
}
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(mBaiduMap.getMaxZoomLevel()).build()));
}
@Override
public void onReceiveLocation(BDLocation location) {
//开启定位图层
mBaiduMap.setMyLocationEnabled(true);
mCurrentAccracy = location.getRadius();
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
mCurrentLantitude = location.getLatitude();
mCurrentLongitude = location.getLongitude();
// 设置定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标)
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.ihz);
MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
mBaiduMap.setMyLocationConfigeration(config);
// 第一次定位时,将地图位置移动到当前位置
if (isFristLocation) {
isFristLocation = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
}
}
/**
* 初始化方向传感器
*/
private void initOritationListener() {
mOrientationListener = new OrientationListener(getApplicationContext());
mOrientationListener.setOnOrientationListener(new OrientationListener.OnOrientationListener() {
@Override
public void onOrientationChanged(float x) {
mXDirection = (int) x;
Log.e("initOritationListener","initOritationListener === " + mXDirection);
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(mCurrentAccracy)
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(mXDirection)
.latitude(mCurrentLantitude)
.longitude(mCurrentLongitude).build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
// 设置自定义图标
BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.oritention);
MyLocationConfiguration config = new MyLocationConfiguration(
mCurrentMode, true, mCurrentMarker);
mBaiduMap.setMyLocationConfigeration(config);
}
});
}
@Override
public void onOrientationChanged(float x) {
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
>
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/normal"
android:text="街道视图"
android:padding="10dp"
android:layout_marginRight="10dp"
android:background="#96325874"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/satellite"
android:text="卫星视图"
android:padding="10dp"
android:background="#96325874"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</FrameLayout>
我加上了一个方向传感器,值得注意的是定位时间不要过于频繁,我一般都是四到六秒