Android: местоположение пользователя без locationListener - PullRequest
2 голосов
/ 03 сентября 2011

Я хотел бы знать, возможно ли получить местоположение пользователей без использования LocationListener.

Причина, по которой я спрашиваю, заключается в том, что мои события locationListener не вызываются.

public class LocationActivity extends Activity implements LocationListener{

    private LocationManager m_locationManager;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        LinearLayout content = new LinearLayout(this);
        content.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        content.setOrientation(LinearLayout.VERTICAL);
        content.setBackgroundColor(Color.TRANSPARENT);

        TextView infoLabel = new TextView(this);
        infoLabel.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        infoLabel.setTextSize(20.0f);
        infoLabel.setText("Initializing...");
        content.addView(infoLabel);

        try{
            m_locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            String provider = null;

            if ( m_locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
                provider = LocationManager.GPS_PROVIDER ;
                Log.d("Unity", "Using GPS");
                m_locationManager.requestLocationUpdates(provider, 0, 0, this);
            } else if(m_locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
                provider = LocationManager.NETWORK_PROVIDER;
                Log.d("Unity", "Using Netword");
                m_locationManager.requestLocationUpdates(provider, 0, 0, this);
            } else {
                Log.d("Unity", "Provider Not available");
            }

        }catch(Exception ex){
            Log.d("Unity", "locatons error " + ex.getMessage());
        }

        setContentView(content);

    }

    public void onLocationChanged(Location location) {
        Log.d("Unity", "UserLocation Lat:" + location.getLatitude() + " Long:" + location.getLongitude());
    }
    public void onStatusChanged(String provider, int status, Bundle extras) {Log.d("Unity", "onStatusChanged");}
    public void onProviderEnabled(String provider) {Log.d("Unity", "onProviderEnabled");}
    public void onProviderDisabled(String provider) {Log.d("Unity", "onProviderDisabled");}
} 

См. Этот пост для получения дополнительной информации:

Android: не удается создать обработчик внутри потока, который не вызвал Looper.prepare ()

Изменено, чтобы отразить комментарии mmeyer

1 Ответ

1 голос
/ 03 сентября 2011

Во-первых, вы можете проверить последнее известное местоположение при выборе провайдера с помощью LocationManager.getLastKnownLocation(provider) и посмотреть, не является ли он нулевым и не слишком старым.

Кроме того, ваш код выглядит адекватным.Я подозреваю, что проблема может заключаться в том, что третий параметр в вашем вызове requestLocationUpdates говорит об отправке обновлений, только если местоположение изменилось более чем на 100 метров.Для большинства ситуаций, когда вы работаете в режиме отладки и смотрите logcat, перемещение на сто метров в секунду кажется маловероятным.

Из документации API:

Частотой уведомления можно управлять с помощьюПараметры minTime и minDistance.Если minTime больше 0, LocationManager потенциально может отдыхать в течение миллисекунд minTime между обновлениями местоположения для экономии энергии. Если minDistance больше 0, местоположение будет транслироваться только в том случае, если устройство перемещается с помощью счетчиков minDistance. Чтобы получать уведомления как можно чаще, установите оба параметра на 0.

...