Android 百度定位SDK

官方文檔:http://lbsyun.baidu.com/index.php?title=android-locsdk

1.獲取AK

發佈版:
keytool -v -list -keystore key.jks
SHA1:A9:7D:70:70:4C:67:83:71:AC:FD:18:6E:EF:9B:08:FF:CF:07:A6:BD
開發版:
keytool -v -list -keystore debug.keystore
SHA1:39:FC:60:2A:FA:CB:BF:6C:79:CA:98:58:C6:2F:F8:58:FE:56:24:2F

2.創建定位測試項目

1)AndroidManifest.xml
增加權限,聲明service和ak鑑權

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_LOGS" >
    </uses-permission>
    <uses-permission android:name="android.permission.VIBRATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.WAKE_LOCK" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_SETTINGS" >
    </uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- 聲明service組件 -->
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
        </service>
        <!-- AK鑑權 -->
        <!-- meta-data需要寫在application中 -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="V57HWvyoHwUYEK15Nws2kAZYvSwWtC2q" />

2)導入項目所需的jar包和so
BaiduLBS_Android.jar
libBaiduMapSDK_base_v4_5_2.so
libBaiduMapSDK_map_v4_5_2.so
liblocSDK7b.so
在app的build.gradle android{}中說明so爲該libs路徑

android {
    ...
    sourceSets {
        main {
            jniLibs.srcDir 'libs'
        }
    }
}

3.定位流程

1)初始化LocationClient類
LocationClient類最好在主線程中聲明,需要Context類型的參數。
Context需要時全進程有效的Context,推薦用getApplicationConext獲取全進程有效的Context

mLocClient = new LocationClient(getApplicationContext());
mLocClient.registerLocationListener(listener);

2)配置SDK參數

LocationClientOption option = new LocationClientOption();
        option.setIsNeedAddress(true);//是否要地址
        option.setOpenGps(true);
        option.setCoorType("bd09ll"); // 設置座標類型
        option.setScanSpan(1000);//可選,默認0,即僅定位一次,設置發起連續定位請求的間隔需要大於等於1000ms纔是有效的
        mLocClient.setLocOption(option);
        mLocClient.start();

3)實現BDAbstractLocationListener接口
Android定位SDK自v7.2版本起,對外提供了Abstract類型的監聽接口BDAbstractLocationListener,用於實現定位監聽。原有BDLocationListener暫時保留,推薦開發者升級到Abstract類型的新監聽接口使用,該接口會異步獲取定位結果

    @Override
        public void onReceiveLocation(BDLocation bdLocation) {

            Log.i("bdmap","定位類型:"+bdLocation.getLocTypeDescription()+"\n"
                            +"緯度:"+bdLocation.getLatitude()+"\n"
                            +"經度:"+bdLocation.getLongitude()+"\n"
                            +"詳細地址:"+bdLocation.getAddrStr()+"\n"
                            +"衛星數目"+bdLocation.getSatelliteNumber());
}
輸出:
I/bdmap: 定位類型:GPS location successful!
緯度:30.555669
經度:104.075068
詳細地址:中國四川省成都市武侯區G213(xxxxxx)
衛星數目4

4.增加Mark

LatLng ll = new LatLng(bdLocation.getLatitude(),
                        bdLocation.getLongitude());
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_openmap_mark);
                // 構建MarkerOption,用於在地圖上添加Marker
                OverlayOptions option = new MarkerOptions()
                        .position(ll) //mark出現的位置
                        .icon(bitmap) //mark圖標
                        .draggable(true);//mark可拖動
                //在地圖上添加Marker並顯示
                mBaiduMap.addOverlay(option);
    //對Marker的點擊事件
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                //獲取marker中的數據
                double lat = marker.getPosition().latitude;
                double log = marker.getPosition().longitude;
                Toast.makeText(getApplication(),
                        "經度"+log+" 緯度"+lat,Toast.LENGTH_LONG)
                        .show();
                return false;
            }
        });

5.Demo

這裏寫圖片描述

public class MainActivity extends AppCompatActivity {
    private MapView mMapView = null;
    private BaiduMap mBaiduMap = null;
    boolean isFirstLoc = true; // 是否首次定位
    LocationClient mLocClient;
    private MyLocationData locData; //定位數據包
    private Marker marker;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        mMapView = (MapView)findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        //設置類型
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(17));
        // 開啓定位圖層
        mBaiduMap.setMyLocationEnabled(true);

        mLocClient = new LocationClient(getApplicationContext());
        mLocClient.registerLocationListener(listener);
        LocationClientOption option = new LocationClientOption();
        option.setIsNeedAddress(true);//是否要地址
        option.setOpenGps(true);
        option.setCoorType("bd09ll"); // 設置座標類型
        option.setScanSpan(1000);//可選,默認0,即僅定位一次,設置發起連續定位請求的間隔需要大於等於1000ms纔是有效的
        mLocClient.setLocOption(option);
        mLocClient.start();
        //對Marker的點擊事件
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                //獲取marker中的數據
                double lat = marker.getPosition().latitude;
                double log = marker.getPosition().longitude;
                Toast.makeText(getApplication(),
                        "經度"+log+" 緯度"+lat,Toast.LENGTH_LONG)
                        .show();
                return false;
            }
        });
        //Map點擊事件,點擊地圖移除marker
        mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                marker.remove();//移除marker
            }

            @Override
            public boolean onMapPoiClick(MapPoi mapPoi) {
                return false;
            }
        });

    }

    /***
     * 定位結果回調,在此方法中處理定位結果
     */
    BDAbstractLocationListener listener = new BDAbstractLocationListener() {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {

            Log.i("bdmap","定位類型:"+bdLocation.getLocTypeDescription()+"\n"
                            +"緯度:"+bdLocation.getLatitude()+"\n"
                            +"經度:"+bdLocation.getLongitude()+"\n"
                            +"詳細地址:"+bdLocation.getAddrStr()+"\n"
                            +"衛星數目"+bdLocation.getSatelliteNumber());


            //構造定位數據
            locData = new MyLocationData.Builder()
                    .accuracy(bdLocation.getRadius())
                    .latitude(bdLocation.getLatitude())
                    .longitude(bdLocation.getLongitude())
                    .build();
            mBaiduMap.setMyLocationData(locData);


            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(bdLocation.getLatitude(),
                        bdLocation.getLongitude());
                BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_openmap_mark);
                // 構建MarkerOption,用於在地圖上添加Marker
                OverlayOptions option = new MarkerOptions()
                        .position(ll) //mark出現的位置
                        .icon(bitmap) //mark圖標
                        .draggable(true);//mark可拖動
                //在地圖上添加Marker並顯示
               marker = (Marker) mBaiduMap.addOverlay(option);

                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(ll).zoom(17.0f);
                mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
            }
        }
    };

    @Override
    protected void onDestroy() {
        //退出時銷燬定位
        mLocClient.stop();
        //關閉定位圖層
        mBaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();

    }

    @Override
    protected void onResume() {
        super.onResume();
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mMapView.onPause();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章