(百度地图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="DUpR6inXeQAgj9Aln2QGjxy7" />

        <activity
            android:name="com.nsz.baidulocationtest.AddrLocationActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

布局文件就不贴代码了,就是一个TextView。对了,不知道为什么,我有一款华为的Z87,是没有SM卡的,但是连接的wifi,却不能定位成功。但是另一款锤子去可以,如果大家知道的话,请告知。

效果图:

时间: 2024-11-10 13:50:21

(百度地图API)v4-2版本定位功能的相关文章

百度地图API实现简单的定位功能

下载jar包 https://yunpan.cn/cRedhAyeMAfGM  访问密码 4fbb(最后自己从百度官网下载) libs里的东西全拷进app的libs中,并关联 1  .  app的build.gradle中配置SO的使用,如下所示: sourceSets { main { jniLibs.srcDirs = ['libs'] } } 2  在application标签中声明service组件,每个app拥有自己单独的定位service <service android:name=

百度地图API的自动定位和搜索功能(移动端)

近期有个项目涉及到百度地图API,要求做到自动定位和搜索功能.煞费苦心的研究半天,终于能将两个功能合二为一,现将代码贴出来分享给大家,希望你们的砖搬得又快又好.注释不多,具体请参照:http://lbsyun.baidu.com/index.php?title=jspopular 注意:这段代码最好能上传到新浪云等免费空间,用手机打开连接即可看到效果,不然看不到看不到看不到哦. <!DOCTYPE html><html><head> <meta http-equi

Android百度地图API集成二《定位》

书接上回 ↑ 基础地图请查看Android百度地图API集成一<基础地图>: 地址http://www.cnblogs.com/dhr125/p/5969980.html 1.在Application标签中声明SERVICE组件 <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> <

百度地图api将可视区域定位到当前所在位置

1.前言 开头不说点什么,总是有点不习惯.还是说点什么吧,关于百度地图,我用的次数还是比较多的,没办法,需求呀.好吧,在用百度地图的时候,确实有过很多需求,不过好在百度地图很强大,每次需求在探索后都能满足功能.以后将百度地图中所遇到的一些常见的功能整理一下,也方便一些童鞋参考.我的有一个项目中,就是要一开始将地图的可视区域定位在当前位置.其实很简单,网上一搜一大堆. 2.详情 说的再多,不如贴代码更来的直白.不过使用百度地图,一定要有ak.这个我想没有人不知道吧 1.引入js文件 1 <scri

xcode5 百度地图api 环境搭建

非原创在http://www.2cto.com/kf/201305/213314.html的基础上稍做修改. 1.官网下载最新的SDK开发包_iOS静态库文件 http://developer.baidu.com/map/sdkiosdev-download.htm 解压后如下: 其中inc是头文件 mapapi.bundle是图片库 Release-iphoneos真机调试所需用到的.a文件 Release-iphonesimulator虚拟机调试所需用到的.a文件 readme是一些版本介绍

【iOS】百度地图api使用总结

首先,需要到百度LBS开放平台注册开发者账号,这个步骤略. iOS SDK自v2.0.2版本开始采用了全新的Key验证体系.在一个项目中使用百度地图SDK则必须申请对应的密钥. 应用名称要填自己的项目名称,应用类型按照需要选择,启用的服务可以全部勾选上,也可以根据需要勾选,安全码即工程的Bundle Identifier 点击提交,生成一个新的密钥. 这部分的AK就是你的工程专用的密钥,要写在AppDelegate中的. 第二部分 配置 这部分是参考百度提供的方法,按步骤来是没有错得. 配置.f

百度地图API和高德地图API资料集锦

[高德地图API]从零开始学高德JS API(五)路线规划--驾车|公交|步行 [高德地图API]从零开始学高德JS API(四)搜索服务--POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索 [高德地图API]从零开始学高德JS API(三)覆盖物--标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物 [高德地图API]从零开始学高德JS API(二)地图控件与插件--测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 [高德地图API]从零开始学高德JS API

吐槽贴:百度地图 api 封装 的实用功能 [源码下载]

ZMap 类 功能介绍 ZMap 是学习百度地图 api 接口,开发基本功能后整的一个脚本类,本类方法功能大多使用 prototype 原型 实现: 包含的功能有:轨迹回放,圈画区域可编辑,判断几个坐标是否在一个圆圈内,生活服务查询,从经纬度获取地址信息,地图工具包括测距,获取面积,以积打印地图,地图全屏,实时路况,坐标是否在polygon区域内,打车方案,经过中间途经点,添加地图控件: 地图界面: ZMap.js 部分代码说明 /** * 百度地图 api 功能整合 * @author Glo

百度地图SDK V3.2 和百度定位SDK V4.2 完成定位功能

百度地图SDK V3.2 和百度定位SDK V4.2 完成定位功能 1.要完成定位功能,不光是要下载百度地图SDK(baidumapapi_v3_2_0.jar ; libBaiduMapSDK_v3_2_0_15.so),还需要下载百度的定位SDK(locSDK_4.2.jar; liblocSDK4d.so),需要到官网下载如上述的库和jar包.并且需要将jar包右键添加到build path中 2.需要在manifest.xml文件中添加需要的key,service以及权限.如果没有添加s