天天看點

Android高德地圖的定位

看注釋解析基本上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的定位權限。
     **/
}
           

繼續閱讀