Android 它是如何工作的-requestLocationUpdates()+;位置请求/侦听器

Android 它是如何工作的-requestLocationUpdates()+;位置请求/侦听器,android,location,updates,locationlistener,Android,Location,Updates,Locationlistener,我是新的Android程序员,我在请求本地化更新时遇到了问题 我正在使用来自的教程 我的应用程序可以处理异常,正确获取纬度和经度,地理编码器可以处理显示地址。但我只要求一次位置——或者当位置改变时。我想做时间间隔。现在,我开始实现教程中的代码,看起来是这样的: public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServices

我是新的Android程序员,我在请求本地化更新时遇到了问题

我正在使用来自的教程

我的应用程序可以处理异常,正确获取纬度和经度,地理编码器可以处理显示地址。但我只要求一次位置——或者当位置改变时。我想做时间间隔。现在,我开始实现教程中的代码,看起来是这样的:

public class MainActivity extends Activity implements 
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener,
LocationListener {

private static final int MILLISECONDS_PER_SECOND = 1000;

public static final int UPDATE_INTERVAL_IN_SECONDS = 5;
private static final long UPDATE_INTERVAL =
          MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS;

private static final int FASTEST_INTERVAL_IN_SECONDS = 1;
private static final long FASTEST_INTERVAL =
          MILLISECONDS_PER_SECOND * FASTEST_INTERVAL_IN_SECONDS;

private TextView tvStatus;
private TextView tvLatitude;
private TextView tvLongitude;

LocationRequest mLocationRequest;
LocationClient mLocationClient;
Location mCurrentLocation;

boolean bNetworkEnabled;
boolean bGPSEnabled;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    tvStatus = (TextView)findViewById(R.id.tvStatus);
    tvLatitude = (TextView)findViewById(R.id.tvLatitude);
    tvLongitude = (TextView)findViewById(R.id.tvLongitude);

    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
    mLocationClient = new LocationClient(this, this, this);

    checkProviders();
}
因此,已经实现了间隔和位置请求。但是在我之前给出的链接中,有一条注释我应该在某处使用
requestLocationUpdates()
(可能是
onCreate()
onStart()
,并在
onStop()
上删除请求),但我对此有问题。因此,Eclipse向我展示了3种方法:

requestLocationUpdates(LocationRequest request, LocationListener listener)
requestLocationUpdates(LocationRequest request, PendingIntent CallbackIntent)
requestLocationUpdates(LocationRequest request, LocationListener listener, Looper looper)
所以我认为第一个在这里是最正确的。我应该在
LocationListener
插槽中放置什么?我请求帮助,但很少解释它是如何工作的。

我使用这个:

LocationManager.requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
例如,使用1s间隔:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this);
时间以毫秒为单位,距离以米为单位

这会自动调用:

public void onLocationChanged(Location location) {
    //Code here, location.getAccuracy(), location.getLongitude() etc...
}
我也在脚本中包含了这些,但实际上没有使用它们:

public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
简言之:

public class GPSClass implements LocationListener {

    public void onLocationChanged(Location location) {
        // Called when a new location is found by the network location provider.
        Log.i("Message: ","Location changed, " + location.getAccuracy() + " , " + location.getLatitude()+ "," + location.getLongitude());
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}
    public void onProviderEnabled(String provider) {}
    public void onProviderDisabled(String provider) {}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this);
    }
}

您正在活动MainActivity中实现LocationListener。因此,对并发位置更新的调用如下:

mLocationClient.requestLocationUpdates(mLocationRequest, this);
确保您正在实现的LocationListener来自google api,即导入以下内容:

import com.google.android.gms.location.LocationListener;
而不是这个:

import android.location.LocationListener;
它应该可以正常工作


在执行此操作之前,LocationClient必须真正连接,这一点也很重要。我建议您不要在onCreate或onStart方法中调用它,而是在onResume中调用它。Google Location Api的教程对此进行了很好的解释:

距离始终为米。它不会自动运行。当位置更改时,将调用onLocationChanged。在某些情况下,这需要时间time@JimmyKane我将“最小距离”设置为0,更新间隔按预期工作。当最小距离较高时,如果未超过该距离阈值,则不会触发位置更新。我就是这么理解的,正是我搞砸的。谢谢。:)所以我知道
requestLocationUpdates
会将位置返回到PendingEvent,但我在哪里可以访问返回的位置?要调用此请求,需要一个类来实现位置更新。此实现更改了方法OnLocationChanged(位置)。这是您访问返回位置的位置。公共类MyLocationListener实现LocationListener{…}