Android开发使用百度地图基础篇(一)

Android开发使用百度地图基础篇(一)

前提条件
    首先,你需要去百度地图开放平台下载地图的SDK并申请密钥导入项目使用,至于怎么导入使用,自己查一下资料,实在不懂,评论区见,我是个新手,一起努力吧。
开始学习基础
    下面开始讲一个地图基础的内容,获取你的位置,并根据手机的方向显示当前方向。

  1. 写一个方向传感器的类,用来控制方向。由于方向传感器说被弃用,查阅资料说建议加速度传感器和地磁场传感器使用,经过与原百度地图对比,觉得还是方向传感器比较好用,因此这里还是使用方向传感器。
//集成方向传感器
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) {

    }

  1. 在应用程序创建时初始化 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);
    }
}
  1. 最后呢就到实际的使用了,下面会有详细的注释
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>

好了,以上就完成了正常的定位功能,注释多了看起来代码有点多,有什么疑问可以提出来,有什么写的不对的也可以提出来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值