2016-04-09 20 views
5

Ho sviluppato una semplice applicazione Android e in questa semplice applicazione voglio ottenere dati GPS analizzati e Longitued, funziona correttamente nel mio emulatore ma quando ho installato sul dispositivo Android reale non funziona. Per favore aiutami a risolvere questo problema e il seguito è il mio codice. Grazie in anticipoGPS Android ottiene posizione corrente

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

} 

Screen shot da emulatore: enter image description here

colpo di schermo da cellulare: enter image description here

+1

Stai richiedendo solo il GPS ... Il tuo dispositivo deve stabilire un contatto con i satelliti! Cammina fuori e testalo! Inoltre, non dovresti usare "gps" codificato, dovresti usare 'locationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, locationListener);' –

+0

Grazie, ho camminato all'esterno funziona –

risposta

4

Stai richiedendo solo il GPS ... Il tuo dispositivo deve stabilire un contatto con i satelliti! Nello spazio! Cammina fuori e testalo! Questo è un problema comune durante il test del codice che utilizza solo il GPS, non funziona molto bene al chiuso.

Inoltre, non si dovrebbe usare "GPS" duro codificati, è necessario utilizzare:

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

Come per l'utilizzo del FusedLocationProviderAPI, si perde un po 'di precisione, ma offre molto migliorato le prestazioni della batteria, dal momento che fa molto affidamento su Network Location, e usa il GPS solo se assolutamente necessario. Per un esempio completo di come utilizzarlo, vedere qui: https://stackoverflow.com/a/30255219/4409409

+0

Funziona bene ma quando voglio salvare il Latitued and Longited to database non posso averli. –

+0

@GulMuhammadAkbari È inoltre necessario richiedere la posizione di rete, che di solito dà una posizione più veloce (quando ci sono reti WiFi nel raggio d'azione). In conclusione, devi solo aspettare finché non ottieni una posizione prima di salvarla nel database, quindi salvala nel database quando ottieni Locations nel callback 'onLocationChanged()'. –

1

Il Google Play services location APIs sono preferiti negli API di localizzazione del quadro Android (android.location) come un modo di aggiungere la consapevolezza della posizione alla tua app.

È possibile trovare l'esempio di come utilizzare nel modo giusto here.

P.S. Non dimenticare di controllare se le autorizzazioni concesse sul tuo dispositivo.

2

aggiungere al codice questo. quando questa app viene eseguita in un luogo chiuso restituisce l'ultima posizione nota.

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

     locationManager.requestLocationUpdates(provider, 1000, 1, this); 
Problemi correlati