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

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


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

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

  1. //启用定位
  2. BaiduLocationerbaiduLocationer=newBaiduLocationer(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方法,每个继承者 需要定位的话 只需要BaiduLocationerbaiduLocationer=newBaiduLocationer(getThis()); 这样就启动了定位服务,在重构 opratBDLOcation方法,当定位成功时就会执行opratBDLocation方法。

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








更多相关文章

  1. Android webview和js互相调用实现方法
  2. Android的持续化集成及多版本打包
  3. 深入解析android log的分析方法(1)
  4. Android增量升级的方法和原理
  5. android ListView常见问题解决方法(滚动背景变黑,去除滑动时阴影,拖
  6. Android程序调试–LogCat按照日志信息级别进行输出和过滤

随机推荐

  1. Android反编译工具介绍
  2. 设置listview的背景颜色
  3. Android——SeekBar(拖动条)相关知识总结贴
  4. android 如何让 EditText 默认不获取焦点
  5. android语音识别之科大讯飞语音API的使用
  6. RelativeLayout(相对布局)
  7. android:gravity和android:layout_gravit
  8. Android入门:ImageView介绍
  9. RelativeLayout用到的一些重要的属性:
  10. android全屏代码