自2018年10月18日起,高德开发者论坛除车机板块外,其他板块将停止发帖与维护,如您有使用问题请 提交工单 联系我们,感谢您的理解。

查看: 7198|回复: 30
打印 上一主题 下一主题

[应用案例] 快速定位之-在地图加载的同时定位

[复制链接]
最佳答案
334 

8

主题

2587

帖子

5772

积分

超级版主

Rank: 8Rank: 8

积分
5772
跳转到指定楼层
楼主
发表于 2015-7-24 14:13:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在demo中有很多定位的案例,但是他们都给人一个感觉,就是比较慢。
其实它是可以快,主要的原因就是它是在地图加载之后,我们去点击定位按钮它才定位的。。。

为了加快定位速度,在地图加载的同时就开始定位,也就是调调代码位置,就可以做到打开地图应用就可以出现定位小图标了!!话不多说,源码已贴,请笑纳~ (布局文件,用的就是demo中的basemap_activity,就不贴了~

  1. import android.app.Activity;
  2. import android.location.Location;
  3. import android.os.Bundle;

  4. import com.amap.api.location.AMapLocation;
  5. import com.amap.api.location.AMapLocationListener;
  6. import com.amap.api.location.LocationManagerProxy;
  7. import com.amap.api.maps.AMap;
  8. import com.amap.api.maps.AMap.OnMapLoadedListener;
  9. import com.amap.api.maps.MapView;
  10. import com.amap.api.maps.model.BitmapDescriptorFactory;
  11. import com.amap.api.maps.model.LatLng;
  12. import com.amap.api.maps.model.MarkerOptions;
  13. import com.amap.map3d.demo.R;

  14. /**
  15. * 为了加快定位速度,在地图加载的同时就开始定位
  16. */
  17. public class LocationInMapLoadingActivity extends Activity implements
  18.                 AMapLocationListener {
  19.         private AMap aMap;
  20.         private MapView mapView;

  21.         private LocationManagerProxy locationManager;

  22.         /**
  23.          * 记录定位位置
  24.          */
  25.         private LatLng locLatlng;

  26.         @Override
  27.         protected void onCreate(Bundle savedInstanceState) {
  28.                 super.onCreate(savedInstanceState);
  29.                 setContentView(R.layout.basicmap_activity);
  30.                 /*
  31.                  * 设置离线地图存储目录,在下载离线地图或初始化地图设置; 使用过程中可自行设置, 若自行设置了离线地图存储的路径,
  32.                  * 则需要在离线地图下载和使用地图页面都进行路径设置
  33.                  */
  34.                 // Demo中为了其他界面可以使用下载的离线地图,使用默认位置存储,屏蔽了自定义设置
  35.                 // MapsInitializer.sdcardDir =OffLineMapUtils.getSdCacheDir(this);
  36.                 mapView = (MapView) findViewById(R.id.map);
  37.                 mapView.onCreate(savedInstanceState);// 此方法必须重写
  38.                 init();
  39.         }

  40.         /**
  41.          * 初始化
  42.          */
  43.         private void init() {
  44. // 重点在这里,重点在这里,重点在这里--重要的事情说三遍
  45.                 // 在地图加载前就开始定位
  46.                 locationManager = LocationManagerProxy.getInstance(this);
  47.                 // 第一个参数是定位provider,第二个参数时间最短是2000毫秒,第三个参数距离间隔单位是米,第四个参数是定位监听者
  48.                 locationManager.requestLocationData(
  49.                                 LocationManagerProxy.NETWORK_PROVIDER, 2000, 10, this);

  50.                 if (aMap == null) {
  51.                         aMap = mapView.getMap();

  52.                         aMap.setOnMapLoadedListener(new OnMapLoadedListener() {

  53.                                 @Override
  54.                                 public void onMapLoaded() {
  55.                                         // 为了避免如果定位好了,地图加载比定位慢一拍,导致marker没加上的问题
  56.                                         addLocationMarker();
  57.                                 }
  58.                         });
  59.                 }
  60.         }

  61.         /**
  62.          * 添加定位小图标到地图上
  63.          */
  64.         private void addLocationMarker() {
  65.                 if (locLatlng != null) {
  66.                         aMap.clear();
  67.                         aMap.addMarker(new MarkerOptions().position(locLatlng).icon(
  68.                                         BitmapDescriptorFactory
  69.                                                         .fromResource(R.drawable.location_marker)));
  70.                 }
  71.         }

  72.         /**
  73.          * 定位成功后回调函数
  74.          */
  75.         @Override
  76.         public void onLocationChanged(AMapLocation location) {
  77.                 if (location != null) {
  78.                         System.err.println("onlocation changed");
  79.                         // 如果定位成功,记录下位置
  80.                         locLatlng = new LatLng(location.getLatitude(),
  81.                                         location.getLongitude());

  82.                         // 如果地图没问题,添加到地图上
  83.                         if (aMap != null) {
  84.                                 addLocationMarker();
  85.                         }

  86.                 }
  87.         }

  88.         /**
  89.          * 方法必须重写
  90.          */
  91.         @Override
  92.         protected void onResume() {
  93.                 super.onResume();
  94.                 mapView.onResume();
  95.         }

  96.         @Override
  97.         protected void onPause() {
  98.                 super.onPause();
  99.                 if (locationManager != null) {
  100.                         locationManager.removeUpdates(this);
  101.                         locationManager.destroy();
  102.                 }
  103.                 locationManager = null;
  104.         }

  105.         @Override
  106.         protected void onDestroy() {
  107.                 if (locationManager != null) {
  108.                         locationManager.removeUpdates(this);
  109.                         locationManager.destroy();
  110.                 }
  111.                 locationManager = null;
  112.                 super.onDestroy();
  113.         }

  114.         /**
  115.          * 方法必须重写
  116.          */
  117.         @Override
  118.         protected void onSaveInstanceState(Bundle outState) {
  119.                 super.onSaveInstanceState(outState);
  120.                 mapView.onSaveInstanceState(outState);
  121.         }

  122.         /**
  123.          * 此方法已经废弃
  124.          */
  125.         @Override
  126.         public void onLocationChanged(Location location) {
  127.         }

  128.         @Override
  129.         public void onProviderDisabled(String provider) {
  130.         }

  131.         @Override
  132.         public void onProviderEnabled(String provider) {
  133.         }

  134.         @Override
  135.         public void onStatusChanged(String provider, int status, Bundle extras) {
  136.         }

  137. }
复制代码



ps:权限以及key别忘了
  1. <uses-permission android:name="android.permission.INTERNET" />
  2.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  4.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  5.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  6.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  7.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  8.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  9.     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
  10.     <uses-permission android:name="android.permission.WAKE_LOCK" />

  11. ...

  12. <meta-data
  13.             android:name="com.amap.api.v2.apikey"
  14.             android:value="您的key" />
复制代码




回复

使用道具 举报

最佳答案
0 

3

主题

17

帖子

81

积分

新手上路

Rank: 1

积分
81
推荐
发表于 2015-7-28 19:32:34 | 只看该作者
这个必须要收藏一下
编程是一件很有意思的事~
回复 支持 1 反对 0

使用道具 举报

最佳答案
334 

8

主题

2587

帖子

5772

积分

超级版主

Rank: 8Rank: 8

积分
5772
沙发
 楼主| 发表于 2015-7-24 17:56:49 | 只看该作者
定位成功后还可以加一个moveCamera移动到当前定位点,效果更好~
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(locLatlng, 15));//locLatlng是定位点,15是缩放级别
回复 支持 反对

使用道具 举报

最佳答案
0 

5

主题

15

帖子

58

积分

新手上路

Rank: 1

积分
58
地板
发表于 2015-8-12 17:29:45 | 只看该作者
为啥我在模拟器中运行并没有定位呢     求解答
回复 支持 反对

使用道具 举报

最佳答案
334 

8

主题

2587

帖子

5772

积分

超级版主

Rank: 8Rank: 8

积分
5772
5#
 楼主| 发表于 2015-8-13 17:16:04 | 只看该作者
amap_1786516223 发表于 2015-8-12 17:29
为啥我在模拟器中运行并没有定位呢     求解答

在模拟器中使用的话得注意一点~
模拟器本身是不支持定位的,得用其他方式模拟一下,比如eclipse中DDMS下的Emulator Control
回复 支持 反对

使用道具 举报

最佳答案
0 

5

主题

15

帖子

58

积分

新手上路

Rank: 1

积分
58
6#
发表于 2015-8-16 17:29:39 | 只看该作者
zhengxiangyu 发表于 2015-8-13 17:16
在模拟器中使用的话得注意一点~
模拟器本身是不支持定位的,得用其他方式模拟一下,比如eclipse中DDMS下 ...

好的  谢谢
回复 支持 反对

使用道具 举报

最佳答案
0 

4

主题

29

帖子

92

积分

新手上路

Rank: 1

积分
92
7#
发表于 2015-8-22 17:52:05 | 只看该作者
我已经按您说的调整好了位置  但进入时仍然会先显示北京 然后过一会才会调用onLocationChanged函数 然后才会移动到当前位置 是不是我进入地图activity时就要有经纬度信息
回复 支持 反对

使用道具 举报

最佳答案
334 

8

主题

2587

帖子

5772

积分

超级版主

Rank: 8Rank: 8

积分
5772
8#
 楼主| 发表于 2015-8-24 17:52:13 | 只看该作者
amap3VhuG5Mz 发表于 2015-8-22 17:52
我已经按您说的调整好了位置  但进入时仍然会先显示北京 然后过一会才会调用onLocationChanged函数 然后才 ...

不是我进入地图activity时就要有经纬度信息
有可能是定位比较慢的原因,这种写法的话,可以加载地图的同时进行定位,并行可以给人感觉定位变快了,但是如果由于网络或地理等原因导致定位慢的话,还是会先到默认位置的

楼主可以把自己上次定位的位置记录一下,下次进入地图可以默认到上次的位置,有好多是这样做的
回复 支持 反对

使用道具 举报

最佳答案
1 

1

主题

4

帖子

25

积分

新手上路

Rank: 1

积分
25
9#
发表于 2015-8-28 20:37:07 | 只看该作者
好贴,谢谢,收藏
回复 支持 反对

使用道具 举报

最佳答案
1 

10

主题

37

帖子

94

积分

新手上路

Rank: 1

积分
94
10#
发表于 2015-12-8 17:46:48 | 只看该作者
LocationManagerProxy 这个类为什么我没有呢?手动导入也没有啊,就只有一个LocationManagerBase,这个Base的是干啥的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|高德开发者论坛

Copyright ©2014 高德开发者论坛.All Rights Reserved |京ICP证070711号

意见反馈 常见问题 服务条款 联系我们
快速回复 返回顶部 返回列表