Autore Topic: Localizzazione con GoogleAPI senza gps  (Letto 530 volte)

Offline smartgatto

  • Utente junior
  • **
  • Post: 97
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S5
  • Sistema operativo:
    Windows 7
Localizzazione con GoogleAPI senza gps
« il: 11 Giugno 2015, 18:01:18 CEST »
0
Ciao a tutti, ho creato un service che quando viene chiamato restituisce le coordinate GPS tramite le GoogleAPI e LocationRequest ed è tutto ok.
Vorrei però (se è possibile), fare un altro service che restituisce le coordinate approssimative basandosi non sul GPS ma su..celle? altro? come potrei fare?
ho provato a mettere
Codice: [Seleziona]
mLocationRequest = LocationRequest.create()
                    .setPriority(LocationRequest.PRIORITY_LOW_POWER)
                    .setInterval(10 * 1000)        // 10 seconds, in milliseconds
                    .setFastestInterval(1 * 1000); // 1 second, in milliseconds

e anche PRIORITY_NO_POWER ma niente...mi restituisce NULL se disattivo il wifi e il gps...

qualche dritta?
grazie!

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Localizzazione con GoogleAPI senza gps
« Risposta #1 il: 12 Giugno 2015, 18:05:34 CEST »
0
Io uso PRIORITY_BALANCED_POWER_ACCURACY e funziona.
Ho provato anche PRIORITY_NO_POWER e mi funzionava anche questo.

Sei sicuro che il problema non stia da qualche altra parte?
Il cellulare ha agganciato la cella? Hai una connessione dati?

Usi le nuove FusedLocationApi?

Ciao

Offline smartgatto

  • Utente junior
  • **
  • Post: 97
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S5
  • Sistema operativo:
    Windows 7
Re:Localizzazione con GoogleAPI senza gps
« Risposta #2 il: 13 Giugno 2015, 09:52:08 CEST »
0
Scusa cosa intendi per "usi le nuove FusedLocationApi?" ?
Se intendi che per localizzare uso le api di google si, se invece intendi che in qualche modo (che non conosco) bisogna aggiornare qualcosa allora no....

Post unito: [time]13 Giugno 2015, 10:08:35 CEST[/time]
Metto il listato di prova:

MainActivity.java
Codice: [Seleziona]
public class MainActivity extends FragmentActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {

    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;

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

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        // Create the LocationRequest object
        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_NO_POWER)
                .setInterval(600000)        // 10 seconds, in milliseconds
                .setFastestInterval(0); // 1 second, in milliseconds
    }

    @Override
    protected void onResume() {
        super.onResume();
        mGoogleApiClient.connect();
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mGoogleApiClient.isConnected()) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
            mGoogleApiClient.disconnect();
        }
    }


    private void handleNewLocation(Location location) {

        location.getLatitude();
        location.getLongitude();
        double latix = location.getLatitude();
        double longix = location.getLongitude();
        TextView longitudine = (TextView) findViewById(R.id.longitudine);
        TextView latitudine = (TextView) findViewById(R.id.latitudine);
        longitudine.setText(Double.toString(longix));
        latitudine.setText(Double.toString(latix));
        if (latix != 0) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
            mGoogleApiClient.disconnect();
        }
    }




    @Override
    public void onConnected(Bundle bundle) {
        Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (location == null) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
        else {
            handleNewLocation(location);
        }
    }


    @Override
    public void onConnectionSuspended(int i) {

    }



    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        if (connectionResult.hasResolution()) {
            try {
                connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        } else {
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        handleNewLocation(location);
    }
}

e relativo main_activity.xml:
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/layout_padding">

    <TextView
        android:id="@+id/latitude_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@string/latitude_label"
        android:textSize="@dimen/lat_long_text_size" />

    <TextView
        android:id="@+id/latitudine"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/latitude_label"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/latitude_label"
        android:textIsSelectable="true"
        android:textSize="@dimen/lat_long_text_size" />

    <TextView
        android:id="@+id/longitude_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@string/longitude_label"
        android:layout_marginTop="@dimen/text_margin"
        android:textSize="@dimen/lat_long_text_size" />

    <TextView
        android:id="@+id/longitudine"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/longitude_label"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/longitude_label"
        android:textIsSelectable="true"
        android:layout_marginTop="@dimen/text_margin"
        android:textSize="@dimen/lat_long_text_size"/>
</RelativeLayout>

Post unito: 13 Giugno 2015, 10:44:20 CEST
Scusate, mi sono dimenticato di specificare che se avvio l'app (con il GPS disattivato) mi restituisce sempre NULL...
« Ultima modifica: 13 Giugno 2015, 10:44:20 CEST da smartgatto, Reason: Merged DoublePost »

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Localizzazione con GoogleAPI senza gps
« Risposta #3 il: 15 Giugno 2015, 10:59:51 CEST »
0
Scusa cosa intendi per "usi le nuove FusedLocationApi?" ?

Intendevo se usavi i metodi di FusedLocationApi.
Ci sono almeno altri 2 metodi:
 - usare l'SDK di Android (LocationManager), che non usa i Play Services
 - usare la vecchia interfaccia di localizzazione dei PlayServices (LocationClient), deprecata recentemente

Cmq, a parte questa digressione...
volevo fare 3 considerazioni.
- A mio parere LocationRequest.PRIORITY_NO_POWER ha senso usarlo (in requestLocationUpdates) con qualche Service, registrando il PendingIntent. Con questa priority, potrebbe non arrivarti un aggiornamento anche per 10, 30 o 60 minuti... e dubito che l'utente passi tutto questo tempo a fissare la tua Activity aperta.

- Quindi, se vuoi avere la posizione subito, io lo sostituirei con PRIORITY_BALANCED_POWER_ACCURACY (il PRIORITY_LOW_POWER non l'ho mai usato, dovrebbe funzionare pure quello).
Inoltre, una volta ottenuto "null" dalla getLastLocation, devi attendere con l'activity attiva fin quando vien chiamata la onLocationChanged, ma credo anche questo tu l'abbia fatto, no?

- Ultimo dubbio è la connessione di rete. In passato nei miei test ho provato a disabilitare GPS e Wifi (anche per la localizzazione, come saprai, adesso si può disattivare il Wifi, ma lasciare cmq, che venga usato per la localizzazione) e il telefono si è localizzato ad un paio di Km da qui in mezzo ai campi (immagino dove ci sono i ripetitori telefonici). Però NON SO se dalla cella il telefono ottiene direttamente le coordinate oppure se ottiene un ID ed ha bisogno di accedere ad un servizio di rete per convertirlo in lat-long. In quest'ultimo caso, essendo il Wifi disabilitato devi avere la connessione dati dell'operatore attiva.

Ciao.