在项目中有个IM即时消息模块,需要实现分享位置功能。我的第一反应是看下QQ的分享位置,思考实现步骤,后来决定采用基于高德地图定位方案。在集成高德地图时,碰到一些非代码问题:集成后提示INVALID_USER_SCODE,这往往是SHA1或者包名填错,后来检查重新填写才没报错。这让我受益匪浅,对以后的集成第三方库有很大帮助。那瞬间,才深深体会到“实践才是硬道理”。先看下效果图:
接下来整理一下实现步骤:
1、注册高德地图开发者平台账号(如果已经注册忽略次步骤);
2、创建新应用,这里要填写工程主包名、debug调试版的SHA1值、发布版SHA1值;
以window环境获取debug的SHA1值为例,首先敲入cmd打开命令行,进入.android目录,
输入keytool -list -v -keystore debug.keystore指令,按下回车键,然后输入密码(默认为android),再次按下回车,便可以看到SHA1值,右击标记然后选中SHA1对应值便可粘贴。
3、填写完毕提交后,在应用列表可看到新创建的应用,把key值复制下来,在工程的manifest.xml里面填写meta-data:
<!--高德地图的appKey-->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="9de9eda07cb1de54965460cdaf029cff"/>
4、加上定位需要的权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
5、在开发者平台下载定位、地图相关的jar包并且导入到工程里,在gradle的依赖库添加;
compile files('libs/AMap_Location_V1.3.1.jar')
compile files('libs/AMap_Services_V2.3.1.jar')
compile files('libs/AMap_2DMap_V2.9.0.jar')
经过以上步骤,高德地图的第三方库已经集成到工程里,接下来是具体实现。首先是
同步activity的生命周期:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mapView.onCreate(savedIn
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
初始化Map,并且添加位置标志,设置监听器:
if (aMap == null) {
aMap = mapView.getMap();
}
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.location));
marker=aMap.addMarker(markerOptions);
aMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChangeFinish(CameraPosition arg0) {
}
@Override
public void onCameraChange(CameraPosition arg0) {
});
实现AMapLocationListenr的OnMapScreenShotListener接口,重写它们俩提供的方法。需要介绍的是
onMapScreenShot(Bitmap arg0),在该方法里将bitmap压缩成指定尺寸的位置截屏图片,并且保存到本
地存储指定目录里,获取地址返回给上一个activity。这样就可以从指定目录读取位置图片并且展示出来,
同时在图片下方显示对应详细地址。效果图如下:
直到这里,已经介绍完毕分享地理位置流程。如果大家有兴趣,可以自己动手集成下高德地图或者百度地图。毕竟遇到问题,然后自己摸索仔细思考,最后解决问题是程序员的一大乐趣。如果大家需要源码参考,可以到我的博客主页下载。