看注釋解析基本上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()==){
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();
//給定位用戶端對象設定定位參數
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的定位權限。
**/
}