最近项目里有一个定位当前城市的功能,刚开始我选择用的是百度地图api去开发这个功能,可是根据百度地图提供的开发文档写的代码每次运行获取到的城市位置都是null值,奇怪的是我又能获取到当前位置的经纬度,于是我找了好多篇博客去寻求解决办法,发现获取到的城市的值还是null,后面果断的选择高德地图。
下面分享我是如何实现这个功能的
高德地图开发者官网:http://developer.amap.com/ 开发文档:http://developer.amap.com/api/android-sdk/summary/
1、去高德开发者平台创建应用,并且创建key
去高德题图开发者官网注册一个key(注:一个key只能对应一个项目)
SHA1码获取方式 packname就是项目的包名
2、手动添加高德地图的jar包
在高德地图api官网下载相关jar包(我这个只有一个定位功能)
添加完记得点击右键选择Add As Library将jar包手动添加到依赖库里
3、在main目录下创建jniLibs目录
添加so库
注意:3D地图才需要添加so库,2D地图无需这一步骤
4、在AS中的AndroidManifest.xml配置文件的application标签中加入对应的key
<!-- 地图的key -->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="你的key">
</meta-data>
5、添加对应的权限(包括静态权限和动态权限)
可以通过我另一篇博客去开启应用的权限:如何开启动态权限(注:可以根据你自己的项目添加相对应的权限)
6、获取当前的位置(不显示地图只显示当前位置)
public class MainActivity extends AppCompatActivity {
//声明AMapLocationClient类对象
AMapLocationClient mLocationClient = null;
//声明AMapLocationClientOption对象
public AMapLocationClientOption mLocationOption = null;
private TextView mTextViewLocation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextViewLocation = findViewById(R.id.textView_location);
//获取当前位置信息
getCurrentLocationLatLng();
}
/**
* 初始化定位并设置定位回调监听
*/
private void getCurrentLocationLatLng() {
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
// 同时使用网络定位和GPS定位,优先返回最高精度的定位结果,以及对应的地址描述信息
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。默认连续定位 切最低时间间隔为1000ms
mLocationOption.setInterval(3500);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
}
/**
* 定位回调监听器
*/
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
//获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLocationType();
//获取纬度
double currentLat = amapLocation.getLatitude();
//获取经度
double currentLon = amapLocation.getLongitude();
//获取当前城市位置
mTextViewLocation.setText(amapLocation.getCity());
Log.i("currentLocation", "currentLat : " + currentLat + " currentLon : " + currentLon);
//获取精度信息
amapLocation.getAccuracy();
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
};
@Override
protected void onStart() {
super.onStart();
if (mLocationClient != null) {
// 启动定位
mLocationClient.startLocation();
}
}
@Override
protected void onPause() {
super.onPause();
if (mLocationClient != null) {
//停止定位
mLocationClient.stopLocation();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mLocationClient != null) {
//销毁定位客户端
mLocationClient.onDestroy();
}
}
}
完成以上操作后就能获取到当前位置信息了。
参考:高得地图官方开发文档