Как мне ждать вызова метода onConnected(), чтобы получить Lat,Long из универсального класса при обращении из Activity в Android?
Я планировал получить широту долготы в деятельности от общего класса.
GPSResource gpsResource = new GPSResource(getApplicationContext());
double lat = gpsResource.getLatitude();
Это всегда возвращает ноль. Как мне изменить код так, чтобы он ожидал вызова onConnected() и затем возвращал значение указанному действию?
Вот мой код для общего класса:
public class GPSResource implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,LocationSource.OnLocationChangedListener,LocationListener
{
private Location location; // location
private double latitude; // latitude
private double longitude; // longitude
private GoogleApiClient mGAC;
private Context mContext;
public static final String TAG = "GPSresource";
private LocationRequest mLocationRequest;
public GPSResource(Context c)
{
mContext = c;
try
{
buildGoogleApiClient();
}
catch(Exception e)
{
Log.d(TAG,e.toString());
}
}
protected synchronized void buildGoogleApiClient()
{
mGAC = new GoogleApiClient.Builder(mContext)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_LOW_POWER)
.setInterval(10 * 1000) // 10 seconds, in milliseconds
.setFastestInterval(1 * 1000); // 1 second, in milliseconds
mGAC.connect();
}
public double getLatitude(){
return latitude;
}
/**
* Function to get longitude
* */
public double getLongitude() {
if (location != null) {
longitude = location.getLongitude();
}
// return longitude
return longitude;
}
@Override
public void onConnected(Bundle bundle) {
Location currentLocation = LocationServices.FusedLocationApi.getLastLocation(mGAC);
if (currentLocation == null)
{
LocationServices.FusedLocationApi.requestLocationUpdates(mGAC, mLocationRequest, this);
}
latitude = currentLocation.getLatitude();
longitude = currentLocation.getLongitude();
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
private boolean checkLocServices()
{
LocationManager manager = null;
boolean isAvailable = false;
try
{
manager = (LocationManager)mContext.getSystemService(mContext.LOCATION_SERVICE);
if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)||manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
{
isAvailable = true;
}
else
{
isAvailable = false;
}
} catch (Exception e) {
e.printStackTrace();
}
return isAvailable;
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if(location!=null)
{
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
1 ответ
Решение
Создайте интерфейс, как показано ниже:
public interface GPSResourceListener { void onLocationUpdated(Location location); }
Реализуйте вышеуказанный интерфейс в своей деятельности и передайте его экземпляр конструктору GPSResource, как показано ниже:
class YourActivity extends AppCompatActivity implements GPSResourceListener { @Override protected void onCreate(Bundle savedInstanceState) { GPSResource gpsResource = new GPSResource(getApplicationContext(), this); } }
Сделайте следующие изменения в классе GPSResource:
... public GPSResource(Context c, GPSResourceListener listener) { mContext = c; mListener = listener ... } ... @Override public void onConnected(Bundle bundle) { ... mListener.onLocationUpdated(currentLocation); } ... @Override public void onLocationChanged(Location location) { if(location!=null) { mListener.onLocationUpdated(location); } }