2016-04-09 8 views
5

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

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

} 

Снимок экрана из эмулятора: enter image description here

Снимок экрана с мобильного телефона: enter image description here

+1

Вы запрашиваете только GPS ... Ваше устройство должно связаться со спутниками! Выйдите на улицу и протестируйте ее! Кроме того, вы не должны использовать «gps» жестко закодированный, вы должны использовать 'locationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, locationListener);' –

+0

Спасибо, что я вышел за его работу –

ответ

4

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

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

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

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

+0

Он отлично работает, но когда я хочу сэкономить Latitued и Longitued к базе данных я не могу получить их. –

+0

@GulMuhammadAkbari Вы также должны запросить местоположение сети, которое обычно дает местоположение быстрее (когда в сети есть сети WiFi). В нижней строке вам нужно просто подождать, пока вы не получите местоположение, прежде чем сохранять его в базу данных, чтобы сохранить его в базе данных, когда вы получаете локации в обратном вызове 'onLocationChanged()'. –

1

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

Вы можете найти пример того, как использовать это право here.

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

2

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

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

     locationManager.requestLocationUpdates(provider, 1000, 1, this); 
Смежные вопросы