从FusedLocationProviderClient android获取纬度和经度值

时间:2019-04-27 05:37:55

标签: android location

我正在尝试使用FusedLocationProviderClient来获取当前位置的纬度和经度。到目前为止,我的代码如下:

清单

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

布局:有一个按钮

build.gradle

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

Java

ArrayList<String> Coord_Array;

内部OnCreate方法

private FusedLocationProviderClient client;
client = LocationServices.getFusedLocationProviderClient( ShowOutletParams.this );
Coord_Array = new ArrayList<String>();

OnCreate方法之外-我在按钮onclicklistener内使用getLocation()

private String getLocation() {
        if (ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        client.getLastLocation().addOnSuccessListener( ShowOutletParams.this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                if (location != null) {
                    String locat = location.toString();
                    String lat = locat.substring(15,24);
                    String longi = locat.substring(25,34);
                    Coord_Array.add(lat);
                    Coord_Array.add(longi);
                    //return Coord_Array;
                }
            }
        } );

    }

当我添加Log.i记录lat和long值时,我可以在日志中看到它们,但是我希望将它们另存为字符串,以便以后使用。
我知道void不会返回任何内容。...但是Coord_Array也不会返回或打印纬度和经度。

3 个答案:

答案 0 :(得分:2)

主要问题是您的方法private String getLocation()在任何位置实际可用之前返回(我很确定它不会通过查看而编译)。

当您在这里:

if (ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
   return;
}

您仍然处于方法的标准流程中。但是一旦你通过这里:

client.getLastLocation().addOnSuccessListener(

您的public void onSuccess(Location location)中的所有代码现在正在运行之后,您对getLocation()的调用已经返回!

一种简单的解决方案是将回调传递到您的getLocation()方法中,以便可以在该方法已返回给其调用方(例如

)后
public interface LocationAvailableListener {
    public void onLocationAvailable(Location location)
}

public void getLocation(LocationAvailableListener locationAvaialbleCallback, Runnable locationNotAvailableCallback) {
...

然后,在检查权限时,您现在可以触发故障回调:

if (ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( ShowOutletParams.this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
   locationNotAvailableCallback.run();

   return;
}

,然后在您的onSuccess

if (location != null) {
   locationAvaialbleCallback.onLocationAvailable(location);
}
else {
   locationNotAvailableCallback.run();
}

然后使用:

getLocation(
   location -> {
      String latitude = String.valueOf(location.getLatitude());
      String longitude = String.valueOf(location.getLongitude());

      // Add to your ArrayList here
      // Save to your database or wherever for later
   },
   { Log.i(TAG, "Failed to get Location"); })

由于您曾经询问过要保留位置数据,因此this reference应该通过一些简单的JSON序列化为您指明正确的方向。

答案 1 :(得分:1)

您应该尝试:

client.getLastLocation().addOnSuccessListener( ShowOutletParams.this, new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
                    if (location != null) {
                        double mLatitude = location.getLatitude();
                        double mLongitude = location.getLongitude();                           
                    }
                });
            } else {
                Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
            }}

如果仍然要对tutorial

进行问题检查

答案 2 :(得分:0)

您必须直接从位置对象获取经度和纬度,然后根据需要将其强制转换为字符串。

在科特林:

lat = location.latitude.toString()

和在Java中:

lat = location.getLatitude() + "";