骑行应用开发《五》百度地图定位

来源:互联网 发布:adobe xd cc mac 编辑:程序博客网 时间:2024/05/22 16:00

百度地图定位算是比较简单的,用了百度地图官网的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>

我加上了一个方向传感器,值得注意的是定位时间不要过于频繁,我一般都是四到六秒

1 0