900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Android获取经纬度信息(LocationManager)

Android获取经纬度信息(LocationManager)

时间:2020-08-06 23:49:52

相关推荐

Android获取经纬度信息(LocationManager)

Android获取Location信息,Android原生定位方法。

1、LocationUtils.kt

package com.kedacom.convenientshoot.utilsimport android.Manifestimport android.content.Contextimport android.content.Intentimport android.content.pm.PackageManagerimport android.location.*import android.os.Buildimport android.os.Bundleimport android.provider.Settingsimport android.provider.Settings.SettingNotFoundExceptionimport android.support.v4.app.ActivityCompatimport android.text.TextUtilsimport com.kedacom.util.LegoLogobject LocationUtils {private const val REFRESH_TIME = 5000Lprivate const val METER_POSITION = 0.0fprivate var mLocationListener: ILocationListener? = nullprivate var listener: LocationListener? = MyLocationListener()var locationProviderStatus: String? = nullprivate set/*** GPS获取定位方式*/fun getGPSLocation(context: Context): Location? {var location: Location? = nullval manager = getLocationManager(context)//高版本的权限检查if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return null}if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {//是否支持GPS定位//获取最后的GPS定位信息,如果是第一次打开,一般会拿不到定位信息,一般可以请求监听,在有效的时间范围可以获取定位信息location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER)}return location}/*** network获取定位方式*/fun getNetWorkLocation(context: Context): Location? {var location: Location? = nullval manager = getLocationManager(context)//高版本的权限检查if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return null}if (manager.isProviderEnabled(WORK_PROVIDER)) {//是否支持Network定位//获取最后的network定位信息location = manager.getLastKnownLocation(WORK_PROVIDER)}return location}/*** 获取最好的定位方式*/fun getBestLocation(context: Context, criteria: Criteria?): Location? {var criteria = criteriaval location: Location?val manager = getLocationManager(context)if (criteria == null) {criteria = Criteria()}val provider = manager.getBestProvider(criteria, true)// addLocationListener(context, provider, 5*1000l, 0f, null);location = if (TextUtils.isEmpty(provider)) {//如果找不到最适合的定位,使用network定位getNetWorkLocation(context)} else {//高版本的权限检查if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return null}//获取最适合的定位方式的最后的定位权限manager.getLastKnownLocation(provider)}return location}/*** 定位监听*/fun addLocationListener(context: Context, provider: String?, locationListener: ILocationListener?) {addLocationListener(context, provider, REFRESH_TIME, METER_POSITION, locationListener)}/*** 定位监听*/fun addLocationListener(context: Context, provider: String?, time: Long, meter: Float, locationListener: ILocationListener?) {if (locationListener != null) {mLocationListener = locationListener}if (listener == null) {listener = MyLocationListener()}val manager = getLocationManager(context)if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return}manager.requestLocationUpdates(provider, time, meter, listener)}/*** 取消定位监听*/fun unRegisterListener(context: Context) {if (listener != null) {val manager = getLocationManager(context)if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return}//移除定位监听manager.removeUpdates(listener)}}private fun getLocationManager(context: Context): LocationManager {return context.getSystemService(Context.LOCATION_SERVICE) as LocationManager}fun isLocationEnabled(context: Context): Boolean {var locationMode = 0val locationProviders: Stringreturn if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {locationMode = try {Settings.Secure.getInt(context.contentResolver, Settings.Secure.LOCATION_MODE)} catch (e: SettingNotFoundException) {LegoLog.i(e.message)return false}locationMode != Settings.Secure.LOCATION_MODE_OFF} else {locationProviders = Settings.Secure.getString(context.contentResolver, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)!TextUtils.isEmpty(locationProviders)}}fun isPermissionGranted(context: Context, permission: String?): Boolean {val pkgMgr = context.packageManagerreturn pkgMgr.checkPermission(permission, context.packageName) == PackageManager.PERMISSION_GRANTED}fun skipToSettingLocation(context: Context) {val intent = Intent()intent.action = Settings.ACTION_LOCATION_SOURCE_SETTINGScontext.startActivity(intent)}private class MyLocationListener : LocationListener {override fun onLocationChanged(location: Location) {//定位改变监听if (mLocationListener != null) {mLocationListener!!.onSuccessLocation(location)}}override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {//定位状态监听when (status) {LocationProvider.AVAILABLE -> locationProviderStatus = "当前GPS状态为可见状态"LocationProvider.OUT_OF_SERVICE -> locationProviderStatus = "当前GPS状态为服务区外状态"LocationProvider.TEMPORARILY_UNAVAILABLE -> locationProviderStatus = "当前GPS状态为暂停服务状态"}}override fun onProviderEnabled(provider: String) {//定位状态可用监听}override fun onProviderDisabled(provider: String) {//定位状态不可用监听}}/*** 自定义接口*/interface ILocationListener {fun onSuccessLocation(location: Location?)}}

2、LocationUtils .java

package com.kedacom.vehiclecollect.util;import android.content.Context;import android.content.pm.PackageManager;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Build;import android.os.Bundle;import android.support.v4.app.ActivityCompat;import com.kedacom.util.LegoLog;import java.util.List;public class LocationUtils {private volatile static LocationUtils uniqueInstance;String TAG = "FLY.LocationUtils";private LocationManager locationManager;private String locationProvider;private Location location;/*** LocationListern监听器* 参数:地理位置提供器、监听位置变化的时间间隔、位置变化的距离间隔、LocationListener监听器*/LocationListener locationListener = new LocationListener() {/*** 当某个位置提供者的状态发生改变时*/@Overridepublic void onStatusChanged(String provider, int status, Bundle arg2) {}/*** 某个设备打开时*/@Overridepublic void onProviderEnabled(String provider) {}/*** 某个设备关闭时*/@Overridepublic void onProviderDisabled(String provider) {}/*** 手机位置发生变动*/@Overridepublic void onLocationChanged(Location location) {location.getAccuracy();//精确度setLocation(location);}};private Context mContext;private LocationUtils(Context context) {mContext = context;getLocation();}//采用Double CheckLock(DCL)实现单例public static LocationUtils getInstance(Context context) {if (uniqueInstance == null) {synchronized (LocationUtils.class) {if (uniqueInstance == null) {uniqueInstance = new LocationUtils(context);}}}return uniqueInstance;}private void getLocation() {//1.获取位置管理器locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);//2.获取位置提供器,GPS或是NetWorkList<String> providers = locationManager.getProviders(true);if (providers.contains(WORK_PROVIDER)) {//如果是网络定位LegoLog.d("如果是网络定位");locationProvider = WORK_PROVIDER;} else if (providers.contains(LocationManager.GPS_PROVIDER)) {//如果是GPS定位LegoLog.d("如果是GPS定位");locationProvider = LocationManager.GPS_PROVIDER;} else {LegoLog.d("没有可用的位置提供器");return;}// 需要检查权限,否则编译报错,想抽取成方法都不行,还是会报错。只能这样重复 code 了。if (Build.VERSION.SDK_INT >= 23 &&ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return;}if (ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return;}//3.获取上次的位置,一般第一次运行,此值为nullLocation location = locationManager.getLastKnownLocation(locationProvider);if (location != null) {setLocation(location);}// 监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistacelocationManager.requestLocationUpdates(locationProvider, 5000, 3, locationListener);}private void setLocation(Location location) {this.location = location;String address = "纬度:" + location.getLatitude() + "经度:" + location.getLongitude();LegoLog.d(address);}//获取经纬度public Location showLocation() {return location;}// 移除定位监听public void removeLocationUpdatesListener() {// 需要检查权限,否则编译不过if (Build.VERSION.SDK_INT >= 23 &&ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return;}if (locationManager != null) {uniqueInstance = null;locationManager.removeUpdates(locationListener);}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。