百度地图定位基础

最近使用百度地图,查看了官方的说明,然后做了一个Demo,作为入门,如果看了我之前的代码,有一个习惯就是使用代码写布局,感觉这样比较快,习惯而已。

源码如下:

package com.zhangjie.local;

import android.os.Bundle;
import android.os.Vibrator;
import android.app.Activity;
import android.app.Service;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类
public class Local extends Activity implements OnClickListener{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getDisplayMetrics();
		initLayout();
		setContentView(Parent);
		myListener = new MyLocationListener();
		mLocationClient = new LocationClient(getApplicationContext());
		mLocationClient.registerLocationListener(myListener);
		//设置定位参数包括:定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等
		option = new LocationClientOption();
		option.setOpenGps(true);
		option.setAddrType("all");//返回定位结果包含地址信息
		option.setCoorType("bd0911");//返回的定位结果是百度经纬度,默认值gcj02
		option.setScanSpan(5000);//设置发起请求的时间间隔为5000ms
		option.disableCache(true);//禁止开启缓存定位
		option.setPoiNumber(5);//最多返回POI个数
		option.setPoiDistance(1000);//poi查询距离
		option.setPoiExtraInfo(true);//是否需要POI的电话和地址等详细信息
		mLocationClient.setLocOption(option);
		mLocationClient.start();
	}
	
	/**
	 * 初始化布局
	 */
	public void initLayout(){
		Parent = new RelativeLayout(this);
		bottomLayout = new LinearLayout(this);
		bottomLayout.setId(10);
		contentTextView = new TextView(this);
		contentTextView.setText(R.string.content);
		localButton = new Button(this);
		localButton.setText(R.string.localrequest);
		localButton.setId(11);
		localButton.setOnClickListener(this);
		poiButton = new Button(this);
		poiButton.setText(R.string.poirequest);
		poiButton.setId(12);
		poiButton.setOnClickListener(this);
		notifyButton = new Button(this);
		notifyButton.setText(R.string.notify);
		notifyButton.setId(13);
		notifyButton.setOnClickListener(this);
		offlineButton = new Button(this);
		offlineButton.setText(R.string.offine);
		offlineButton.setId(14);
		offlineButton.setOnClickListener(this);
		
		//設置底部佈局的button
		int disten = (Screen_width - dip2px(buttonWidth) * 4) / 5;
		LinearLayout.LayoutParams buttonInBottomLayoutParams = new LinearLayout.LayoutParams(dip2px(buttonWidth), dip2px(buttonHeight));
		buttonInBottomLayoutParams.leftMargin = disten;
		bottomLayout.addView(localButton, buttonInBottomLayoutParams);
		bottomLayout.addView(poiButton, buttonInBottomLayoutParams);
		bottomLayout.addView(notifyButton, buttonInBottomLayoutParams);
		bottomLayout.addView(offlineButton, buttonInBottomLayoutParams);
		RelativeLayout.LayoutParams bottomInParentLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
		bottomInParentLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
		Parent.addView(bottomLayout, bottomInParentLayoutParams);
		//設置contentTextView佈局
		RelativeLayout.LayoutParams contentInParentLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
		contentInParentLayoutParams.addRule(RelativeLayout.ABOVE, 10);
		Parent.addView(contentTextView, contentInParentLayoutParams);
		
	}
	
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case 11:
			//发起定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。
			if (mLocationClient != null && mLocationClient.isStarted()) {
				mLocationClient.requestLocation();
			}else {
				Log.e("LocSDK3", "locClient is null or not started");
			}
			break;
		case 12:
			//发起POI查询请求。请求过程是异步的,定位结果在上面的监听函数onReceivePoi中获取
			if (mLocationClient != null && mLocationClient.isStarted()) {
				mLocationClient.requestPoi();
			}
			break;
		case 13:
			if (!clickNotify) {
					clickNotify = true;
					//位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现
					//位置提醒相关代码
					mNotifyer = new NotifyLister();
					mNotifyer.SetNotifyLocation(42.03249652949337,113.3129895882556,3000,"gps");//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)
					mLocationClient.registerNotify(mNotifyer);
			}else {
				clickNotify = false;
				//取消位置提醒
				mLocationClient.removeNotifyEvent(mNotifyer);
			}
			break;
		case 14:
			/*
			 *  发起离线定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。
			 *	getLocTypte = BDLocation.TypteOfflineLocation || BDLocation.TypeOfflineLocationFail
			 *  表示是离线定位请求返回的定位结果
			 */
			if (mLocationClient != null && mLocationClient.isStarted()) {
				mLocationClient.requestOfflineLocation();
			}
			break;
		}
	}
	
	//获取屏幕的宽度,高度和密度以及dp / px
	 public void getDisplayMetrics() {
  		DisplayMetrics dm = new DisplayMetrics();
  		dm = getApplicationContext().getResources().getDisplayMetrics();
  		Screen_width = dm.widthPixels;
  		Screen_height = dm.heightPixels;
  		scale = getResources().getDisplayMetrics().density;
	}
		 
	 public int dip2px(float dpValue) {  
        return (int)(dpValue * scale + 0.5f);
     }

	 @Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.local, menu);
		return true;
	}

	@Override
	protected void onStop() {
		super.onStop();
		if (mLocationClient != null) {
			mLocationClient.stop();
			mLocationClient = null;
		}
	}

	public class MyLocationListener implements BDLocationListener{

		//接收异步返回的定位结果,参数是BDLocation类型参数
		@Override
		public void onReceiveLocation(BDLocation location) {
			if (location == null) {
				return;
			}
			StringBuffer sb = new StringBuffer(256);
			sb.append("time: ");
			sb.append(location.getTime());
			sb.append("\nerror code: ");
			sb.append(location.getLocType());
			sb.append("\nlontitude: ");
			sb.append(location.getLongitude());
			sb.append("\nradius: ");
			sb.append(location.getRadius());
			if (location.getLocType() == BDLocation.TypeGpsLocation) {
				sb.append("\nspedd: ");
				sb.append(location.getSpeed());
				sb.append("\nsatellite: ");
				sb.append(location.getSatelliteNumber());
			}else if(location.getLocType() == BDLocation.TypeNetWorkLocation){
				sb.append("\naddr: ");
				sb.append(location.getAddrStr());
			}else if(location.getLocType() == BDLocation.TypeOffLineLocation || location.getLocType() == BDLocation.TypeOffLineLocationNetworkFail){
				
			}
			if (contentTextView != null) {
				contentTextView.setText(sb.toString());
			}
		}

		//接收异步返回的POI查询结果,参数是BDLocation类型参数
		@Override
		public void onReceivePoi(BDLocation arg0) {
			
		}
	}
	
	//BDNotifyListener实现
	public class NotifyLister extends BDNotifyListener{
		public void onNotify(BDLocationListener mListener, float distance){
			if (mVibrator == null) {
				mVibrator = (Vibrator)getApplication().getSystemService(Service.VIBRATOR_SERVICE);
			}
			mVibrator.vibrate(1000);//振动提醒已到设定位置附近
		}
	}
	public LocationClient mLocationClient = null;
	LocationClientOption option;
	public BDLocationListener myListener;
	public NotifyLister mNotifyer;
	public Vibrator mVibrator;
	
	private TextView contentTextView;
	private Button localButton;
	private Button poiButton;
	private Button notifyButton;
	private Button offlineButton;
	private RelativeLayout Parent;
	private LinearLayout bottomLayout;
	
	public int Screen_width;
	public int Screen_height;
	public float scale;
	public int buttonWidth = 130;//dp
	public int buttonHeight = 50;//dp
	
	public boolean clickNotify = false;

}

界面如下:



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值