当前位置: 首页 > 知识库问答 >
问题:

即使使用融合的位置API关闭gps,如何获取位置更新?

封昊天
2023-03-14

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

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

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

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

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

共有1个答案

鲜于仰岳
2023-03-14

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

  1. Gps
  2. 网络定位提供商
  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());
}

有关Fused Location API的更多信息,请参阅使ypur应用程序位置感知故障排除位置更新

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

  • 你添加了必要的权限了吗?确保你的应用程序拥有互联网访问_粗略_位置权限,以确保可以访问该位置,如上述指南所示
  • 您在调用LocationServices时是否会出现空值。FusedLocationApi。getLastLocation?这是正常的,因为此方法仅在另一个应用程序最近检索到某个位置时返回。如果返回null,这意味着您需要使用LocationServices开始接收位置更新。FusedLocationApi。RequestLocation在收到如上所示的位置之前更新
  • 你想在genymotion模拟器上找到位置吗?确保已启用GPS并正确配置lat/lng。如果需要,请尝试重新启动模拟器,重新启用GPS或尝试设备(或官方模拟器),以排除genymotion特定的问题
 类似资料:
  • 问题内容: 干杯,我正在尝试通过Android获取当前的GPS位置。我也遵循了这篇教程和Vogellas的文章。虽然没有用。使用LocationManager.NETWORK_PROVIDER时,无论我站在哪里,我总能得到51的纬度和9的经度。当使用LocationManager.GPS_PROVIDER时,我什么也没得到。 虽然使用GMaps时一切正常::S不知道为什么。如何像GMaps一样获取

  • 问题内容: 关于基本的Android编程,我还有另一个问题: 如何访问GPS以获取正在运行该应用程序的手机的当前位置?检索信息需要多长时间?在这种情况下,GPS可能会被禁用,如何再次启用/禁用它。 必须在andorid清单中授予哪些权限? 问候和感谢您的回答, 诗丹 问题答案: 一些答案: 访问:请参见LocationManager和LocationListener。 权限:android.per

  • 我一直在尝试使用andriod中的融合位置应用程序接口获取位置(lat/lon)。当wifi和gps都打开时,我的代码运行良好。如果我关闭gps,那么我不会得到任何位置更新。 我正在使用BALANCED_POWER_ACCURACY进行位置请求。我在清单中添加了Access_FINE_Location权限,并在我的build.gradle文件中使用了播放服务版本9.2.1。 我正在真实设备上进行测

  • 我们的应用程序使用Google Fused location API每3分钟接收一次位置更新。位置请求设置如下- 间隔- 最快间隔- 优先级- 在正常运行的场景中,位置更新被正确地接收,并且位置精度相当好(大约20-25米)。 当地图应用程序打开时,它接收到GPS位置,因此我们的应用程序也开始接收位置更新,这些更新基本上来自GPS收发器(我知道这一点,因为随后的位置更新也有速度和高度值)。 当Ma

  • 问题内容: 我正在尝试扩展本机地理位置功能 这样我就可以使用访问者的国家/地区名称(也许返回一个信息丰富的数组)。 到目前为止,我所能找到的只是显示google maps界面的函数,但实际上没有提供我想要的东西,除了该库但由于某种原因在我的计算机上不起作用。我不知道为什么在那里出错了。 无论如何,您知道我怎样才能简单地从纬度和经度值中返回一个包含国家,城市等信息的数组? 问题答案: 如果只需要用户

  • 我尝试了教程GPS和我得到以下错误信息。似乎有什么问题? 如何解决这些问题: 错误信息 1)