我正在尝试使用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
也不会返回或打印纬度和经度。
答案 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() + "";