从 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 序列化为您指明正确的方向。
我正在尝试使用 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 序列化为您指明正确的方向。