zoukankan      html  css  js  c++  java
  • 定位请求百度地图定位基础

    查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!

        最近应用百度地图,查看了官方的说明,然后做了一个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;
    
    }

        界面如下:

        定位和请求

    文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?  
      答:因为李艳红这种败类,所以我没女友!

  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3078433.html
Copyright © 2011-2022 走看看