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

Как получить местоположение GPS для Android

Привет, я пытаюсь получить текущее местоположение GPS через Android. Я последовал этому учебнику и статье Vogellas. Хотя он не работает. При использовании LocationManager.NETWORK_PROVIDER я всегда получаю широту 51 и долготу 9 - независимо от того, где я стою. При использовании LocationManager.GPS_PROVIDER я ничего не получаю.

Хотя все работает при использовании GMaps: S Не знаю, почему. Как я могу получить текущее местоположение GPS, например, GMaps?

Здесь мой код:

package com.example.gpslocation;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;

public class GPS_Location extends Activity implements LocationListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gps__location);

    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.gps__location, menu);
    return true;
}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

    int latitude = (int) (location.getLatitude());
    int longitude = (int) (location.getLongitude());

    Log.i("Geo_Location", "Latitude: " + latitude + ", Longitude: " + longitude);
}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

}
4b9b3361

Ответ 1

Вот ваша проблема:

int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());

Широта и долгота double -значения, поскольку они представляют собой местоположение в градусах.

Отбрасывая их на int, вы отбрасываете все за запятой, что имеет большое значение. См. "Десятичные градусы - Wiki"

Ответ 2

Попробуйте:

public LatLng getLocation()
    {
     // Get the location manager
     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
     Criteria criteria = new Criteria();
     String bestProvider = locationManager.getBestProvider(criteria, false);
     Location location = locationManager.getLastKnownLocation(bestProvider);
     Double lat,lon;
     try {
       lat = location.getLatitude ();
       lon = location.getLongitude ();
       return new LatLng(lat, lon);
     }
     catch (NullPointerException e){
         e.printStackTrace();
       return null;
     }
    }

Ответ 3

Этот код имеет одну проблему:

int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());

Вы можете изменить int на double

double latitude = location.getLatitude();
double longitude = location.getLongitude();

Ответ 4

Исходная проблема решается путем изменения lat и lon на двойной.

Я хочу добавить комментарий к решению с помощью Location location = locationManager.getLastKnownLocation(bestProvider); Он работает, чтобы узнать последнее известное местоположение, когда для этого было занято другое приложение. Если, например, ни одно приложение не выполняло это с момента запуска устройства, код вернет нули (некоторое время я провел некоторое время, чтобы понять это).

Кроме того, рекомендуется прекратить прослушивание, если нет необходимости в этом locationManager.removeUpdates(this);

Кроме того, даже с разрешениями в manifest, код работает, когда служба определения местоположения включена в настройках Android на устройстве.

Ответ 5

Выдержки: -

try 
        {
          cnt++;scnt++;now=System.currentTimeMillis();r=rand.nextInt(6);r++;
            loc=lm.getLastKnownLocation(best);
            if(loc!=null){lat=loc.getLatitude();lng=loc.getLongitude();}

            Thread.sleep(100);
            handler.sendMessage(handler.obtainMessage());
         } 
        catch (InterruptedException e) 
        {
            Toast.makeText(this, "Error="+e.toString(), Toast.LENGTH_LONG).show();
        }

Как вы можете видеть выше, поток работает вместе с основным потоком активности пользовательского интерфейса, который непрерывно отображает GPS lat, долгое время с текущим временем и случайным броском кубиков.

Если вам интересно, просто проверьте полный код: Местоположение GPS с рандомизированным броском и текущим временем в отдельном потоке