Android 如何在使用融合定位API关闭gps的情况下获取位置更新?

Android 如何在使用融合定位API关闭gps的情况下获取位置更新?,android,gps,google-play-services,fusedlocationproviderapi,Android,Gps,Google Play Services,Fusedlocationproviderapi,这个问题可能会被问很多次,但我找不到任何解决办法。 我需要在后台获取用户的位置15分钟 当GPS打开时,它可以正常工作,但当GPS关闭时,应用程序不会获得位置更新。我需要它来获取至少网络位置或wifi位置 如何使用融合位置API实现这一点 位置管理器具有此功能,但处于融合位置。因为谷歌建议开发者使用PlayServicesAPI中的位置,所以我不想使用位置管理器。 我如何才能做到这一点,让我发布我迄今为止的尝试: import android.content.Context; import an

这个问题可能会被问很多次,但我找不到任何解决办法。 我需要在后台获取用户的位置15分钟

当GPS打开时,它可以正常工作,但当GPS关闭时,应用程序不会获得位置更新。我需要它来获取至少网络位置或wifi位置

如何使用融合位置API实现这一点

位置管理器具有此功能,但处于融合位置。因为谷歌建议开发者使用PlayServicesAPI中的位置,所以我不想使用位置管理器。 我如何才能做到这一点,让我发布我迄今为止的尝试:

import android.content.Context;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
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.FusedLocationProviderApi;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;

/**
 * Created by 4264 on 14-10-2016.
 */

public class Locationlistener implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,LocationListener  {


    private Location mlocation; // location
    private double latitude; // latitude
    private double longitude; // longitude
    private GoogleApiClient mGAC;
    private Context mContext;
    public static final String TAG = "GPSresource";
    private FusedLocationProviderApi fusedLocationProviderApi;
    private LocationRequest locationRequest;

    public Locationlistener(Context c)
    {
        mContext = c;
        try {
            buildGoogleApiClient();
            mGAC.connect();
        }
        catch(Exception e)
        {
            Log.d(TAG,e.toString());
        }
    }

    protected synchronized void buildGoogleApiClient() {
        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
        locationRequest.setInterval(1);
        locationRequest.setFastestInterval(1);
        mGAC = new GoogleApiClient.Builder(mContext)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
       }


    public double getLatitude(){
        if(mlocation != null){
            latitude = mlocation.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     * */
    public double getLongitude() {
        if (mlocation != null) {
            longitude = mlocation.getLongitude();
        }

        // return longitude
        return longitude;
    }

    public Location GetLocationBlocking() throws InterruptedException {



        //      String lat=String.valueOf(moCurrentLocation.getLatitude());
        //    String longt=String.valueOf(moCurrentLocation.getLongitude());
//        Toast.makeText(oContext,"Lat"+lat+"long"+longt,Toast.LENGTH_SHORT).show();
        return mlocation;

    }


    @Override
    public void onConnected(Bundle bundle) {
            Location oLocation = LocationServices.FusedLocationApi.getLastLocation(mGAC);
            if (mGAC != null) {

                mlocation = oLocation;
            getLatitude();
            getLongitude();
            if (oLocation != null){
              Log.d("lat",String.valueOf(mlocation.getLatitude()));
            Log.d("long",String.valueOf(mlocation.getLongitude()));
            }
            else{
                LocationServices.FusedLocationApi.requestLocationUpdates(mGAC, locationRequest, this);
        }   }}


    @Override
    public void onConnectionSuspended(int i) {

    }




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

    }

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

我不明白你说你不想使用位置管理器和GPS…看看这个。。。基于此文档,我们有3种访问位置的策略:

  • 全球定位系统
  • 网络位置提供商
  • 或者两者兼用
  • 但对于您的位置问题,这是我的报价: 在“活动”中,放置以下内容以连接并开始接收位置更新:

    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;
    
    private long UPDATE_INTERVAL = 10 * 1000;  /* 10 secs */
    private long FASTEST_INTERVAL = 2000; /* 2 sec */
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Create the location client to start receiving updates
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                              .addApi(LocationServices.API)
                              .addConnectionCallbacks(this)
                              .addOnConnectionFailedListener(this).build();
    }
    
    protected void onStart() {
        super.onStart();
        // Connect the client.
        mGoogleApiClient.connect();
    }
    
    protected void onStop() {
        // Disconnecting the client invalidates it.
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
    
        // only stop if it's connected, otherwise we crash
        if (mGoogleApiClient != null) {
            mGoogleApiClient.disconnect();
        }
        super.onStop();
    }
    
    public void onConnected(Bundle dataBundle) {
        // Get last known recent location. 
        Location mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        // Note that this can be NULL if last location isn't already known.
        if (mCurrentLocation != null) {
          // Print current location if not null
          Log.d("DEBUG", "current location: " + mCurrentLocation.toString());
          LatLng latLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
        }
        // Begin polling for new location updates.
        startLocationUpdates();
    }
    
    @Override
    public void onConnectionSuspended(int i) {
        if (i == CAUSE_SERVICE_DISCONNECTED) {
          Toast.makeText(this, "Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show();
        } else if (i == CAUSE_NETWORK_LOST) {
          Toast.makeText(this, "Network lost. Please re-connect.", Toast.LENGTH_SHORT).show();
        }
    }
    
    // Trigger new location updates at interval
    protected void startLocationUpdates() {
        // Create the location request
        mLocationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(UPDATE_INTERVAL)
            .setFastestInterval(FASTEST_INTERVAL);
        // Request location updates
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
            mLocationRequest, this);
    }
    
    然后使用
    onLocationChanged
    注册位置更新:

    public void onLocationChanged(Location location) {
        // New location has now been determined
        String msg = "Updated Location: " +
            Double.toString(location.getLatitude()) + "," +
            Double.toString(location.getLongitude());
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        // You can now create a LatLng Object for use with maps
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
    }
    
    有关融合位置API的更多信息,请参阅 故障排除位置更新

    应始终使用
    GoogleAppClient
    利用
    LocationServices.API
    完成位置更新,如上所示。不要使用可靠性低得多的旧位置API。即使使用正确的
    FusedLocationApi
    ,也会出现很多问题。考虑以下潜在问题:

    • 您是否添加了必要的权限?请确保您的应用程序具有
      互联网
      访问位置
      权限,以确保 如上述指南所示,可以访问该位置
    • 您在呼叫时是否得到空值
      LocationServices.FusedLocationApi.getLastLocation
      这是正常现象 因为此方法仅在已经存在位置时返回 最近由另一个应用程序检索。如果返回null,则 意味着您需要开始使用接收位置更新
      LocationServices.FusedLocationApi.RequestLocationUpdate
      之前 接收如上所示的位置
    • 您是否正在尝试获取genymotion emulator上的位置?确保 您已启用GPS并正确配置lat/lng。尝试重新启动 模拟器(如果需要)并重新启用GPS或尝试设备(或 而不是排除genymotion特定的问题

    它应该在后台运行,而不是在用户交互的情况下运行,那么如何与活动连接请参见此。