Android百度地图开发(二)-定位

来源:互联网 发布:淘宝other是什么牌子 编辑:程序博客网 时间:2024/06/05 19:32
定位原理
使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。
用户可以设置满足自身需求的定位依据:
若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。

一 . 导入库文件

在使用百度定位SDKv4.0之前,我们要下载最新的库文件,下载地址:点击下载相关库文件,将liblocSDK4.so文件拷贝到libs/armeabi目录下。将locSDK4.0.jar文件拷贝到工程的libs目录下



二 . 布局文件
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.map.maptest1.MainActivity">    <com.baidu.mapapi.map.MapView        android:id="@+id/bmapView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:clickable="true" />    <Button        android:text="Button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:layout_alignParentRight="true"        android:layout_alignParentEnd="true"        android:layout_marginRight="26dp"        android:layout_marginEnd="26dp"        android:layout_marginTop="25dp"        android:id="@+id/button" /></RelativeLayout>
三 . 界面MainActivity代码
package com.example.map.maptest1;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;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.MapStatus;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MyLocationConfiguration;import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.model.LatLng;/** * 此demo用来展示如何结合定位SDK实现定位,并使用MyLocationOverlay绘制定位位置 同时展示如何使用自定义图标绘制并点击时弹出泡泡 */public class MainActivity extends Activity {    // 定位相关    LocationClient mLocClient;    public MyLocationListenner myListener = new MyLocationListenner();    private LocationMode mCurrentMode;    BitmapDescriptor mCurrentMarker;    MapView mMapView;    BaiduMap mBaiduMap;    // UI相关    Button requestLocButton;    boolean isFirstLoc = true; // 是否首次定位    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        SDKInitializer.initialize(getApplicationContext());         //百度地图初始化        setContentView(R.layout.activity_main);        requestLocButton = (Button) findViewById(R.id.button);        mCurrentMode = LocationMode.NORMAL;        requestLocButton.setText("普通");        OnClickListener btnClickListener = new OnClickListener() {            public void onClick(View v) {                switch (mCurrentMode) {                    case NORMAL:                        requestLocButton.setText("跟随");                        mCurrentMode = LocationMode.FOLLOWING;                        mBaiduMap                                .setMyLocationConfigeration(new MyLocationConfiguration(                                        mCurrentMode, true, mCurrentMarker));                        break;                    case COMPASS:                        requestLocButton.setText("普通");                        mCurrentMode = LocationMode.NORMAL;                        mBaiduMap                                .setMyLocationConfigeration(new MyLocationConfiguration(                                        mCurrentMode, true, mCurrentMarker));                        break;                    case FOLLOWING:                        requestLocButton.setText("罗盘");                        mCurrentMode = LocationMode.COMPASS;                        mBaiduMap                                .setMyLocationConfigeration(new MyLocationConfiguration(                                        mCurrentMode, true, mCurrentMarker));                        break;                    default:                        break;                }            }        };        requestLocButton.setOnClickListener(btnClickListener);        // 地图初始化        mMapView = (MapView) findViewById(R.id.bmapView);        mBaiduMap = mMapView.getMap();        // 开启定位图层        mBaiduMap.setMyLocationEnabled(true);        // 定位初始化        mLocClient = new LocationClient(this);        //注册监听器        mLocClient.registerLocationListener(myListener);        LocationClientOption option = new LocationClientOption();        option.setOpenGps(true); // 打开gps        option.setCoorType("bd09ll"); // 设置坐标类型        option.setScanSpan(1000);        mLocClient.setLocOption(option);        mLocClient.start();    }    /**     * 定位SDK监听函数     */    public class MyLocationListenner implements BDLocationListener {        @Override        public void onReceiveLocation(BDLocation location) {            // map view 销毁后不在处理新接收的位置            if (location == null || mMapView == null) {                return;            }            MyLocationData locData = new MyLocationData.Builder()                    .accuracy(location.getRadius())                    // 此处设置开发者获取到的方向信息,顺时针0-360                    .direction(100).latitude(location.getLatitude())                    .longitude(location.getLongitude()).build();            mBaiduMap.setMyLocationData(locData);            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()));            }        }        public void onReceivePoi(BDLocation poiLocation) {        }    }    @Override    protected void onPause() {        mMapView.onPause();        super.onPause();    }    @Override    protected void onResume() {        mMapView.onResume();        super.onResume();    }    @Override    protected void onDestroy() {        // 退出时销毁定位        mLocClient.stop();        // 关闭定位图层        mBaiduMap.setMyLocationEnabled(false);        mMapView.onDestroy();        mMapView = null;        super.onDestroy();    }}
四 . 配置AndroidManifest.xml
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />    <!-- 这个权限用于进行网络定位 -->    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    <!-- 这个权限用于访问GPS定位 -->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <!-- 用于读取手机当前的状态 -->    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <!-- 访问网络,网络定位需要上网 -->    <uses-permission android:name="android.permission.INTERNET" />

五.运行成功图示



六.常见问题
1.
SDKInitializer.initialize(getApplicationContext()); 没写引发无法运行问题
2.
权限未添加
3.
常见报错序号
  1. 61 : GPS定位结果
  2. 62 : 扫描整合定位依据失败。此时定位结果无效。
  3. 63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。
  4. 65 : 定位缓存的结果。
  5. 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
  6. 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果
  7. 68 : 网络连接失败时,查找本地离线定位时对应的返回结果
  8. 161: 表示网络定位结果
  9. 162~167: 服务端定位失败




1 0