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;
    
    }

        界面如下:

        定位和请求

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

  • 相关阅读:
    ActiveX控件开发总结(续)
    Guru of the Week 条款04: 类的构造技巧
    tk
    C++中一个空类的大小为什么是1?
    虚继承
    计算机单位
    Guru of the week:#18 迭代指针.
    kingofark关于学习C++和编程的50个观点
    Guru of the Week 条款06:正确使用const
    Guru of the Week 条款07:编译期的依赖性
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3078433.html
Copyright © 2011-2022 走看看