import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
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.amap.api.services.core.ServiceSettings;
import com.unicity.androidside.base.MyApplication;
import timber.log.Timber;
public class LocationUtil {
public static final int REQUEST_PERMISSIONS = 9527;
private AMapLocationClient mLocationClient;
private AMapLocationClientOption mLocationOption;
private LocationCallback callback;
// 单例模式获取实例
private static LocationUtil instance;
private LocationUtil() {
}
public static LocationUtil getInstance() {
if (instance == null) {
instance = new LocationUtil();
}
return instance;
}
/**
* 初始化定位
*/
public void initLocation(Context context, LocationCallback callback) {
this.callback = callback;
ServiceSettings.updatePrivacyShow(context, true, true);
ServiceSettings.updatePrivacyAgree(context, true);
// 初始化定位客户端
try {
if (mLocationClient == null) {
mLocationClient = new AMapLocationClient(context);
}
} catch (Exception e) {
e.printStackTrace();
}
// 初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
mLocationOption.setOnceLocation(true);
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
mLocationOption.setOnceLocationLatest(true);
mLocationOption.setNeedAddress(true);
mLocationOption.setHttpTimeOut(20000);
mLocationOption.setLocationCacheEnable(false);
mLocationClient.setLocationOption(mLocationOption);
// 设置定位回调监听
mLocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null && aMapLocation.getErrorCode() == 0) {
double latitude = aMapLocation.getLatitude();
double longitude = aMapLocation.getLongitude();
String address = aMapLocation.getAddress();
String poiName = aMapLocation.getPoiName();
String aoiName = aMapLocation.getAoiName();
callback.onLocationSuccess(latitude, longitude, address, poiName, aoiName);
} else {
Log.e("AmapError", "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
callback.onLocationFailure(aMapLocation.getErrorCode(), aMapLocation.getErrorInfo());
}
}
});
}
/**
* 开始定位
*/
public void startLocation() {
if (mLocationClient != null) {
mLocationClient.startLocation();
}
}
/**
* 检查 Android 版本并请求权限
*/
public void checkPermissionsAndStartLocation(Context context, int requestCode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, requestCode);
} else {
startLocation();
}
} else {
startLocation();
}
}
/**
* 停止定位
*/
public void stopLocation() {
if (mLocationClient != null) {
mLocationClient.stopLocation();
}
}
/**
* 销毁定位客户端
*/
public void onDestroy() {
if (mLocationClient != null) {
mLocationClient.onDestroy();
}
}
// 定位回调接口
public interface LocationCallback {
void onLocationSuccess(double latitude, double longitude, String address, String poiName, String aoiName);
void onLocationFailure(int errorCode, String errorInfo);
}
}
高德定位工具类封装
于 2024-09-19 09:40:29 首次发布