Autore Topic: IllegalStateException se uso Activity Recognition  (Letto 541 volte)

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
IllegalStateException se uso Activity Recognition
« il: 04 Febbraio 2014, 18:16:12 CET »
0
Salve. Sto provando ad aggiungere il servizio di Activity Recognition alla mia app seguendo un libro. Ho seguito tutto per filo e per segno ma ottengo questo errore:

Codice: [Seleziona]
java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called.
            at com.google.android.gms.internal.de.bc(Unknown Source)
            at com.google.android.gms.internal.ez.a(Unknown Source)
            at com.google.android.gms.internal.ez$c.bc(Unknown Source)
            at com.google.android.gms.internal.ey.getLastLocation(Unknown Source)
            at com.google.android.gms.internal.ez.getLastLocation(Unknown Source)
            at com.google.android.gms.location.LocationClient.getLastLocation(Unknown Source)
            at com.loris.stefano.easyroutes.MainActivity$7.onConnected(MainActivity.java:494)
            at com.google.android.gms.internal.de.aZ(Unknown Source)
            at com.google.android.gms.internal.de$f.a(Unknown Source)
            at com.google.android.gms.internal.de$f.a(Unknown Source)
            at com.google.android.gms.internal.de$b.be(Unknown Source)
            at com.google.android.gms.internal.de$a.handleMessage(Unknown Source)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:4787)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
            at dalvik.system.NativeStart.main(Native Method)

Riporto il codice relativo:

onCreate
Codice: [Seleziona]
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Imposto il layout
        setContentView(R.layout.activity_main);
 
        ......

        //Crep il  LocationClient passando il riferimento al callback
        //delle implementazioni dell'interfaccia
        mLocationClient = new LocationClient(this, mConnectionCallbacks, mOnConnectionFailedListener);

        //Inizializzo le variabili dell'Activity Recognition
        mActivityRecognitionClient = new ActivityRecognitionClient(this, mConnectionCallbacks,
                mOnConnectionFailedListener);

        //Creo l'intent per il service che riceverà le informazioni
        final Intent activityRecognitionIntent = new Intent(this,ActivityRecognitionService.class);
        mActivityRecognitionPendingIntent = PendingIntent.getService(this,0,
                activityRecognitionIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        .....
   
    }

onStart
Codice: [Seleziona]
protected void onStart() {
        super.onStart();
        //Connettiamo il LocationClient
        mLocationClient.connect();
        //Avvio il servizio dell'Activity Recognition
        mActivityRecognitionClient.connect();
    }

connectionCallbacks
Codice: [Seleziona]
private GooglePlayServicesClient.ConnectionCallbacks mConnectionCallbacks
            = new GooglePlayServicesClient.ConnectionCallbacks() {

        @Override
        public void onConnected(Bundle bundle) {
            Toast.makeText(MainActivity.this, "Connesso", Toast.LENGTH_SHORT).show();
            //Otteniamo la nostra posizione
            mCurrentLocation = mLocationClient.getLastLocation();
            if (mCurrentLocation != null) {
                Toast.makeText(MainActivity.this, "Ultima Location: "
                        + mCurrentLocation.getLatitude() + ","
                        + mCurrentLocation.getLongitude() , Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Location non ancora disponibile", Toast.LENGTH_SHORT).show();
            }
            final LocationRequest locationRequest = new LocationRequest();
            locationRequest.setInterval(UPDATE_INTERVAL);
            locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            mLocationClient.requestLocationUpdates(locationRequest, mLocationListener);
            //Chiediamo l'update per l'Activity Recognition
            mActivityRecognitionClient.requestActivityUpdates(DETECTION_INTERVAL_MILLISECONDS,
                    mActivityRecognitionPendingIntent);
            mActivityRecognitionClient.disconnect();
        }

        @Override
        public void onDisconnected() {
            Toast.makeText(MainActivity.this, "Disconnesso", Toast.LENGTH_SHORT).show();
        }
    };

Service
Codice: [Seleziona]
public class ActivityRecognitionService extends IntentService {

    //Tag per il Log
    private static final String TAG_LOG = ActivityRecognitionService.class.getName();

    //Costruttore di default
    public ActivityRecognitionService() {
        super("ActivityRecognitionService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        //Inizialmente verifichiamo che ActivityRecognition abbia buoni risultati
        if (ActivityRecognitionResult.hasResult(intent)) {
            //Prendiamo le informazioni dall'Intent ricevuto
            ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
            //Abbiamo anche informazioni sull'accuratezza dei dati
            DetectedActivity mostProbableActivity = result.getMostProbableActivity();
            int confidence = mostProbableActivity.getConfidence();
            int activityType = mostProbableActivity.getType();
            String activityName = getNameFromType(activityType);
            //Altre cose da fare
            Log.i(TAG_LOG, "Nuova attività riconosciuta: " + activityName);
            Toast.makeText(ActivityRecognitionService.this, "Nuova attività riconosciuta: "
                    + activityName, Toast.LENGTH_LONG).show();
        }
    }

    /**
     * Metodo di utilità che ritorna il nome dell'attività in base alla costante type
     *
     * @param activityType La costante type
     * @return Il nome dell'attività
     */
    private String getNameFromType(int activityType) {
        switch (activityType) {
            case DetectedActivity.IN_VEHICLE:
                return "in_vehicle";
            case DetectedActivity.ON_BICYCLE:
                return "on_bicycle";
            case DetectedActivity.ON_FOOT:
                return "on_foot";
            case DetectedActivity.STILL:
                return "still";
            case DetectedActivity.UNKNOWN:
                return "unknown";
            case DetectedActivity.TILTING:
                return "tilting";
        }
        return "unknown";
    }
}

La riga 494 è: mCurrentLocation = mLocationClient.getLastLocation(); dentro l'onConnected(). Se tolgo le parti relative all'Activity Recognition l'app non crasha.

Post unito: 05 Febbraio 2014, 14:14:40 CET
Update: inserendo dei messaggi di Log sembra come se o si connette L'activity recognition oppure il LocationClient. Vanno in conflitto?
« Ultima modifica: 05 Febbraio 2014, 14:14:40 CET da Elmvor, Reason: Merged DoublePost »