前言:有时候,我们活得很累,并非生活过于刻薄,而是我们太容易被外界的氛围所感染,被他人的情绪所左右。行走在人群中,我们总是感觉有无数穿心掠肺的目光,有很多飞短流长的冷言,最终乱了心神,渐渐被缚于自己编织的一团乱麻中。

好消息是五月份终于要过去了······课实在太多了,上的头都大了······
先来看看运行效果:
1.普通模式:                             2.实时路况:                                3.罗盘模式:
普通模式    实时路况      罗盘模式
4.卫星模式:由于我的位置是旅顺,是敏感城市所以卫星图像百度不予以显示,在其他地方是可以正常显示的
卫星模式

一、申请秘钥

在使用百度地图SDK为您提供的各种LBS能力之前,您需要获取百度地图移动版的开发密钥,该密钥与您的百度账户相关联。因此,您必须先有百度帐户,才能获得开发密钥。并且,该密钥与您创建的过程名称有关。

二、下载相关SDK:

1.百度地图SDK:
2.百度定位SDK:

三、环境配置

第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,工程会自动加载src目录下的so动态库,放入libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。
第二步:工程配置还需要把jar包集成到自己的工程中,放入libs目录下。对于每个jar文件,右键-选择Add As Library,导入到工程中。对应在build.gradle生成工程所依赖的jar文件说明,具体配置为下图:
环境配置
第三步:
(1)在application中添加开发密钥和默认服务
<meta-data    
         android:name="com.baidu.lbsapi.API_KEY"    
         android:value="开发者 key" />    
        <service  
            android:name="com.baidu.location.f"  
            android:enabled="true"  
            android:process=":remote">  
        </service>  
(2)添加所需权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
<uses-permission android:name="android.permission.INTERNET"/>  
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />  
<uses-permission android:name="android.permission.WAKE_LOCK"/>  
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
<uses-permission android:name="android.permission.GET_TASKS" />  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
<uses-permission android:name="android.permission.WRITE_SETTINGS" />  

(3)布局文件中添加地图控件

<com.baidu.mapapi.map.MapView  
    android:id="@+id/id_bmapView"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:clickable="true" />  

四、实现结构:

1.MylocationListener负责定位操作
2.MyOrientationListener负责定位图标与方向传感器相结合

五、具体实现:

1.初始化 SDK引用的Context 全局变量:
@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    SDKInitializer.initialize(getApplicationContext());  
    setContentView(R.layout.activity_main);  
}  
2.生命周期的匹配:
@Override  
protected void onStop() {  
    super.onStop();  
    //停止定位  
    mBaiduMap.setMyLocationEnabled(false);  
    mlocationClient.stop();  
    myOrientationListener.stop();  
}  
  
@Override  
protected void onResume() {  
    super.onResume();  
    mMapView.onResume();  
}  
  
@Override  
protected void onPause() {  
    super.onPause();  
    mMapView.onPause();  
}  
  
@Override  
protected void onDestroy() {  
    super.onDestroy();  
    mMapView.onDestroy();  
}  
3.定位操作实现:
public class MylocationListener implements BDLocationListener
    {
        //定位请求回调接口
        private boolean isFirstIn=true;
        //定位请求回调函数,这里面会得到定位信息
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            //BDLocation 回调的百度坐标类,内部封装了如经纬度、半径等属性信息
            //MyLocationData 定位数据,定位数据建造器
            /*
            * 可以通过BDLocation配置如下参数
            * 1.accuracy 定位精度
            * 2.latitude 百度纬度坐标
            * 3.longitude 百度经度坐标
            * 4.satellitesNum GPS定位时卫星数目 getSatelliteNumber() gps定位结果时,获取gps锁定用的卫星数
            * 5.speed GPS定位时速度 getSpeed()获取速度,仅gps定位结果时有速度信息,单位公里/小时,默认值0.0f
            * 6.direction GPS定位时方向角度
            * */
            mLatitude= bdLocation.getLatitude();
            mLongitude=bdLocation.getLongitude();
            MyLocationData data= new MyLocationData.Builder()
                    .direction(mCurrentX)//设定图标方向
                    .accuracy(bdLocation.getRadius())//getRadius 获取定位精度,默认值0.0f
                    .latitude(mLatitude)//百度纬度坐标
                    .longitude(mLongitude)//百度经度坐标
                    .build();
            //设置定位数据, 只有先允许定位图层后设置数据才会生效,参见 setMyLocationEnabled(boolean)
            mBaiduMap.setMyLocationData(data);
            //配置定位图层显示方式,三个参数的构造器
            /*
            * 1.定位图层显示模式
            * 2.是否允许显示方向信息
            * 3.用户自定义定位图标
            *
            * */
            MyLocationConfiguration configuration
                    =new MyLocationConfiguration(locationMode,true,mIconLocation);
            //设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效,参见 setMyLocationEnabled(boolean)
            mBaiduMap.setMyLocationConfigeration(configuration);
            //判断是否为第一次定位,是的话需要定位到用户当前位置
            if(isFirstIn)
            {
                //地理坐标基本数据结构
                LatLng latLng=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());
                //描述地图状态将要发生的变化,通过当前经纬度来使地图显示到该位置
                MapStatusUpdate msu= MapStatusUpdateFactory.newLatLng(latLng);
                //改变地图状态
                mBaiduMap.setMapStatus(msu);
                isFirstIn=false;
                Toast.makeText(context, bdLocation.getAddrStr(), Toast.LENGTH_SHORT).show();
            }


        }
    }

4.方向传感器与定位图标方向匹配操作:

public class MyOrientationListener implements SensorEventListener{

    private SensorManager mSensorManager;
    private Sensor mSensor;
    private Context mContext;
    private float lastX;
    private OnOrientationListener mOnOrientationListener;

    public MyOrientationListener(Context context)
    {
        this.mContext=context;
    }
    public void start()
    {
        mSensorManager= (SensorManager) mContext
                .getSystemService(Context.SENSOR_SERVICE);
        if(mSensorManager!= null)
        {
            //获得方向传感器
            mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        }
        //判断是否有方向传感器
        if(mSensor!=null)
        {
            //注册监听器
            mSensorManager.registerListener(this,mSensor,SensorManager.SENSOR_DELAY_UI);

        }


    }
    public void stop()
    {
        mSensorManager.unregisterListener(this);

    }
    //方向改变
    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType()==Sensor.TYPE_ORIENTATION)
        {
            float x=event.values[SensorManager.DATA_X];
            if(Math.abs(x-lastX)>1.0)
            {
                if(mOnOrientationListener!=null)
                {
                    mOnOrientationListener.onOrientationChanged(x);
                }
            }
            lastX=x;

        }

    }
    public void setOnOrientationListener(OnOrientationListener listener)
    {
        mOnOrientationListener=listener;
    }

    public interface OnOrientationListener
    {
        void onOrientationChanged(float x);

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

如果你喜欢我的文章欢迎关注我的个人网站:http://www.bubblyyi.com

点击下载BaiduMap-test源码

打赏

One Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注