无需第三方sdk支持的定位功能实现

定位功能

——无第三方sdk嵌入(Android Studio为例)

文档说明:没有内嵌第三方sdk的,通过重写定位相关方法实现定位功能

功能实现步骤:

一、清单文件: AndroidManifest.xml文件中

Key在activity上面,application里面;

Service在activity下面,在application里面。

清单文件配置:

<!--高德定位key -->

<meta-data

    android:name="com.amap.api.v2.apikey"

    android:value="您的key" />

<!--高德定位 -->

<service android:name="com.amap.api.location.APSService"></service>

清单文件中请求权限:


<!--用于进行网络定位-->
<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>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

 

<!--高德定位key -->
<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="您的key"/>

<!--高德定位-->
<service android:name="com.amap.api.location.APSService"></service>

 

高德开发平台:申请key:

http://lbs.amap.com/dev/key/app 

获取sha1方法:

1.>android studio2.2以下:

如何获取SHA1:

双击signingReport

 无需第三方sdk支持的定位功能实现

无需第三方sdk支持的定位功能实现

 

2.>android studio2.2及以上:

 无需第三方sdk支持的定位功能实现

如果4未成功,进行这个操作

 无需第三方sdk支持的定位功能实现

二、app的Dependencies中:

操作如下:File-Project Structure -app-Dependencies-“+”Library dependency-“com.amap.api:location:latest.integration”(如果搜索没有,请多输入几次)

 无需第三方sdk支持的定位功能实现

 无需第三方sdk支持的定位功能实现

三、以上都是配置,现在要开始编码啦

1.新建LocationManager 类

package com.seed.seedproject.manager.location;

import android.content.Context;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.seed.seedproject.bean.MapLocation;

import java.util.ArrayList;
import java.util.List;

/***
 * 定位
 */
public class LocationManager {

    public static final intSTATUS_OK =1;
    public static final int STATUS_ERROR= 0;
    private static LocationManagermLocationManager;
    private ContextmContext =null;
    private boolean mIsLocationing= false;
    private List<OnLocationResultListener>mListeners =new ArrayList<OnLocationResultListener>();
    private AMapLocationClientmLocationClient;
    private AMapLocationClientOptionmLocationOption;

    public static LocationManagergetInstance(Context context) {
        if(mLocationManager== null) {
            mLocationManager= newLocationManager(context);
        }
        returnmLocationManager;
    }

    privateLocationManager(Context context) {
        mContext= context;

    }

    public voidstartRequestLocation() {
        if(!mIsLocationing) {
            mIsLocationing= true;
            initLocation();
            mLocationClient.startLocation();
        }
    }


    /**
     * 初始化定位
     *
     *
@authorhongming.wang
     *
@since2.8.0
     */
    
private voidinitLocation() {
        //初始化client
        mLocationClient= newAMapLocationClient(mContext.getApplicationContext());
        //设置定位参数
        mLocationOption= getDefaultOption();
        mLocationClient.setLocationOption(mLocationOption);
        //设置定位监听
        mLocationClient.setLocationListener(mAMapLocationListener);
    }


    /**
     * 默认的定位参数
     *
     *
@authorhongming.wang
     *
@since2.8.0
     */
    
privateAMapLocationClientOption getDefaultOption() {
        AMapLocationClientOption mOption =new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
        mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setInterval(60* 1000);//可选,设置定位间隔。默认为2
        mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
        mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
        mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选,设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false
        mOption.setWifiScan(true);//可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
        mOption.setLocationCacheEnable(true);//可选,设置是否使用缓存定位,默认为true
        returnmOption;
    }


    public voidstopRequestLocation() {
        if(mIsLocationing) {
            //移除定位请求
            mLocationClient.unRegisterLocationListener(mAMapLocationListener);
            //销毁定位
            mLocationClient.onDestroy();
            mIsLocationing= false;
        }
    }

    public voidregisterLocationResultListener(OnLocationResultListener listener) {
        synchronized(mListeners) {
            if(!mListeners.contains(listener)) {
                mListeners.add(listener);
            }
        }
    }

    public voidunRegisterLocationResultListener(OnLocationResultListener listener) {
        synchronized(mListeners) {
            if(mListeners.contains(listener)) {
                mListeners.remove(listener);
            }
        }
    }

    private voiddispatchLocationResult(intstatus,MapLocation location) {
        synchronized(mListeners) {
            for(OnLocationResultListener listener : mListeners) {
                listener.onLocationResult(status,location);
            }
        }
    }

    public voidremoveAllListener() {
        synchronized(mListeners) {
            mListeners.clear();
        }
    }

    public booleanisFinished() {
        return!mIsLocationing;
    }

    privateAMapLocationListener mAMapLocationListener= newAMapLocationListener() {

        @Override
        public voidonLocationChanged(AMapLocation amapLocation) {
            if(amapLocation != null
                    && amapLocation.getErrorCode() ==0) {
                stopRequestLocation();
                dispatchLocationResult(STATUS_OK,MapLocation.clone(amapLocation));
            }else {
                stopRequestLocation();
                dispatchLocationResult(STATUS_ERROR,MapLocation.clone(amapLocation));
            }
        }
    };

    public interface OnLocationResultListener {
        voidonLocationResult(intstatus,MapLocation location);
    }
}

2.新建MapLocation实体类

package com.seed.seedproject.bean;

import com.amap.api.location.AMapLocation;

/**
 * 高德定位
 */
public class MapLocation {
    privateString mCountry;
    private StringmAddress;
    private StringmProvince;
    private StringmCity;
    private StringmDistrict;
    private StringmAoiinfo;
    private StringmStreet;
    private float mSpeed;
    private double mLongitude;
    private StringmPoiName;
    private StringmErrorMessage;
    private int mErrorCode= 0;
    private long mTime;
    private double mLatitude;

    public static MapLocationclone(AMapLocation amapLocation) {
        MapLocation location = new MapLocation();
        location.mCountry= amapLocation.getCountry();
        location.mProvince= amapLocation.getProvince();// 获取省
        location.mCity= amapLocation.getCity();// 获取城市
        location.mDistrict= amapLocation.getDistrict();// 获取区
        location.mAoiinfo= amapLocation.getAoiName();

        location.mAddress= amapLocation.getAddress();
        location.mStreet= amapLocation.getStreet();// 获取县
        location.mLatitude= amapLocation.getLatitude();
        location.mSpeed= amapLocation.getSpeed();
        location.mTime= amapLocation.getTime();
        location.mLongitude= amapLocation.getLongitude();
        location.mErrorMessage= amapLocation.getErrorInfo();
        location.mErrorCode= amapLocation.getErrorCode();
        location.mPoiName= amapLocation.getPoiName();
        return location;
    }

    public booleanisEquals(MapLocation location) {
        returnlocation != null&& mLongitude== location.mLongitude
                &&mLatitude == location.mLatitude&&
                mTime== location.getTime();
    }

    publicString getPoiName() {
        returnmPoiName;
    }

    public intgetErrorCode() {
        returnmErrorCode;
    }

    publicString getErrorMessage() {
        returnmErrorMessage;
    }

    publicString getAddress() {
        returnmAddress;
    }

    publicString getAoiinfo() {
        returnmAoiinfo;
    }

    publicString getCountry() {
        returnmCountry;
    }

    publicString getProvince() {
        returnmProvince;
    }

    publicString getCity() {
        returnmCity;
    }

    publicString getDistrict() {
        returnmDistrict;
    }

    publicString getStreet() {
        returnmStreet;
    }

    public doublegetLatitude() {
        returnmLatitude;
    }

    public doublegetLongitude() {
        returnmLongitude;
    }

    public floatgetSpeed() {
        returnmSpeed;
    }

    public longgetTime() {
        returnmTime;
    }


    @Override
    publicString toString() {
        return"MapLocation [mAddress=" +mAddress +", mProvince=" +mProvince
                +", mCity=" +mCity +", mDistrict=" +mDistrict
                +", mStreet=" +mStreet +", mSpeed=" +mSpeed
                +", mLongitude=" +mLongitude +", mPoiName=" +mPoiName
                +", mErrorMessage=" +mErrorMessage +", mErrorCode=" +mErrorCode
                +", mTime=" +mTime +", mCountry=" +mCountry
                +", mAoiinfo=" +mAoiinfo +", mLatitude=" +mLatitude
                +"]";
    }

}

 

3.在使用类中:

1>请求手机定位权限(6.0及以上系统,需要自行代码中请求以下两个权限)

private static final String[] PERMISSIONS = new String[]{

       Manifest.permission.ACCESS_COARSE_LOCATION,

       Manifest.permission.ACCESS_FINE_LOCATION,};

private boolean mIsLocationFinish;

private static finalString[] PERMISSIONS= newString[]{
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION,
};

private booleanmIsLocationFinish;

 

 

/***
 * 开始定位
 */
private void initLocation() {
    if(!mIsLocationFinish) {
        mLocationManager= LocationManager.getInstance(getActivity());
        mLocationManager.registerLocationResultListener(this);
        mLocationManager.startRequestLocation();
    }
}

 

/***
 * 注销监听
 */

@Override
public void onDestroy() {
    super.onDestroy();
    if (mLocationManager!= null) {
        mLocationManager.stopRequestLocation();
        mLocationManager.unRegisterLocationResultListener(this);
    }
}

/***
 * 高德导航定位成功
 */
@Override
public void onLocationResult(intstatus,MapLocation location) {
    if(status == LocationManager.STATUS_OK) {
        mIsLocationFinish= true;
        if (!TextUtils.isEmpty(location.getCity())) {
            resultCity= location.getCity();
        }
        if(TextUtils.isEmpty(mTvCity.getText().toString())) {
            mTvCity.setText(resultCity);
        }
    }
}

 

 

 

四、百度云链接地址及密码

链接: https://pan.baidu.com/s/1kVgNUIz 密码: 2p6i