安卓百度地圖定位

石曼迪發表於2016-08-30

效果如圖:

817566811440679402

只有2個類:

MainActivity 

public class MainActivity extends AppCompatActivity  {

    private TextureMapView mMapView;
    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK各元件之前初始化context資訊,傳入ApplicationContext
        //注意該方法要再setContentView方法之前實現
        //使用百度地圖的任何功能都需要先初始化這段程式碼  最好放在全域性中進行初始化
        //百度地圖+定位+marker比較簡單 我就不放到全域性去了
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        //獲取地圖控制元件引用
        mMapView = (TextureMapView) findViewById(R.id.bmapView);

        //宣告LocationClient類
        mLocationClient = new LocationClient(getApplicationContext());
        //註冊監聽函式
        mLocationClient.registerLocationListener( myListener );

        //配置定位引數
        initLocation();
        //開始定位
        mLocationClient.start();
    }

    /**
     * 配置定位引數
     */
    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);
    }
View Code

MyLocationListener 

    /**
     * 實現定位監聽 位置一旦有所改變就會呼叫這個方法
     * 可以在這個方法裡面獲取到定位之後獲取到的一系列資料
     */
    public class MyLocationListener implements BDLocationListener {

        private double lat;
        private double lon;

        @Override
        public void onReceiveLocation(BDLocation location) {
            //Receive Location
            StringBuffer sb = new StringBuffer(256);
            sb.append("time : ");
            sb.append(location.getTime());
            sb.append("\nerror code : ");
            sb.append(location.getLocType());
            sb.append("\nlatitude : ");
            sb.append(location.getLatitude());
            sb.append("\nlontitude : ");
            sb.append(location.getLongitude());
            sb.append("\nradius : ");
            sb.append(location.getRadius());
            lat = location.getLatitude();
            lon = location.getLongitude();
            if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位結果
                sb.append("\nspeed : ");
                sb.append(location.getSpeed());// 單位:公里每小時
                sb.append("\nsatellite : ");
                sb.append(location.getSatelliteNumber());
                sb.append("\nheight : ");
                sb.append(location.getAltitude());// 單位:米
                sb.append("\ndirection : ");
                sb.append(location.getDirection());// 單位度
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());
                sb.append("\ndescribe : ");
                sb.append("gps定位成功");

            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 網路定位結果
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());
                //運營商資訊
                sb.append("\noperationers : ");
                sb.append(location.getOperators());
                sb.append("\ndescribe : ");
                sb.append("網路定位成功");
            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 離線定位結果
                sb.append("\ndescribe : ");
                sb.append("離線定位成功,離線定位結果也是有效的");
            } else if (location.getLocType() == BDLocation.TypeServerError) {
                sb.append("\ndescribe : ");
                sb.append("服務端網路定位失敗,可以反饋IMEI號和大體定位時間到loc-bugs@baidu.com,會有人追查原因");
            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
                sb.append("\ndescribe : ");
                sb.append("網路不同導致定位失敗,請檢查網路是否通暢");
            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
                sb.append("\ndescribe : ");
                sb.append("無法獲取有效定位依據導致定位失敗,一般是由於手機的原因,處於飛航模式下一般會造成這種結果,可以試著重啟手機");
            }
            sb.append("\nlocationdescribe : ");
            sb.append(location.getLocationDescribe());// 位置語義化資訊
            List<Poi> list = location.getPoiList();// POI資料
            if (list != null) {
                sb.append("\npoilist size = : ");
                sb.append(list.size());
                for (Poi p : list) {
                    sb.append("\npoi= : ");
                    sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
                }
            }
            Log.v("pcw","lat : " + lat+" lon : " + lon);
            Log.i("BaiduLocationApiDem", sb.toString());
            Toast.makeText(MainActivity.this,sb.toString() ,Toast.LENGTH_SHORT).show();

        }
View Code

完整程式碼下載

相關文章