看注释解析基本上OK了。
布局,权限:
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<meta-data android:name="com.amap.api.v2.apikey" android:value="你的key"/>
<service android:name="com.amap.api.location.APSService"></service>
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/my_location">
</com.amap.api.maps.MapView>
public class MainActivity extends AppCompatActivity implements LocationSource,AMapLocationListener {
private AMap aMap;
private OnLocationChangedListener mListener;
private MapView mMapView;
//声明AMapLocationClient类对象
public AMapLocationClient mapLocationClient;
//声明AMapLocationClientOption对象
public AMapLocationClientOption mapLocationClientOption;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
setContentView(R.layout.activity_main);
mMapView = (MapView)findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理
mMapView.onCreate(savedInstanceState);
if (aMap==null){
aMap = mMapView.getMap();
}
aMap.setLocationSource(this);// 设置定位监听
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
aMap.setMyLocationEnabled(true);
// 设置定位的类型为定位模式 ,可以由定位、跟随或地图根据面向方向旋转几种
aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
mapLocationClient.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onStop() {
super.onStop();
mapLocationClient.stopLocation();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理
mMapView.onSaveInstanceState(outState);
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation!=null){
if (aMapLocation.getErrorCode()==0){
mListener.onLocationChanged(aMapLocation);// 显示系统小蓝点
StringBuilder stringBuilder = new StringBuilder();
//定位成功回调信息,设置相关消息
int type = aMapLocation.getLocationType();
String address = aMapLocation.getAddress();
stringBuilder.append(type+address);
Toast.makeText(this,stringBuilder.toString(),Toast.LENGTH_SHORT).show();
}else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见下方错误码表。
Log.i("erro info:",aMapLocation.getErrorCode()+"---"+aMapLocation.getErrorInfo());
}
}
}
//激活定位
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
if (mapLocationClient==null){
//初始化AMapLocationClient,并绑定监听
mapLocationClient = new AMapLocationClient(getApplicationContext());
//初始化定位参数
mapLocationClientOption = new AMapLocationClientOption();
//设置定位精度
mapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//是否返回地址信息
mapLocationClientOption.setNeedAddress(true);
//是否只定位一次
mapLocationClientOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
mapLocationClientOption.setWifiActiveScan(true);
//是否允许模拟位置
mapLocationClientOption.setMockEnable(false);
//定位时间间隔
mapLocationClientOption.setInterval(2000);
//给定位客户端对象设置定位参数
mapLocationClient.setLocationOption(mapLocationClientOption);
//绑定监听
mapLocationClient.setLocationListener(this);
//开启定位
mapLocationClient.startLocation();
}
}
//停止定位
@Override
public void deactivate() {
mListener = null;
if (mapLocationClient!=null){
mapLocationClient.stopLocation();
mapLocationClient.onDestroy();
}
mapLocationClient = null;
}
/**
0 定位成功。
1 一些重要参数为空,如context;请对定位传递的参数进行非空判断。
2 定位失败,由于仅扫描到单个wifi,且没有基站信息。
3 获取到的请求参数为空,可能获取过程中出现异常。
4 请求服务器过程中的异常,多为网络情况差,链路不通导致,请检查设备网络是否通畅。
5 返回的XML格式错误,解析失败。
6 定位服务返回定位失败,如果出现该异常,请将errorDetail信息通过[email protected]反馈给我们。
7 KEY建权失败,请仔细检查key绑定的sha1值与apk签名sha1值是否对应。
8 Android exception通用错误,请将errordetail信息通过[email protected]反馈给我们。
9 定位初始化时出现异常,请重新启动定位。
10 定位客户端启动失败,请检查AndroidManifest.xml文件是否配置了APSService定位服务
11 定位时的基站信息错误,请检查是否安装SIM卡,设备很有可能连入了伪基站网络。
12 缺少定位权限,请在设备的设置中开启app的定位权限。
**/
}
时间: 2024-10-13 22:42:42