Android:百度地图定位,完整代码奉上

接着上一篇blog,SDK开发包自己选择有定位和导航的,so库这种怎么导入,略过!



直接上代码:



一、Java 

package example.com.baidumap_test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
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.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

public class DingWeiActivity extends Activity implements BDLocationListener {

    /*
     百度Demo 参考,后续优化:图标显示可以改为罗盘,用一个线程更新坐标方向
        http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/location
     */

    private BaiduMap mBaiduMap;
    private MapView mMapView;
    public LocationClient mLocationClient = null;
    private boolean isFirstLoc = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        //注意该方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_ding_wei);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类
        mLocationClient.registerLocationListener(this);//注册监听函数
        initLocation();
        // 开启定位图层
        mBaiduMap = mMapView.getMap();
        mBaiduMap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flase
        mLocationClient.start();//开启定位
    }

    //LocationClientOption类,该类用来设置定位SDK的定位方式
    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
        );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
        option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
        int span = 1000;
        option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
        option.setOpenGps(true);//可选,默认false,设置是否使用gps
        option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
        option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
        option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
        mLocationClient.setLocOption(option);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
        mLocationClient.stop();//关闭定位
        mBaiduMap.setMyLocationEnabled(false);
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }

    @Override
    public void onReceiveLocation(BDLocation location) {

        MyLocationData locData = new MyLocationData.Builder()
                .accuracy(location.getRadius())
                // 此处设置开发者获取到的方向信息,顺时针0-360
                .direction(100).latitude(location.getLatitude())
                .longitude(location.getLongitude()).build();
        // 设置定位数据
        mBaiduMap.setMyLocationData(locData);
        if (isFirstLoc) {
            LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
            MapStatusUpdate update = MapStatusUpdateFactory.newLatLngZoom(ll, 16);//设置地图中心及缩放级别
            mBaiduMap.animateMapStatus(update);
            isFirstLoc = false;
            Toast.makeText(getApplicationContext(), location.getAddrStr(), Toast.LENGTH_SHORT).show();
        }


    }
}

二、xml


扫描二维码关注公众号,回复: 1630249 查看本文章
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="example.com.baidumap_test.DingWeiActivity">

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

</LinearLayout>


三、bulid.gradle


apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "example.com.baidumap_test"
        minSdkVersion 23
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        sourceSets {
            main() {
                jniLibs.srcDirs = ['libs']
            }
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile files('libs/BaiduLBS_Android.jar')
}

四、AndroidManifest.xml


除了写 key,还有这个 service识别,不加就没有定位效果!

 <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="NiqY4N72OM8SQtopGhFRj8FkRg9pNEGC" />

        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" />

——————————————————————————————

如果想做的更好,那可以加一个线程,修改图标,

做方向感的辨认

一、

自定义定位模式、定位图标、精度圈颜色

MyLocationConfiguration通过重载构造方法 :

MyLocationConfiguration(LocationMode mode,
                        boolean enableDirection,
                        BitmapDescriptor customMarker,
                        int accuracyCircleFillColor,
                        int accuracyCircleStrokeColor)

用于设置定位的属性,包括定位模式、是否开启方向、设置自定义定位图标、精度圈填充颜色,精度圈边框颜色。更详细信息,请检索类参考

定位模式

地图SDK支持三种定位模式:NORMAL(普通态), FOLLOWING(跟随态), COMPASS(罗盘态)

mCurrentMode = LocationMode.FOLLOWING;//定位跟随态
mCurrentMode = LocationMode.NORMAL;   //默认为 LocationMode.NORMAL 普通态
mCurrentMode = LocationMode.COMPASS;  //定位罗盘态

自定义定位图标

支持自定义定位图标样式,替换定位icon

mCurrentMarker = BitmapDescriptorFactory .fromResource(R.drawable.icon_geo);

自定义精度圈填充颜色

accuracyCircleFillColor = 0xAAFFFF88;//自定义精度圈填充颜色

自定义精度圈边框颜色

accuracyCircleStrokeColor = 0xAA00FF00;//自定义精度圈边框颜色

定位精度圈大小

定位精度圈大小 ,是根据当前定位精度自动控制的,无法手动控制大小。精度圈越小,代表当前定位精度越高;反之圈越大,代表当前定位精度越低。

定位指针方向

定位指针朝向,是通过获取手机系统陀螺仪数据,控制定位指针的方向,需要开发者自己实现,并不在地图实现范畴。

在定义了以上属性之后,需要通过下面方法设置:

mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(
                            mCurrentMode, true, mCurrentMarker,
                            accuracyCircleFillColor, accuracyCircleStrokeColor));

百度地图定位的SDK Demo奉上:

百度地图定位 SDK







猜你喜欢

转载自blog.csdn.net/ssh159/article/details/78609690