step1:下载定位的SDK
Android 定位SDK 相关下载:
step2:申请APPkey
step3:将相关文件集成进程序
1、将定位jar包放入程序,add as library即可(如只需要定位功能,不需要显示地图,只导入第一个jar包就行)。
2、新建文件夹jniLibs,将下载的.so文件放入。
3、配置清单文件。
<!-- 地图包、搜索包需要的基础权限 -->
<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 android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 高德地图必要!!!(2.0以上需要!否则报错failed to locate 10: 定位服务启动失败 -->
<service android:name="com.amap.api.location.APSService"></service>
<!-- 高德地图 -->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="申请的appkey"></meta-data>
<!--android:value="e5fb98de79f349a62ee838289e093ef0"></meta-data>-->
</application>
step4:布局文件 activity_main.xml
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.amap.api.maps.MapView>
step5:代码部分 MainActivity.java
public class MainActivity extends AppCompatActivity implements AMapLocationListener {
//声明AMapLocationClient类对象,定位发起端
private AMapLocationClient mLocationClient = null;
//声明mLocationOption对象,定位参数
public AMapLocationClientOption mLocationOption = null;
//标识,用于判断是否只显示一次定位信息和用户重新定位
private boolean isFirstLoc = true;
private MapView mapView;
private AMap aMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView= (MapView) findViewById(R.id.map);
initMap(savedInstanceState);//初始化地图相关属性
location(); //开始定位
}
private void initMap(Bundle savedInstanceState) {
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理
mapView.onCreate(savedInstanceState);// 此方法必须重写
if (aMap == null) {
aMap = mapView.getMap();
}
aMap.setTrafficEnabled(false);// 是否显示实时交通状况
aMap.setMapType(AMap.MAP_TYPE_NORMAL);// 正常地图模式,可设置夜间模式和卫星模式等
UiSettings uiSettings = aMap.getUiSettings();//可通过uiSettings改变地图相关属性,例如图标位置,放大缩小图标是否显示。详细请见官方API。
uiSettings.setTiltGesturesEnabled(false);//地图是否允许通过手势来倾斜
}
private void location() {
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(this);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位模式为Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见官方定位类型表
aMapLocation.getLatitude();//获取纬度
aMapLocation.getLongitude();//获取经度
aMapLocation.getAccuracy();//获取精度信息
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(aMapLocation.getTime());
df.format(date);//定位时间
aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
aMapLocation.getCountry();//国家信息
aMapLocation.getProvince();//省信息
aMapLocation.getCity();//城市信息
aMapLocation.getDistrict();//城区信息
aMapLocation.getStreet();//街道信息
aMapLocation.getStreetNum();//街道门牌号信息
aMapLocation.getCityCode();//城市编码
aMapLocation.getAdCode();//地区编码
// 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置
if (isFirstLoc) {
//设置缩放级别
aMap.moveCamera(CameraUpdateFactory.zoomTo(17));
//将地图移动到定位点
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));
//添加marker
aMap.addMarker(getMarkerOptions(aMapLocation));
//获取定位信息
StringBuffer buffer = new StringBuffer();
buffer.append(aMapLocation.getCountry() + ""
+ aMapLocation.getProvince() + ""
+ aMapLocation.getCity() + ""
+ aMapLocation.getProvince() + ""
+ aMapLocation.getDistrict() + ""
+ aMapLocation.getStreet() + ""
+ aMapLocation.getStreetNum());
Log.e("--->",buffer.toString());
isFirstLoc = false;
}
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
switch (aMapLocation.getErrorCode()) {
case 1:
Log.e("--->定位失败", "重要参数为空");
break;
case 2:
Log.e("--->定位失败", "WIFI信息不足");
break;
case 3:
Log.e("--->定位失败", "请求参数获取出现异常");
break;
case 4:
Log.e("--->定位失败", "网络连接异常");
break;
case 5:
Log.e("--->定位失败", "解析XML出错");
break;
case 6:
Log.e("--->定位失败", "定位结果错误");
break;
case 7:
Log.e("--->定位失败", "KEY错误");
break;
case 8:
Log.e("--->定位失败", "其他错误");
break;
case 9:
Log.e("--->定位失败", "初始化异常");
break;
case 10:
Log.e("--->定位失败", "定位服务启动失败");
break;
case 11:
Log.e("--->定位失败", "错误的基站信息,请检查是否插入SIM卡");
break;
case 12:
Log.e("--->定位失败", "您未开启定位权限");
break;
}
}
}
}
//自定义marker,点击时,显示设置信息
private MarkerOptions getMarkerOptions(AMapLocation amapLocation) {
MarkerOptions options = new MarkerOptions();
options.icon(BitmapDescriptorFactory.fromResource(R.mipmap.marker_icon));//设置图标
options.position(new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude()));//设置marker位置
options.title("我在这儿");//标题
options.snippet(amapLocation.getCountry() + "" + amapLocation.getProvince() + "" + amapLocation.getCity() + "" + amapLocation.getDistrict() + "" + amapLocation.getStreet() + "" + amapLocation.getStreetNum());//子标题
//设置多少帧刷新一次图片资源
options.period(60);
return options;
}
@Override
public void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mapView.onResume();
}
@Override
public void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mapView.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mapView.onDestroy();
mLocationClient.stopLocation();//停止定位
mLocationClient.onDestroy();//销毁定位客户端。
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mapView.onSaveInstanceState(outState);
}
}
step6: 常见问题
1、KEY错误:申请属于自己应用的appkey,替换清单文件中的appkey。
2、您未开启定位权限:检查手机是否开启定位权限。
3、定位服务启动失败:需要在清单文件中加这句话。
<service android:name="com.amap.api.location.APSService"></service>