美文网首页
android获取位置的经纬度(原生和google)

android获取位置的经纬度(原生和google)

作者: 许夜 | 来源:发表于2022-02-17 17:28 被阅读0次

由于用户主体是在国外,就没有考虑高德和百度或者腾讯地图的库了,如果是国内,建议用国内的地图库。

1.原生(java实现)

实现类代码和注释如下,这个代码排版感觉不太会弄。

public class LocationMethodUtil {

private LocationManager locationManager;

private String locationProvider;//位置提供器

    private final long timeInterval =5000;

private MlocationCallback mlocationCallback =null;

private static LocationMethodUtil instance;

private Context mContext;

public static LocationMethodUtil getInstance(@NonNull final Context context) {

if (instance ==null) {

synchronized (LocationMethodUtil.class) {

if (instance ==null) {

instance =new LocationMethodUtil(context);}

}

}

return instance;

}

LocationListener mListener =new LocationListener() {

@Override

        public void onStatusChanged(String provider,int status,Bundle extras) {//状态改变时调用

        }

@Override

        public void onProviderEnabled(String provider) {//provider启用时调用

        }

@Override

        public void onProviderDisabled(String provider) {//provider失效时调用

        }

// 如果位置发生变化,重新显示

        @SuppressLint("LongLogTag")

@Override

        public void onLocationChanged(Location location) {

            showLocation(location);

}

};

public LocationMethodUtil(Context context) {

mContext = context;

initLocation(context);

}

void  initLocation(Context context){

//1.获取位置管理器

            locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

Criteria criteria =new Criteria();

Log.e("----tag---","locationManager");//设置粗略精确度

            criteria.setAccuracy(Criteria.ACCURACY_FINE);//2.获取位置提供器,GPS或是NetWork

            Listproviders =locationManager.getProviders(criteria,true);

if (providers.contains(LocationManager.NETWORK_PROVIDER)) {//如果是网络定位

locationProvider =LocationManager.NETWORK_PROVIDER;

}else if (providers.contains(LocationManager.GPS_PROVIDER)) {

                locationProvider =LocationManager.GPS_PROVIDER;

}else {

Log.e("----tag---","没有可用的位置提供器");

}

@SuppressLint("MissingPermission")

private void getLocation(Context 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;

}

//获取上次的位置

        Location location ;

        if (locationProvider !=null){

location =locationManager.getLastKnownLocation(locationProvider);

            if (mListener !=null)

locationManager.requestLocationUpdates(locationProvider,timeInterval,1,mListener);//监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace

            if (location !=null) {

showLocation(location);

}

}else {

initLocation(mContext);

}

}

private void showLocation(Location location) {

mlocationCallback.locationSuccess(location);

String address ="纬度:" + location.getLatitude() +"经度:" + location.getLongitude();

}

@SuppressLint("MissingPermission")

public void stopLocation(Context context) {

if(ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_FINE_LOCATION) !=PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_COARSE_LOCATION) !=PackageManager.PERMISSION_GRANTED &&mListener ==null) {

return;

}

locationManager.removeUpdates(mListener);

}

public void startLocation(Context context) {

Log.e("---tag---" ,"开始定位");

if(ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_FINE_LOCATION) !=PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_COARSE_LOCATION) !=PackageManager.PERMISSION_GRANTED) {//没有权限

return;

}

if (locationProvider==null){

initLocation(mContext);

}else {

getLocation(context);

}

public void addCallback(MlocationCallback callbacks) {

mlocationCallback = callbacks;

}

}

2.google的位置库(kotlin实现)

首先集成

implementation'com.google.android.gms:play-services-location:18.0.0'

具体实现类如下

object LocationGoogle {

private lateinit var mLocationRequest:LocationRequest

    private val UPDATE_INTERVAL = (10 *1000 /* 10 secs */).toLong()

private val FASTEST_INTERVAL:Long =5000 /* 2 sec */

    @SuppressLint("MissingPermission")

fun startLocationUpdates(context:Context) {//创建位置的更新请求

        mLocationRequest = LocationRequest()

mLocationRequest.priority =LocationRequest.PRIORITY_HIGH_ACCURACY

        mLocationRequest.interval =UPDATE_INTERVAL

        mLocationRequest.fastestInterval =FASTEST_INTERVAL

        val builder =LocationSettingsRequest.Builder() // 设置位置请求参数,创建请求对象

builder.addLocationRequest(mLocationRequest)

val locationSettingsRequest =builder.build()

val settingsClient =LocationServices.getSettingsClient(context)

settingsClient.checkLocationSettings(locationSettingsRequest)

LocationServices.getFusedLocationProviderClient(context).requestLocationUpdates(

mLocationRequest,object : LocationCallback() {

override fun onLocationResult(locationResult:LocationResult) {

                    onLocationChanged(locationResult.lastLocation)

}},

Looper.myLooper()

)}

fun onLocationChanged(location:Location) {// 获取位置的位置参数

        val msg ="Updated Location: " + java.lang.Double.toString(location.latitude) +"," + java.lang.Double.toString(location.longitude)//位置参数

    }

}

谷歌地图在国内有时候获取不到位置,不知道是不是区域的原因。原生获取效率叶不是很理想,如果有大佬有更高效的方法,敬请赐教。 

相关文章

  • Android获取经纬度

    通过Android的原生api获取经纬度;一些文章都是通过mLocationManager.getProvider...

  • cesium 2 获取鼠标当前位置的经纬度高度

    2 获取鼠标当前位置的经纬度高度 鼠标移动时,实时获取当前鼠标位置的经纬度,相机高度与地图层级。可以在info.v...

  • 搜索附近位置

    先看效果图 实现思路 获取当前经纬度 利用经纬度和中心店获取附近位置 解析获得的数据, 展示 所用库 自动导入库 ...

  • 百度地图

    导入代理方法初始化-开启定位服务调用代理方法获取经纬度停止位置更新利用经纬度使用搜索,搜索坐标获取位置代码 官方的...

  • Android Kotlin TabLayout 拓展:原生Ta

    google 原生 Tablayout( com.google.android.material.tabs.Tab...

  • 站点离我最近排序 (PHP)

    思路: 1、获取我的位置,即:我的经纬度 2、各站点须有位置 即:排序对象有位置经纬度 3、查询要排序的站...

  • 高德获取当前定位并计算两点距离

    最近项目中有涉及到,获取当前位置的经纬度和计算后台返回的经纬度与当前位置距离多少公里的需求!然后就去看了看了高德的...

  • 高德定位和大头针的添加

    自动定位当前城市的经纬度 长按地图获取当前位置的经纬度并且逆地址编码出城市及具体位置 在指定的经纬度添加大头针

  • react native 开启地理位置授权

    效果图: 在用RN 做获取经纬度的时候,发现地理位置在info中配置了,但是还是没有提示用户授权,然后就在原生加了...

  • 1.20 ionic3入门——百度地图地理逆编码

    通过手机gps获取到了坐标(经纬度),通过这个经纬度来获取对应的位置(省份-城市-区县-街道-门牌号),这个过程就...

网友评论

      本文标题:android获取位置的经纬度(原生和google)

      本文链接:https://www.haomeiwen.com/subject/kdgowltx.html