【问题标题】:googleApiClient outside of the activity活动之外的 googleApiClient
【发布时间】:2015-07-11 20:26:15
【问题描述】:

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

【问题讨论】:

  • 请贴一些代码。不清楚是什么问题,理论上应该是可以的。
  • 不幸的是,我现在不能。但问题是 LocationManager(我实现 googleApiClient.ConnectionCallbacks、GoogleApiClient.OnConnectionFailedListener 的自定义类)的更新速度不够快。我的 WeatherActivity 在位置更新之前调用 LocationManager.getLocation,因此为空。
  • 这不是您问题的完整解决方案,但可能会给您一些想法:stackoverflow.com/questions/31734567/…

标签: android


【解决方案1】:

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

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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多