从 FusedLocationProviderClient 获取纬度和经度值 android

Getting Lat and Long values from FusedLocationProviderClient android

我正在尝试使用 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 来记录纬度和经度值时,我可以在日志中看到它们,但是我希望将它们保存为字符串,以便稍后使用。
我知道 void 不会 return 任何东西....但是 Coord_Array 也不会 return 或打印纬度和经度。

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

在 Kotlin 中:

lat = location.latitude.toString()

并在 Java 中:

lat = location.getLatitude() + "";

你应该试试:

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

主要问题是你的方法 private String getLocation() returns 在任何 Location 实际可用之前(而且我很确定它不会通过查看它来编译)。

当你在这里时:

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) 中的所有代码现在 运行 AFTER 您对 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 序列化为您指明正确的方向。