Android GPS получить текущее местоположение

Я разработал простое приложение для Android, и в этом простом приложении я хочу получить данные GPS о широте и долготе, оно работает правильно в моем эмуляторе, но при установке на реальном устройстве Android оно не работает. Пожалуйста, помогите мне решить эту проблему, и следуйте моему коду. заранее спасибо

public class getLocation extends AppCompatActivity {

private Button btnGetLocation;
private TextView textGPS;
private LocationManager locationManager;
private LocationListener locationListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_get_location);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    btnGetLocation = (Button) findViewById(R.id.btnGetLocation);
    textGPS = (TextView) findViewById(R.id.textViewGps);
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            textGPS.setText("lat: "+location.getLatitude()+" long: "+location.getLongitude());

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {
            startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));

        }
    };

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.INTERNET
            },10);
            return;
        }
    }else{
        configureButton();
    }

}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    switch (requestCode){
        case 10:
            if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                configureButton();
            return;
    }
}

private void configureButton() {

    btnGetLocation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            locationManager.requestLocationUpdates("gps", 0, 0, locationListener);
        }
    });
}

}

Снимок экрана из эмулятора: введите здесь описание изображения

Снимок экрана с мобильного устройства: введите здесь описание изображения


person Gulmuhammad Akbari    schedule 09.04.2016    source источник
comment
Вы запрашиваете только GPS... Ваше устройство должно установить связь со спутниками! Выйдите на улицу и проверьте это! Кроме того, вы не должны использовать жестко закодированный GPS, вы должны использовать locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);   -  person Daniel Nugent    schedule 09.04.2016
comment
Спасибо, я вышел на улицу, это работает   -  person Gulmuhammad Akbari    schedule 09.04.2016


Ответы (3)


Вы запрашиваете только GPS... Ваше устройство должно установить связь со спутниками! В космосе! Выйдите на улицу и проверьте это! Это распространенная проблема при тестировании кода, использующего только GPS, он не очень хорошо работает в помещении.

Кроме того, вы не должны использовать жестко закодированный «gps», вы должны использовать:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

Что касается использования FusedLocationProviderAPI, вы потеряете некоторую точность, но он предлагает значительно улучшенную производительность батареи, поскольку он в значительной степени зависит от сетевого местоположения и использует GPS только в случае крайней необходимости. Полный пример того, как его использовать, см. здесь: https://stackoverflow.com/a/30255219/4409409

person Daniel Nugent    schedule 09.04.2016
comment
Он отлично работает, но когда я хочу сохранить Latitued и Longitued в базу данных, я не могу их получить. - person Gulmuhammad Akbari; 09.04.2016
comment
@GulMuhammadAkbari Вы также должны запросить сетевое местоположение, которое обычно дает местоположение быстрее (когда в зоне действия есть сети Wi-Fi). Суть в том, что вам нужно просто подождать, пока вы не получите местоположение, прежде чем сохранять его в базе данных, поэтому сохраните его в базе данных, когда вы получите местоположения в обратном вызове onLocationChanged(). - person Daniel Nugent; 09.04.2016

добавьте в свой код это. когда это приложение запускается в помещении, возвращайте последнее известное местоположение.

        // Get the location from the given provider
        Location location = locationManager
                .getLastKnownLocation(provider);

        locationManager.requestLocationUpdates(provider, 1000, 1, this);
person mohammad madani    schedule 09.04.2016

API определения местоположения сервисов Google Play предпочтительнее, чем API-интерфейсы определения местоположения платформы Android (android.location), как способ добавления информации о местоположении в ваше приложение.

Пример его использования вы можете найти прямо здесь.

P.S. Не забудьте проверить, предоставлены ли разрешения на вашем устройстве.

person Bogdan Ustyak    schedule 09.04.2016