首页 > 代码库 > (百度地图API)v4-2版本定位功能

(百度地图API)v4-2版本定位功能

这几天在看郭霖老师的大作,在百度地图这一张卡的好久,原因是因为百度更新迭代的速度太快了,导致老师的书上的版本已经淘汰又淘汰了,不过还是给了我很多的启发的啊。今晚自己就实现了一下百度地图的定位功能。

百度地图API的什么的,也就不多说了。官网上介绍的也比较详细,还都是中文的,仔细阅读下就行,对了,我用的是v4-2的版本。感觉只有晚上11点以后的工作效率才会翻倍啊,大家有没有这个体会啊,最近想做一款跑步的软件,当然是很简单的那种,做完了会贴上代码和大家来讨论的。

官网链接:http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v4-2



package com.nsz.baidulocationtest;

/**
 * 定位服务接口
 * 
 * @author zhou.ni
 * 
 */
public interface LocationServiceInterface {
	/**
	 * 初始化
	 */
	void init();

	/**
	 * 开始定位
	 */
	void startLocation();

	/**
	 * 停止定位
	 */
	void stop();
}

package com.nsz.baidulocationtest;

import android.content.Context;
import android.location.Location;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;

/**
 * 提供定位服务的实现
 * 
 * @author zhou.ni
 * 
 */
public class BaiduLocationSercice implements LocationServiceInterface {

	private static final String TAG = "LocationUtilBaidu";
//	private static final int mLocationUpdateMinTime = 20000; //定位请求间隔
	private LocationClient mLocationClient = null;
	private BDLocationListener mBDLocationListener;
	public Location location;
	private String tempcoor = "gcj02"; 	// 坐标系
	private LocationMode tempMode = LocationMode.Hight_Accuracy;  // 高精度定位模式

	Context mContext;
	
	public BaiduLocationSercice(Context mContext) {
		super();
		this.mContext = mContext;
		init();
	}

	public void init() {
		mLocationClient = new LocationClient(mContext);
		setOption();
	}

	/**
	 * 设置定位完成后的监听器
	 * @param listener
	 */
	public void registerLocationListenner(BDLocationListener listener) {
		this.mBDLocationListener = listener;
		mLocationClient.registerLocationListener(mBDLocationListener);
	}

	/**
	 * 获得最后一次定位结果
	 * 
	 * @return
	 */
	public BDLocation getLastLocation() {
		return mLocationClient.getLastKnownLocation();
	}

	/**
	 * 配置定位参数
	 */
	private void setOption() {
		LocationClientOption option = new LocationClientOption();
		option.setLocationMode(tempMode);	// 设置定位模式
		option.setCoorType(tempcoor);		// 返回的定位结果是百度经纬度,默认值gcj02
//		option.setScanSpan(mLocationUpdateMinTime);//设置发起定位请求的间隔时间.不设置就只定位一次
		option.setIsNeedAddress(true);		//返回的定位结果包含地址信息
		option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
		mLocationClient.setLocOption(option);
	}

	@Override
	public void startLocation() {
		if (mLocationClient != null) {
			mLocationClient.start();
			mLocationClient.requestLocation();
		}
	}

	@Override
	public void stop() {
		if (mLocationClient != null && mLocationClient.isStarted()) {
			mLocationClient.stop();
		}

	}

//	private BDLocation mLocation;
//	/**
//	 * 实现实位回调监听
//	 */
//	public class MyLocationListenner implements BDLocationListener {
//
//		@Override
//		public void onReceiveLocation(BDLocation location) {
//			if (location == null)
//	            return ;
//			// 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());
//			if (location.getLocType() == BDLocation.TypeGpsLocation) {
//				sb.append("\nspeed : ");
//				sb.append(location.getSpeed());
//				sb.append("\nsatellite : ");
//				sb.append(location.getSatelliteNumber());
//				sb.append("\ndirection : ");
//				sb.append("\naddr : ");
//				sb.append(location.getAddrStr());
//				sb.append(location.getDirection());
//			} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
//				sb.append("\naddr : ");
//				sb.append(location.getAddrStr());
//				// 运营商信息
//				sb.append("\noperationers : ");
//				sb.append(location.getOperators());
//			}
//			Log.i(TAG, sb.toString());
//			if (location != null) {
//				mLocation = location;
//			}
//
//		}
//
//	}

	
}

package com.nsz.baidulocationtest;

import java.util.Timer;
import java.util.TimerTask;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class AddrLocationActivity extends Activity {
	
	private BaiduLocationSercice mBaiduLocationSercice;
	private  MyLocitionListener locationListener;
	
	TextView tv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_addr_search);
		initView();
	}

	private void initView() {
		tv = (TextView) this.findViewById(R.id.tv);
		mBaiduLocationSercice = new BaiduLocationSercice(getApplicationContext());
		getLocation();
	}
	
	private void getLocation() {
		try {
			if( locationListener == null ){
				locationListener = new MyLocitionListener();
				mBaiduLocationSercice.registerLocationListenner(locationListener);
			}
			mBaiduLocationSercice.startLocation();// 开始定位
			timeOutTimer.schedule(new locationTimeOutTask(), 15000);//15秒超时
		} catch (Exception e) {
			if(e!=null)
			e.printStackTrace();
		}
		
	}
	
	class MyLocitionListener implements BDLocationListener{

		@Override
		public void onReceiveLocation(BDLocation locition) {
			if( locition == null ){
				return;
			}
			mBaiduLocationSercice.stop();
			timeOutTimer.cancel();
	        isLocationReturn  = true;
	        
	        MyAddress addr = transform(locition); 
	        tv.setText(addr.getAddrName());
	        
	        
	        
		}
		
	}
	
	/**
     * 对象转换
     * @param location
     * @return
     */
	private MyAddress transform(BDLocation location) {
		MyAddress addr = new MyAddress();
		addr.setAddrName(location.getAddrStr());
		addr.setCityName(location.getCity());
		addr.setLat(location.getLatitude()+"");
		addr.setLng(location.getLongitude()+"");
		return addr;
    }
	
	protected boolean isLocationReturn = false;
	private Timer timeOutTimer = new Timer();
	class locationTimeOutTask extends TimerTask{

		@Override
		public void run() {
			if(!isLocationReturn){
				if( mBaiduLocationSercice != null ){
					mBaiduLocationSercice.stop();
				}
			}
			
		}
		
	}
	
	
}

package com.nsz.baidulocationtest;

import java.io.Serializable;

/**
 * 地址模型
 * 
 * @author zhou.ni
 * 
 */
public class MyAddress implements Serializable {
	private static final long serialVersionUID = 1L;
	/** 详细地址 **/
	private String addrName;
	/** 地址所在城市名称 **/
	private String cityName;
	/** 地址所在纬度 **/
	private String lat;
	/** 地址所在经度 **/
	private String lng;

	public String getAddrName() {
		return addrName;
	}

	public void setAddrName(String addrName) {
		this.addrName = addrName;
	}

	public String getCityName() {
		return cityName;
	}

	public void setCityName(String cityName) {
		this.cityName = cityName;
	}

	public String getLat() {
		return lat;
	}

	public void setLat(String lat) {
		this.lat = lat;
	}

	public String getLng() {
		return lng;
	}

	public void setLng(String lng) {
		this.lng = lng;
	}

}

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nsz.baidulocationtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="20" />

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_LOGS" >
    </uses-permission>
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.baidu.location.service_v2.2" >
                </action>
            </intent-filter>
        </service>

        <!-- meta-data需要写在application中 -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value=http://www.mamicode.com/"DUpR6inXeQAgj9Aln2QGjxy7" />>
布局文件就不贴代码了,就是一个TextView。对了,不知道为什么,我有一款华为的Z87,是没有SM卡的,但是连接的wifi,却不能定位成功。但是另一款锤子去可以,如果大家知道的话,请告知。

效果图:

技术分享

(百度地图API)v4-2版本定位功能