我正在尝试获取智能手机的GPS,例如以下代码:
在 Activity.java
中,我使用以下代码获取 GPS 。
private GPSClass gps;
gps.getGPSLocation();
在 GPSClass.java
public void getGPSLocation(){
FusedLocationProviderClient mLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
mLocationClient.getLastLocation().addOnCompleteListener(mContext, new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if(task.isSuccessful()){
mLocation = task.getResult();
Log.i("getLocation---LOCATION", mLocation.getLatitude() + "/"
+ mLocation.getLongitude());
}
}
});
}
但是如何在 GPSClass.java
中返回值?
我尝试替换
public void onComplete
代替
public Location onComplete
但是显示错误
'onComplete(Task<Location>)' in 'Anonymous class derived from com.google.android.gms.tasks.OnCompleteListener' clashes with 'onComplete(Task<TResult>)' in 'com.google.android.gms.tasks.OnCompleteListener'; attempting to use incompatible return type
我错过了什么吗?如何在OnCompleteListener
中返回值?预先感谢。
答案 0 :(得分:0)
例如,您可以使用回调
public void getGPSLocation(GPSCallback callback){
FusedLocationProviderClient mLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
mLocationClient.getLastLocation().addOnCompleteListener(mContext, new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if(task.isSuccessful()){
mLocation = task.getResult();
Log.i("getLocation---LOCATION", mLocation.getLatitude() + "/"
+ mLocation.getLongitude());
callback.onLocation(mLocation);
}
}
});
}
创建一个名为GPSCallback
的接口,例如
interface GPSCallback{
void onLocation(Location location);
}
并通过回调调用方法
gps.getGPSLocation(new GPSCallback() {
void onLocation(Location location) {
// do what you need to do with the location
}
});
答案 1 :(得分:0)
这是因为您具有回调系统,并且不能将直接返回方法与回调混合使用。
您似乎想要一个简单的方法来直接为您提供位置,但是如您所见,FusedLocationProviderClient.getLastLocation()
返回一个Task
而不是一个直接值。因此,当您使用getGPSLocation()
调用方法时,必须等待任务完成才能检索该值。
如果您想要一个简单的解决方案,则可以在活动中直接调用FusedLocationProviderClient
,而不用创建另一个类:
public class MyActivity extends Activity {
private FusedLocationProviderClient mLocationClient;
@Override
protected void onCreate(){
mLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
mLocationClient.getLastLocation().addOnCompleteListener(mContext, new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if(task.isSuccessful()){
handleLocation(task.getResult();
}
}
});
}
private void handleLocation(Location location){
//Do your handling here
}
}