百度地图定位SDKv4.2版本(android)的使用教程

来源:互联网 发布:淘宝开书店需要的证书 编辑:程序博客网 时间:2024/05/21 09:12

百度官方定位SDK的网址:请点击-->  Android 定位SDK

百度地图SDK从2.0.0版本起,将定位功能进行了分离,开发者在使用过程中,若需要定位功能,请参考Android 定位SDK的相关介绍。


上一篇博客中用到BaiduLocationer这个类,上篇博客里说会专门把这个类写出来,现在我来补充关于定位的类。

当时我在activity中的定位是这么用的:

  1. //启用定位  
  2.         BaiduLocationer baiduLocationer = new BaiduLocationer(getThis());  

这句代码就是启动定位,定位成功之后 就会执行Acitivity的  opratBDLocation方法。

这个类的源码如下:

import android.app.Activity;import android.content.Context;import android.os.Handler;import android.widget.Toast;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.oki.lyw.activity.BaseActivity;import com.oki.lyw.activity.LYApplication;import com.oki.lyw.activity.baidumap.LBSMapActivity;import com.oki.lyw.activity.baidumap.LBSSearchListActivity;import com.oki.utils.activity.ActivityManager;import com.oki.utils.activity.ActivityUtil;//这个类的使用方法 是直接调用  实例化即可// BaiduLocationer(Context context)    /*    *如果定位出现问题,可能是如下原因    *   1.  key有问题    *   安全码   如:   05:14:10:66:8D:19:2D:35:03:DF:47:A9:97:5B:E2:10:02:98:6D:08:com.oki.lyw.activity    *   安全码里面有包名  新项目要去百度重新申请key    *   2.  liblocSDK4d.so  没有导入    *   3.  服务 service android:name="com.baidu.location.f"   没有加上来    *   4.  如果定位不稳定但是可以定位到的话 就可能是  版本问题    * */public class BaiduLocationer {    Handler lochandler;    Context mContext;    private LocationClient locationClient = null;    private static final int UPDATE_TIME=100;    public BaiduLocationer(Context context)//实例化并启动    {        //启动定位        lochandler= new Handler();        mContext=context;        lochandler.post(getpositionrunnable);    }
<span style="white-space:pre"></span>//当new  Locationer(this)  获取定位信息之后 定位会自动停止,如果还想启动定位 则需要调用此方法。    public void startLocation()    {        lochandler.post(getpositionrunnable);    }    //后台获取经纬度的线程    Runnable getpositionrunnable = new Runnable() {        @Override        public void run() {            try {                locationClient = new LocationClient(mContext.getApplicationContext());                locationClient.registerLocationListener(new BDLocationListener() {                    @Override                    public void onReceiveLocation(BDLocation location) {                        // TODO Auto-generated method stub                        // TODO Auto-generated method stub                        if (location == null) {                            return;                        }                        if (location.getLatitude() > 1 && location.getLongitude() > 1) {                            stopLoc();                            if(((Activity)mContext).isFinishing())//如果当前的Activity已经被finish掉了)                                return;                            if(mContext  instanceof BaseActivity)                                ((BaseActivity)mContext).opratBDLocation(location);                            else if(mContext  instanceof LBSMapActivity)                            {                                ((LBSMapActivity)mContext).opratBDLocation(location);                            }                            else if(mContext  instanceof LBSSearchListActivity)                            {                                ((LBSSearchListActivity)mContext).opratBDLocation(location);                            }                            else                                Toast.makeText(mContext,"Context不是BaseActivity实例化的对象",Toast.LENGTH_LONG).show();                        }                    }                });                //设置定位条件                LocationClientOption option = new LocationClientOption();                option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);                option.setOpenGps(true);// 打开gps                option.setCoorType("bd09ll"); // 设置坐标类型gcj02,bd09ll                option.setOpenGps(true);                option.setScanSpan(UPDATE_TIME);                option.setIsNeedAddress(true);                locationClient.setLocOption(option);                //注册位置监听器                locationClient.start();            } catch (Exception e) {                Toast.makeText(mContext, "经纬度获取失败,请打开GPS和网络", Toast.LENGTH_LONG).show();            }        }    };    public void  stopLoc()    {        //非空切未启动时停止定位        if(locationClient!=null&&locationClient.isStarted())            locationClient.stop();        lochandler.removeCallbacks(getpositionrunnable);//终止线程    }}

MainFast.xml文件如下:

<!-- 这个权限用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission><!-- 这个权限用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!-- 获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><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" /><!—SD卡读取权限,用户写入离线定位数据--><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission><!--允许应用读取低级别的系统日志文件 --><uses-permission android:name="android.permission.READ_LOGS"></uses-permission>




        <!--百度地图begin-->        <meta-data            android:name="com.baidu.lbsapi.API_KEY"            android:value="ZgBXO2qnqD6ZafTWn0ucV63G" />        <service            android:name="com.baidu.location.f"            android:enabled="true"            android:process=":remote" >        </service>        <!--百度地图end-->





补充:
1.如果你的程序执行不到 onReceiveLocation(BDLocation location)这个方法,
可能是 你Mainfast.xml文件没写对,定位服务没加进来,请下载官方的demo进行比对。
2.如果定位能执行到  onReceiveLocation(BDLocation location) 但是很慢,捕捉到位置信息需要15s以上,可能是当前你是用的版本是X.0的版本,X.0的版本不如  X.1/X.2/X.3的版本稳定。亦或者你的key有问题,这个代码里我已经写了,key要注意的,加入你项目的报名更改了,就要重新申请密钥。注意包名哦!

3.我的项目几乎每个Acitivty都继承于BaseActivity  所以我在BaseActivity中写了个  opratBDLocation方法,每个继承者 需要定位的话 只需要 BaiduLocationer baiduLocationer = new BaiduLocationer(getThis());  
这样就启动了定位服务,在重构 opratBDLOcation方法,当定位成功时就会执行opratBDLocation方法。


if(mContext  instanceof BaseActivity)                                ((BaseActivity)mContext).opratBDLocation(location);
4.我当前使用的SDK版本是4.2,而我之前用3.X版本也是可以的。定位改动不大,但是百度地图的SDK,现在是3.1。而之前的2.X版本的代码拿过来统统不能用了。








0 0
原创粉丝点击