无需第三方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
2.>android studio2.2及以上:
如果4未成功,进行这个操作
二、在app的Dependencies中:
操作如下:File-Project Structure -app-Dependencies-“+”Library dependency-“com.amap.api:location:latest.integration”(如果搜索没有,请多输入几次)
三、以上都是配置,现在要开始编码啦
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