Подтвердить что ты не робот

Как это работает - requestLocationUpdates() + LocationRequest/Listener

Я новый Android-кодер, и у меня проблема с запросами обновлений для моей локализации.

Я работаю с учебниками из http://developer.android.com/training/location/receive-location-updates.html.

Мое приложение может обрабатывать исключения, получать широту и длину правильно, а геокодер может обрабатывать отображение адреса. Но я запрашиваю местоположение только один раз - или когда меняется местоположение. Я хотел бы делать временные интервалы. На данный момент я начал внедрять код из учебников, и он выглядит так:

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? Я прошу помощи с небольшим объяснением, как это работает.

4b9b3361

Ответ 1

Вы реализуете LocationListener в своей деятельности MainActivity. Вызов для одновременных обновлений местоположения будет таким образом:

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: https://developer.android.com/training/location/index.html

Ответ 2

Я использую этот:

LocationManager.requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)

Например, используя интервал 1 с:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this);

время в миллисекундах, расстояние в метрах.

Это автоматически вызывает:

public void onLocationChanged(Location location) {
    //Code here, location.getAccuracy(), location.getLongitude() etc...
}

Я также включил их в script, но фактически не использовал их:

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