Android开发使用百度地图基础篇(一)
前提条件
首先,你需要去百度地图开放平台下载地图的SDK并申请密钥导入项目使用,至于怎么导入使用,自己查一下资料,实在不懂,评论区见,我是个新手,一起努力吧。
开始学习基础
下面开始讲一个地图基础的内容,获取你的位置,并根据手机的方向显示当前方向。
- 写一个方向传感器的类,用来控制方向。由于方向传感器说被弃用,查阅资料说建议加速度传感器和地磁场传感器使用,经过与原百度地图对比,觉得还是方向传感器比较好用,因此这里还是使用方向传感器。
//集成方向传感器
public class MapOrientation implements SensorEventListener {
private Context context;
private SensorManager sensorManager;
private Sensor sensor;
//监听方向
private OnOrientionListener onOrientionListener;
private float lastX;
MapOrientation(Context context){
this.context=context;
}
//开始检测
public void start(){
//获得传感器管理器
sensorManager=(SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
if (sensorManager!=null){
//获得方向传感器
sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}
if (sensor!=null){
//注册
sensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_FASTEST);
}
}
//停止检测、
public void stop(){
sensorManager.unregisterListener(this);
}
//传感器发生改变时调用
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
//判断传感器监控是否使方向传感器
if (sensorEvent.sensor.getType()==Sensor.TYPE_ORIENTATION){
//x/SensorManager.DATA_X指方位,0表示北,90表示东
//y/SensorManager.DATA_Y值表示倾斜度,或手机翘起的程度。
z/SensorManager.DATA_Z值表示手机沿着Y轴的滚动角度。表示手机沿着Y轴的滚动角度。取值范围是-90≤z值≤90。
float x=sensorEvent.values[SensorManager.DATA_X];
//判断如果精度变化大于1.0就变化
if (Math.abs(x-lastX)>1.0){
onOrientionListener.onOrientionChanged(x);
}
lastX=x;
}
}
public interface OnOrientionListener{
void onOrientionChanged(float x);
}
//设置方向监听
public void setOnOrientionListener(OnOrientionListener onOrientionListener) {
this.onOrientionListener = onOrientionListener;
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
- 在应用程序创建时初始化 SDK引用的Context 是全局变量。
注意:在SDK各功能组件使用之前都需要调用SDKInitializer.initialize(getAppcationContext()),因此我们建议该方法放在Application的初始化方法中。也就是说在android应用配置文件中的Application中使用android:name=".继承Application的一个类"。
public class DemoApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
SDKInitializer.initialize(this);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
}
}
- 最后呢就到实际的使用了,下面会有详细的注释
public class MainActivity extends Activity {
//百度地图提供的一个地图组件,类似TextView这种东西
private MapView mMapView = null;
private BaiduMap mBaiduMap=null;
//类似与把使用地图的当成一个客户端,定义定位客户端 ,配置定位所需要的参数。
public LocationClient mLocationClient;
//位置监听器
public MyAbsLocationListener myAbsLocationListener=new MyAbsLocationListener();
//LatLng是以纬度和经度表示的地理坐标点
private LatLng latLng;
//封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。
private BDLocation bdLocation;
private boolean isFirstLoc = true; // 是否首次定位
private TextView textView;
//方向传感器监听
private MapOrientation mapOrientation;
//通过lastX设置方向
public static float lastX;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
textView=(TextView)findViewById(R.id.tv);
mBaiduMap=mMapView.getMap();
bdLocation=new BDLocation();
//设置地图类型普通、卫星
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类
//配置定位SDK参数
initLocation();
initMyLoc();
mapOrientation.start();
mLocationClient.registerLocationListener(myAbsLocationListener); //注册监听函数
//开启定位
mLocationClient.start();
// //图片点击事件,回到定位点
mLocationClient.requestLocation();
}
//配置定位SDK参数,额外的设置,就给你看看各个参数设置
private void initLocation() {
//设置定位图标
BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.fromResource(R.drawable.mylocationc);
MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, bitmapDescriptor);
mBaiduMap.setMyLocationConfiguration(config);
//可以理解为这个对象可以对用户的定位进行各种设置
LocationClientOption option = new LocationClientOption();
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选,默认gcj02,设置返回值坐标类型bd09ll表示百度经纬度坐标,gcj02表示经过国测局加密的坐标,wgs84表示gps获取的坐标
option.setCoorType("bd09ll");
int span = 1000;
//可选,默认0,即仅定位一次,小于1000也会定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setScanSpan(span);
//可选,设置是否需要地址信息,默认不需要
option.setIsNeedAddress(true);
//可选,默认false,设置是否使用gps
option.setOpenGps(true);
//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
option.setLocationNotify(true);
//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationDescribe(true);
//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIsNeedLocationPoiList(true);
//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.setIgnoreKillProcess(false);
//可选,默认false,设置是否收集CRASH信息,默认收集
option.SetIgnoreCacheException(false);
//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
option.setEnableSimulateGps(false);
//对用户定位设置
mLocationClient.setLocOption(option);
}
//用点类似与OnClickListener,其实就是一个用户位置的监听类,由于BDLocationListener被划横线,最后找到这个可以代替
public class MyAbsLocationListener extends BDAbstractLocationListener{
//可以理解位onCLick,理解是每次定位请求时调用这个方法
@Override
public void onReceiveLocation(BDLocation location) {
//BDLocation参数就是请求用户定位的位置
//获取当前位置经纬度
latLng = new LatLng(location.getLatitude(), location.getLongitude());
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(lastX).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
//textview添加文字
textView.setText(location.getLocationDescribe());
//构建文字Option对象,用于在地图上添加文字
// OverlayOptions textOption = new TextOptions()
// .fontSize(24)
// .fontColor(0xFFFF00FF)
// .text(location.getLocationDescribe())
// .position(latLng);
//
// //在地图上添加该文字对象并显示
// mBaiduMap.addOverlay(textOption);
// 当不需要定位图层时关闭定位图层//mBaiduMap.setMyLocationEnabled(false);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
if (location.getLocType() == BDLocation.TypeGpsLocation) {
// GPS定位结果
Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
// 网络定位结果
Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
// 离线定位结果
Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeServerError) {
Toast.makeText(MainActivity.this, "服务器错误,请检查", Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
Toast.makeText(MainActivity.this, "网络错误,请检查", Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
Toast.makeText(MainActivity.this, "手机模式错误,请检查是否飞行", Toast.LENGTH_SHORT).show();
}
}
}
}
private void initMyLoc() {
//方向传感器监听
mapOrientation = new MapOrientation(this);
mapOrientation.setOnOrientionListener(new MapOrientation.OnOrientionListener() {
@Override
public void onOrientionChanged(float x) {
lastX=x;
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
mapOrientation.stop();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}
接下来就是xml文件,很简单。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="地址信息"
android:id="@+id/tv"
android:textColor="@color/colorPrimaryDark"
android:textSize="20sp"/>
</FrameLayout>
好了,以上就完成了正常的定位功能,注释多了看起来代码有点多,有什么疑问可以提出来,有什么写的不对的也可以提出来。