百度ios 地图定位权限权限和定位的问题

本帖子已过去太久远了,不再提供回复功能。延伸阅读:查看: 3089|回复: 14
百度地图 定位时,定位到大西洋去了,何解?
该用户从未签到主题帖子e币
按照百度的demo做的例子,获取当前定位,定位时,定位点跑到大西洋去了,效果图类似于:
请各位大神抽空帮我看看吧,多给点指导,小妹感激不尽。。
以下是部分代码:
//NearActivityMap.java (extends Activity)
[mw_shl_code=java,true]private NearActivityBeanL
& && &&&private ExecutorService executorS// 新建一个线程池对象
& && &&&private static int THREADPOOL_SIZE = 4;// 线程池的大小
& && &&&private getNearActivityH
& && &&&private getNearActivityFormLengthT
& && &&&private static NearActivityMap mInstance =
& && &&&public boolean m_bKeyRight =
& && &&&private MapView locationMapView =
& && &&&private BMapManager bMapManager =
& && &&&private MapController mMapController =
& && &&&private String key = &A665b7fd566cd6f******0&;
& && &&&private Spinner lengthS
& && &&&private ArrayAdapter countiesA
& && &&&private String[] mCounties = { &1千米范围&, &5千米范围&, &10千米范围&, &15千米范围&,
& && && && && && && && &&20千米范围&, &30千米范围& };
& && &&&private List&String& allCounties = new ArrayList&String&();
& && &&&private Button hotR
& && &&&private Button nearE
& && &&&private String isFalseNet = &当前网络状况不佳,请重新刷新...&;
& && &&&private String isInConnectNet = &网络连接失败,请检查网络设置...&;
& && &&&private final static String REQUEST_URL = &http://10.0.2.2:8080/myServerOne/NearLength&;// 新建两个请求数据的url地市
& && &&&private String postName = &length&;
& && &&&private String postValue = &&;
& && &&&private NearActivityThread nearActivityT
& && &&&private MyOverlay mOverlay =
& && &&&private PopupOverlay pop =// 弹出泡泡图层,浏览节点时使用
& && &&&private TextView popupText =// 泡泡view
& && &&&private View viewCache =
& && &&&private MapView.LayoutParams layoutParam =
& && &&&// 地图相关,使用继承MapView的MyLocationMapView目的是重写touch事件实现泡泡处理
& && &&&// 如果不处理touch事件,则无需继承,直接使用MapView即可
& && &&&public MapController mapController =
& && &&&boolean isRequest =// 是否手动触发请求定位
& && &&&boolean isFirstLoc =// 是否首次定位
& && &&&public String localPosition = &&;
& && &&&// 定位相关
& && &&&public LocationClient locationClient =
& && &&&public LocationData locData =
& && &&&public MyLocationListenner myLocationListenner =
& && &&&// 定位图层
& && &&&LocationOverlay myLocationOverlay =
& && &&&public MKSearch mkSearch =[/mw_shl_code][mw_shl_code=java,true]@Override
& && &&&protected void onCreate(Bundle savedInstanceState) {
& && && && && & super.onCreate(savedInstanceState);
& && && && && & Log.v(&BreakPoint&, &NearActivityMap 1 ----- &);
& && && && && & bMapManager = new BMapManager(getApplicationContext());
& && && && && & bMapManager.init(key, new MyGeneralListener());
& && && && && & Log.v(&BreakPoint&, &NearActivityMap 2 ----- &);
& && && && && & setContentView(R.layout.activity_map);
& && && && && & initPosition();
//& && && && && & executorService.submit(new getNearActivityFormLengthThread());
& && &&&}[/mw_shl_code][mw_shl_code=java,true]public void initPosition() {
& && && && && & Log.v(&BreakPoint&, &initPosition() --- &);
& && && && && & viewCache = getLayoutInflater().inflate(R.layout.custom_text_view, null);
& && && && && & popupText = (TextView) viewCache.findViewById(R.id.textcache);
& && && && && & //
& && && && && & locationMapView = (MapView) findViewById(R.id.bmapsView);
& && && && && & mapController = locationMapView.getController();
& && && && && & mapController.setZoom(14);
& && && && && & mapController.enableClick(true);
& && && && && & locationMapView.setBuiltInZoomControls(true);
& && && && && & // 定位初始化
& && && && && & locationClient = new LocationClient(this);
& && && && && & locData = new LocationData();
& && && && && & myLocationListenner = new MyLocationListenner();
& && && && && & locationClient.registerLocationListener(myLocationListenner);
& && && && && & LocationClientOption option = new LocationClientOption();
& && && && && & option.setOpenGps(true);// 打开gps
& && && && && & option.setCoorType(&bd09ll&); // 设置坐标类型
& && && && && & option.setScanSpan(7000);// 设置发起定位请求的间隔时间为7000ms
& && && && && & locationClient.setLocOption(option);
& && && && && & myLocationOverlay = new LocationOverlay(locationMapView);
& && && && && & locationClient.start();
& && && && && & myLocationOverlay.enableCompass();
& && && && && & myLocationOverlay.setData(locData);&&
& && && && && & locationMapView.getOverlays().add(myLocationOverlay);
& && && && && & locationMapView.refresh();
& && &&&}[/mw_shl_code][mw_shl_code=java,true]public class MyOverlay extends ItemizedOverlay {
& && && && && & public MyOverlay(Drawable defaultMarker, MapView mapView) {
& && && && && && && && &super(defaultMarker, mapView);
& && && && && & }
& && && && && & @Override
& && && && && & public boolean onTap(int index) {
& && && && && && && && &OverlayItem item = getItem(index);
& && && && && && && && &popupText.setText(item.getTitle());
& && && && && && && && &Bitmap bitMaps = BMapUtil.getBitmapFromView(popupText);
& && && && && && && && &pop.showPopup(bitMaps, item.getPoint(), 32);
& && && && && && && && &
& && && && && & }
& && && && && & @Override
& && && && && & public boolean onTap(GeoPoint pt, MapView mMapView) {
& && && && && && && && &if (pop != null) {
& && && && && && && && && && &&&pop.hidePop();
& && && && && && && && &}
& && && && && && && && &
& && && && && & }
& && &&&// 继承MyLocationOverlay重写dispatchTap实现点击处理
& && &&&public class LocationOverlay extends MyLocationOverlay {
& && && && && & public LocationOverlay(MapView mapView) {
& && && && && && && && &super(mapView);
& && && && && & }
& && && && && & @Override
& && && && && & protected boolean dispatchTap() {
& && && && && && && && &Log.v(&BreakPoint&, &localPosition = & + localPosition);
& && && && && && && && &// 处理点击事件,弹出泡泡
& && && && && && && && &if (0 == localPosition.length()) {
//& && && && && && && && && && &&&popupText.setText(&正在连接中,请稍后...&);
& && && && && && && && && && &&&Toast.makeText(mInstance, &正在连接中,请稍后...&, Toast.LENGTH_LONG).show();
& && && && && && && && &} else {
& && && && && && && && && && &&&popupText.setBackgroundResource(R.drawable.popup);
& && && && && && && && && && &&&popupText.setText(localPosition);
& && && && && && && && && && &&&pop.showPopup(BMapUtil.getBitmapFromView(popupText), new GeoPoint(
& && && && && && && && && && && && && && && && &(int) (locData.latitude * 1e6),
& && && && && && && && && && && && && && && && &(int) (locData.longitude * 1e6)), 8);
& && && && && && && && &}
& && && && && && && && &
& && && && && & }
& && &&&/**
& && && &* 定位SDK监听函数
& && && &*/
& && &&&public class MyLocationListenner implements BDLocationListener {
& && && && && & @Override
& && && && && & public void onReceiveLocation(BDLocation location) {
& && && && && && && && &if (location == null)
& && && && && && && && && && &&&
& && && && && && && && &locData.latitude = location.getLatitude();
& && && && && && && && &locData.longitude = location.getLongitude();
& && && && && && && && &// 如果不显示定位精度圈,将accuracy赋值为0即可
& && && && && && && && &locData.accuracy = location.getRadius();
& && && && && && && && &locData.direction = location.getDerect();
& && && && && && && && &// 更新定位数据
& && && && && && && && &myLocationOverlay.setData(locData);
& && && && && && && && &// 更新图层数据执行刷新后生效
& && && && && && && && &locationMapView.refresh();
& && && && && && && && &// 是手动触发请求或首次定位时,移动到定位点
& && && && && && && && &if (isRequest || isFirstLoc) {
& && && && && && && && && && &&&// 移动地图到定位点
& && && && && && && && && && &&&mapController.animateTo(new GeoPoint(
& && && && && && && && && && && && && && && && &(int) (locData.latitude * 1e6),
& && && && && && && && && && && && && && && && &(int) (locData.longitude * 1e6)));
//& && && && && && && && && && &&&GeoPoint p1 = new GeoPoint((int) (locData.latitude * 1e6),
//& && && && && && && && && && && && && && && && &(int) (locData.longitude * 1e6));
//& && && && && && && && && && &&&Log.v(&BreakPoint&, &MyLocationListenner ---& (int) (locData.latitude * 1e6) = & +
//& && && && && && && && && && && && && && && && &(int) (locData.latitude * 1e6));
//& && && && && && && && && && &&&Log.v(&BreakPoint&, &MyLocationListenner ---& (int) (locData.longitude * 1e6) = & +
//& && && && && && && && && && && && && && && && &(int) (locData.longitude * 1e6));
//& && && && && && && && && && &&&mkSearch.reverseGeocode(p1);
& && && && && && && && && && &&&isRequest =
//& && && && && && && && && && &&&seeLocation();
& && && && && && && && &}
& && && && && && && && &// 首次定位完成
& && && && && && && && &isFirstLoc =
& && && && && && && && &// 界面加载时添加绘制图层
& && && && && && && && &// addCustomElementsDemo(application.locData);
& && && && && && && && & Log.v(&BreakPoint&, &MyLocationListenner ---& locData.latitude = & +
& && && && && && && && & locData.latitude);
& && && && && && && && & Log.v(&BreakPoint&, &MyLocationListenner ---& locData.longitude = & +
& && && && && && && && & locData.longitude);
& && && && && & }
& && && && && & @Override
& && && && && & public void onReceivePoi(BDLocation poiLocation) {
& && && && && && && && &if (poiLocation == null) {
& && && && && && && && && && &&&
& && && && && && && && &}
& && && && && & }
}[/mw_shl_code][mw_shl_code=java,true]public static NearActivityMap getInstance() {
& && && && && & return mI
& && &&&}[/mw_shl_code][mw_shl_code=java,true]// 常用事件监听,用来处理通常的网络错误,授权验证错误等
& && &&&static class MyGeneralListener implements MKGeneralListener {
& && && && && & @Override
& && && && && & public void onGetNetworkState(int iError) {
& && && && && && && && &if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
& && && && && && && && && && &&&Toast.makeText(
& && && && && && && && && && && && && && && && &NearActivityMap.getInstance().getApplicationContext(),
& && && && && && && && && && && && && && && && &&您的网络出错啦!&, Toast.LENGTH_LONG).show();
& && && && && && && && &} else if (iError == MKEvent.ERROR_NETWORK_DATA) {
& && && && && && && && && && &&&Toast.makeText(
& && && && && && && && && && && && && && && && &NearActivityMap.getInstance().getApplicationContext(),
& && && && && && && && && && && && && && && && &&输入正确的检索条件!&, Toast.LENGTH_LONG).show();
& && && && && && && && &}
& && && && && & }
& && && && && & @Override
& && && && && & public void onGetPermissionState(int iError) {
& && && && && && && && &if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
& && && && && && && && && && &&&// 授权Key错误:
& && && && && && && && && && &&&Toast.makeText(
& && && && && && && && && && && && && && && && &NearActivityMap.getInstance().getApplicationContext(),
& && && && && && && && && && && && && && && && &&请在 NearActivityMap.java文件输入正确的授权Key!&,
& && && && && && && && && && && && && && && && &Toast.LENGTH_LONG).show();
& && && && && && && && && && &&&NearActivityMap.getInstance().m_bKeyRight =
& && && && && && && && &}
& && && && && & }
& && &&&@Override
& && &&&protected void onDestroy() {
& && && && && & executorService.shutdown();
& && && && && & locationMapView.destroy();
& && && && && & if (bMapManager != null) {
& && && && && && && && &bMapManager.destroy();
& && && && && && && && &bMapManager =
& && && && && & }
& && && && && & super.onDestroy();
& && &&&@Override
& && &&&protected void onPause() {
& && && && && & locationMapView.onPause();
& && && && && & if (bMapManager != null) {
& && && && && && && && &bMapManager.stop();
& && && && && & }
& && && && && & super.onPause();
& && &&&@Override
& && &&&protected void onResume() {
& && && && && & locationMapView.onResume();
& && && && && & if (bMapManager != null) {
& && && && && && && && &bMapManager.start();
& && && && && & }
& && && && && & super.onResume();
& && &&&@Override
& && &&&protected void onSaveInstanceState(Bundle outState) {
& && && && && & super.onSaveInstanceState(outState);
& && && && && & locationMapView.onSaveInstanceState(outState);
& && &&&@Override
& && &&&protected void onRestoreInstanceState(Bundle savedInstanceState) {
& && && && && & super.onRestoreInstanceState(savedInstanceState);
& && && && && & locationMapView.onRestoreInstanceState(savedInstanceState);
& && &&&}[/mw_shl_code]
//AndroidManifest.xml
[mw_shl_code=java,true]&service
& && && && &android:name=&com.baidu.location.f&
& && && && &android:enabled=&true&
& && && && &android:process=&:remote& &
& && &&&&/service&[/mw_shl_code]
[mw_shl_code=java,true]&uses-permission android:name=&android.permission.INTERNET& /&
& & &uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& /&
& & &uses-permission android:name=&android.permission.ACCESS_NETWORK_STATE& /&
& & &!-- 使用网络功能所需权限 --&
& & &uses-permission android:name=&android.permission.ACCESS_WIFI_STATE& &
& & &/uses-permission&
& & &uses-permission android:name=&android.permission.CHANGE_WIFI_STATE& &
& & &/uses-permission&
& & &!-- SDK离线地图和cache功能需要读写外部存储器 --&
& & &!-- 获取设置信息和详情页直接拨打电话需要以下权限 --&
& & &uses-permission android:name=&android.permission.READ_PHONE_STATE& &
& & &/uses-permission&
& & &uses-permission android:name=&android.permission.CALL_PHONE& &
& & &/uses-permission&
& & &!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6项 --&
& & &uses-permission android:name=&android.permission.ACCESS_FINE_LOCATION& &
& & &/uses-permission&
& & &permission android:name=&android.permission.BAIDU_LOCATION_SERVICE& &
& & &/permission&
& & &uses-permission android:name=&android.permission.ACCESS_MOCK_LOCATION& &
& & &/uses-permission&
& & &uses-permission android:name=&android.permission.ACCESS_GPS& /&
& & &uses-permission android:name=&android.permission.ACCESS_COARSE_LOCATION& &
& & &/uses-permission&
& & &uses-permission android:name=&android.permission.MOUNT_UNMOUNT_FILESYSTEMS& &
& & &/uses-permission&
& & &uses-permission android:name=&android.permission.READ_LOGS& &
& & &/uses-permission&[/mw_shl_code]
附件: 您需要
才可以下载或查看,没有帐号?
这是同事说的,他之前做的时候也是经常定位到大西洋,是版本的问题
该用户从未签到主题帖子e币
我用的是Android定位SDKv4.0版本的,我也不是很清楚。。。
这是同事说的,他之前做的时候也是经常定位到大西洋,是版本的问题
非常感谢qiucongcongBZ,的确是版本问题。之前我用的是定位4.0的版本,现在把它改为定位3.3的版本就可以正常定位了。也非常感谢各位大神的热心帮忙,可以结贴了。。&
哦。。我换个版本的试试看,,谢谢。。&
该用户从未签到主题帖子e币
我问过我同事了,还应该在AndroidManifest.xml添加一个service
& && &&&&service
& && && && &android:name=&com.baidu.location.f&
& && && && &android:enabled=&true&
& && && && &android:permission=&android.permission.BAIDU_LOCATION_SERVICE&
& && && && &android:process=&:remote& &
& && && && &&intent-filter&
& && && && && & &action android:name=&com.baidu.location.service_v2.6& &
& && && && && & &/action&
& && && && &&/intent-filter&
& && &&&&/service&
如果不添加的话,是获取不到当前位置的
这位朋友,你帮助了我,我搞了一天的问题,瞬间被你解决了。谢谢啊。。。话说,这你同事。怎么知道需要添加这个service的啊?官方教程都没说呢&
我把你给我的代码替换掉了我原来写的service,可是定位还是再大西洋,,可否帮我看看代码,会不会是哪儿写错了?。。。非常感谢,,&
该用户从未签到主题帖子e币
我问过我同事了,还应该在AndroidManifest.xml添加一个service
我把你给我的代码替换掉了我原来写的service,可是定位还是再大西洋,,可否帮我看看代码,会不会是哪儿写错了?。。。非常感谢,,
该用户从未签到主题帖子e币
在工程的libs文件夹下的使用 locSDK_3.1.jar,在libs文件夹下的 armeabi文件夹下 相应的有 liblocSDK3.so文件,总是显示不正确可能是sdk的问题
我用的是Android定位SDKv4.0版本的,我也不是很清楚。。。&
该用户从未签到主题帖子e币
代码没有细看,你可以断点检查一下定位获取到的经纬度是多少 然后在网上查查看位置是哪里,再检查检查经纬度有没有写反了之类的
该用户从未签到主题帖子e币
在工程的libs文件夹下的使用 locSDK_3.1.jar,在libs文件夹下的 armeabi文件夹下 相应的有 liblocSDK3.so文 ...
我用的是Android定位SDKv4.0版本的,我也不是很清楚。。。
这是同事说的,他之前做的时候也是经常定位到大西洋,是版本的问题&
该用户从未签到主题帖子e币
这是同事说的,他之前做的时候也是经常定位到大西洋,是版本的问题
哦。。我换个版本的试试看,,谢谢。。
该用户从未签到主题帖子e币
我想去大西洋。。。
该用户从未签到主题帖子e币
这是同事说的,他之前做的时候也是经常定位到大西洋,是版本的问题
非常感谢qiucongcongBZ,的确是版本问题。之前我用的是定位4.0的版本,现在把它改为定位3.3的版本就可以正常定位了。也非常感谢各位大神的热心帮忙,可以结贴了。。
签到天数: 74 天连续签到: 1 天[LV.6]常住居民II主题帖子e币
是有这问题 何解?我还定到非洲
签到天数: 2 天连续签到: 1 天[LV.1]初来乍到主题帖子e币
这个难道是百度4.0的一个BUG!
该用户从未签到主题帖子e币
我问过我同事了,还应该在AndroidManifest.xml添加一个service
这位朋友,你帮助了我,我搞了一天的问题,瞬间被你解决了。谢谢啊。。。话说,这你同事。怎么知道需要添加这个service的啊?官方教程都没说呢
签到天数: 7 天连续签到: 1 天[LV.3]偶尔看看II主题帖子e币
卧槽~~~我用3.0的包一点问题都没,但是我现在遇到了麻烦
签到天数: 7 天连续签到: 1 天[LV.3]偶尔看看II主题帖子e币
这酸爽~~就是在定位的时候我想加入搜索要怎么写呢
推荐阅读热门话题
61882420383327281281261260251226218210206203715
1&分钟前1&小时前昨天&23:49昨天&19:27昨天&19:21昨天&19:02昨天&16:01昨天&13:08昨天&12:31昨天&09:12前天&23:58前天&16:10前天&12:41前天&11:20前天&00:363&天前
Powered byAndroid使用百度定位SDK 方法及错误处理-android100学习网
Android使用百度定位SDK 方法及错误处理
之前我的项目中的位置定位使用的是基站方法,使用的Google提供的API,但是前天中午突然就不返回数据了,到网上搜了一下才知道,Google的接 口不提供服务了,基于时间紧迫用了百度现有的SDK,但是在使用过程中......
& 之前我的项目中的位置定位使用的是基站方法,使用的Google提供的API,但是前天中午突然就不返回数据了,到网上搜了一下才知道,Google的接 口不提供服务了,基于时间紧迫用了百度现有的SDK,但是在使用过程中第一次获取位置总是空值,经过多次实验终于成功。当然,如果需要精确的位置,你可以 再加上位置偏移算法。我的应用对这个要求不高,就没做,一搜一大把,就不多说了。
下面这段话来自 百度地图API&定位SDK
百度地图定位SDK免费对外开放,无需申请key。在使用百度定位SDK前,希望先阅读百度定位地图的API。如果使用则被视为对使用条款的完全接收,并同意接收本协议的各项条款约束。
目前百度地图定位SDK只支持Android和Symbian量大平台,其他产品正在开放中。
下面事例是使用Android平台的部分代码。对于这个平台百度的开放人员已经写了完整的demo,把工程导入到eclipse中之后一般没有错误,如果报错的话,eclipse也会给出提示。一般可以通过将propertie.properties文件名字改为default.properties就 可以了,如果还有错误的话,显示工程activity错误啊什么的,就是SDK版本不对的问题了,你可以通过他的manifest文件查 看&uses-sdk android:minSdkVersion=&8& /&找到这个最小值,比如我下载的是2.6他的最低版本是5,我eclipse默认版本是8,就可以同过右键单击该工程,选择最下面那个properties项,然后在弹出对话框的右侧列表中选择Android,在左侧选择API level为5,也就是2.0,然后确定。就木有问题了。
下面说一下使用该API的具体步骤:
也可以查看百度定位SDK自己的开发指南
1、首先第一步就是搭配环境:
①先将百度demo中的libs文件夹复制到自己的工程。(别忘记把jar包build path)
②然后复制
&service android:name=&com.baidu.location.f& android:enabled=&true&
android:process=&:remote& android:permission=&android.permission.BAIDU_LOCATION_SERVICE&&
&intent-filter&
&&&&&& &action android:name=&com.baidu.location.service_v2.6&&&/action&
&/intent-filter&
&/service&
到manifest的application 节点
接下来复制百度地位SDK需要的permission
&&&&&&& &permission android:name=&android.permission.BAIDU_LOCATION_SERVICE&&&/permission&
&uses-permission android:name=&android.permission.BAIDU_LOCATION_SERVICE&&
&&&&&&& &/uses-permission&
&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&
③ 接下来就可以在代码中放心的使用百度定位SDK了.
& &下面是来自百度的提醒.需要注意的是第五条,因为我们第一次经常定位不到位置:
1、您需要确保程序编译通过。如果对自己写的代码有疑问,可以下载官方高级示例,查看标准源代码。
2、请确保网络通畅,无论是连接wifi还是使用2G/3G信号。
3、定位SDK的调用必须在主线程中。
4、必须在定位SDK启动前设定好参数,例如是否使用GPS,扫描时间间隔设置等。我们强烈建议您设置自己的prodName,并保管好,这样方便我们为您提供更好的定位服务。
5、定位SDK start之后立即执行,这种情况下很难定位成功,因为定位SDK刚开始启动还没有获取到定位信息。这时getlocation一般为null。如果是要获取位置成功,可以在listerner中添加一个判断如果strData为空,则再发起一次定位。
6、定位覆盖率大概在98%。就是说有2%可能服务器没有数据,所以定位会失败。只需要走到别的地方,或者多试几次即可成功定位。
7、请使用真机。在虚拟机上无法进行定位测试。
下面就是我的事例代码:
具体思路是:将开启和获取位置的代码分开来做,可以在程序刚开启的时候就start。因为据上面所说,有时候可能两分钟才能获取到位置,对于我们需要展示信息来说,这是绝对不可以的。如果在主线程卡两分钟后果可想而知的。
需要说名的是:我这里没有设置时间间隔public void setScanSpan ( int ) //设置定时定位的时间间隔。单位ms,如果不设置或者所设置的整数值小于1000(ms)时,采用第一次定位模式。每调用一次requestLocatin(),定位SDK会发起一次定位。请求定位与监听结果一一对应;如果所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。定时定位时,调用一次requestLocation,会定时监听到定位结果。设 定了定时定位后,可以热切换成一次定位,需要重新设置时间间隔小于1000(ms)即可。locationClient对象stop后,将不再进行定位。 如果设定了定时定位模式后,多次调用requestLocation(),则是每隔一段时间进行一次定位,同时额外的定位请求也会进行定位,但频率不会超 过1秒一次。
import android.content.C
import com.baidu.location.BDL
import com.baidu.location.BDLocationL
import com.baidu.location.LocationC
import com.baidu.location.LocationClientO
import com.palmdeal.entity.LocationInfo.SI
import com.palmdeal.util.L
public class LocationProvider {
&&& private static LocationClient mLocationClient =
&&& private static SItude station = new SItude();
&&& private static MyBDListener listener = new MyBDListener();
&&& public LocationProvider(Context context) {
&&&&&&& super();
&&&&&&& this.context =
&&& public void startLocation() {
&&&&&&& mLocationClient = new LocationClient(context);
&&&&&&& LocationClientOption option = new LocationClientOption();
&&&&&&& option.setOpenGps(true); // 打开gps
&&&&&&& option.setCoorType(&bd09ll&); // 设置坐标类型为bd09ll
&&&&&&& option.setPriority(LocationClientOption.NetWorkFirst); // 设置网络优先
&&&&&&& option.setProdName(&demo&); // 设置产品线名称
&&&&&&& mLocationClient.setLocOption(option);
&&&&&&& mLocationClient.registerLocationListener(listener);
&&&&&&& mLocationClient.start();//将开启与获取位置分开,就可以尽量的在后面的使用中获取到位置
&&&& * 停止,减少资源消耗
&&& public void stopListener() {
&&&&&&& if (mLocationClient != null && mLocationClient.isStarted()) {
&&&&&&&&&&& mLocationClient.stop();
&&&&&&&&&&& mLocationClient =
&&&& * 更新位置并保存到SItude中
&&& public void updateListener() {
&&&&&&& if (mLocationClient != null && mLocationClient.isStarted()) {
&&&&&&&&&&& mLocationClient.requestLocation();
&&&&&&&&&&& Logger.i(&update the location&);
&&&& * 获取经纬度信息
&&&& * @return
&&& public SItude getLocation() {
&&& private static class MyBDListener implements BDLocationListener {
&&&&&&& @Override
&&&&&&& public void onReceiveLocation(BDLocation location) {
&&&&&&&&&&& if (location.getCity() == null) {
&&&&&&&&&&&&&&& int type = mLocationClient.requestLocation();
&&&&&&&&&&&&&&& Logger.e(&first request false& + type);
&&&&&&&&&&& }
&&&&&&&&&&& station.latitude = location.getLatitude();
&&&&&&&&&&& station.longitude = location.getLongitude();
&&&&&&& @Override
&&&&&&& public void onReceivePoi(BDLocation arg0) {
&&&&&&&&&&& // return
public class LocationInfo {
&&& /** 经纬度信息结构体 */
&&& public static class SItude {
&&&&&&& /** 纬度 */
&&&&&&& pu
&&&&&&& /** 经度 */
&&&&&&& pub
在使用的时候,在一开始就开启LocationClient,即调用startLocation()方法。我的是在服务服务中的onCreate中调用的,然后在代码中这样使用:
&LocationInfo.SItude station = location.getLocation();
if (station.latitude == 0.0 && station.longitude == 0.0) {
&&&&&& location.updateListener();
&&&&&& station = location.getLocation();
if (station.latitude == 0.0 && station.longitude == 0.0) {
&&&&&&& return &未定位到您现在的位置,请重试&;
location.stopListener();
使用上面的方法后,第一次使用都能拿到位置信息。 &

我要回帖

更多关于 百度地图定位权限 的文章

 

随机推荐