Android 活动外部的GoogleAppClient

Android 活动外部的GoogleAppClient,android,Android,我开发了一个简单的天气应用程序,但是我的WeatherActivity中有太多的代码,一个类负责处理天气JSON和使用GoogleAppClient检索位置信息。我试图从WeatherActivity类中获取处理位置的代码,但是当我试图在onCreate方法中获取任何位置时,它通常会导致null,可能是因为没有足够的时间进行更新。是否有任何方法可以获取活动之外的用户位置?或者,如果您有其他建议,在这种情况下可能会有所帮助?我一直在寻找一个解决方案,让一个对象来处理当前位置,但我没有找到任何东西。

我开发了一个简单的天气应用程序,但是我的WeatherActivity中有太多的代码,一个类负责处理天气JSON和使用GoogleAppClient检索位置信息。我试图从WeatherActivity类中获取处理位置的代码,但是当我试图在onCreate方法中获取任何位置时,它通常会导致null,可能是因为没有足够的时间进行更新。是否有任何方法可以获取活动之外的用户位置?或者,如果您有其他建议,在这种情况下可能会有所帮助?

我一直在寻找一个解决方案,让一个对象来处理当前位置,但我没有找到任何东西。 所以我这样做了,但有点棘手。 希望对你有帮助

import android.Manifest;
import android.app.Activity;

import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.util.Log;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;

/**
 * This class uses GoogleApiClient to track location changes.
 * In order to connect the GoogleApiClient correctly, this class must be instanciated in onCreate callback.
 */
public class Locator implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {

    private static final String TAG = "Locator";
    private Activity activity;
    private GoogleApiClient googleApiClient;
    private LocationRequest locationRequest;
    private static final long UPDATE_INTERVAL = 60 * 1000;
    private static final long FASTEST_UPDATE_INTERVAL = 10 * 1000;
    private static final int LOCATION_REQUEST = 1;
    private static boolean locationPermissionRequested = false;
    private static boolean locationPermissionGranted = false;
    private Location location;

    /**
     * Default constructor. Ex. Locator locator = new Locator(getActivity());
     *
     * @param activity The activity to instanciate from.
     */
    public Locator(Activity activity) {
        this.activity = activity;
        if (activity != null) {
            googleApiClient = new GoogleApiClient.Builder(activity)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).build();
            locationRequest = new LocationRequest();
            locationRequest.setInterval(UPDATE_INTERVAL);
            locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL);
            locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
            googleApiClient.connect();
        }
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        requestLocation();
    }

    @Override
    public void onConnectionSuspended(int i) {
    }

    @Override
    public void onLocationChanged(Location location) {
        this.location = location;
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    }

    /**
     * Requests the current location to the GoogleApiClient.
     * NB: If device os is Marshmallow or higher, il will also ask permission to acces location services.
     */
    private void requestLocation() {
        if (googleApiClient.isConnected()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                locationPermissionGranted = ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
                if (!locationPermissionGranted) {
                    if (!locationPermissionRequested) {
                        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQUEST);
                        locationPermissionRequested = true;
                        requestLocation();
                    }
                }
            } else {
                locationPermissionGranted = true;
            }
            if (locationPermissionGranted) {
                LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
            } else {
            }
        }
    }

    /**
     * Requests the current location et gets.
     *
     * @return The location.
     */
    public Location getLocation() {
        requestLocation();
        return location;
    }

    /**
     * Stops updating the location. (save battery power).
     */
    public void removeUpdates() {
        LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
    }
}

请发一些代码。现在还不清楚问题出在哪里,理论上这应该是可能的。不幸的是,我现在不能。但问题是LocationManagermy自定义类实现了GoogleAppClient.ConnectionCallbacks、GoogleAppClient.OnConnectionFailedListener,但更新速度不够快。My WeatherActivity在位置更新之前调用LocationManager.getLocation,因此为空。这不是问题的完整解决方案,但可能会给您一些想法: