2016-06-25 1 views
1

Disons que j'ai un BroadcastReceiver dans mon activité principale, qui implémente GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,ResultCallback<Status>.Utilisation de GeofencingApi et .setResultCallback() dans BroadcastReceiver

Maintenant, je veux ajouter mes geofences via:

LocationServices.GeofencingApi.addGeofences(mGoogleApiClient, getGeofencingRequest(),getGeofencePendingIntent()).setResultCallback(this); 

Cependant, je reçois une erreur que je ne peux pas utiliser this dans. setResultCallback, qui a probablement quelque chose à voir avec le fait d'être appelé dans le Broadcastreceiver. Depuis que le résultat est en cours de traitement dans onResult(), comment puis-je obtenir onResult() dans. setResultCallback?

Mon BroadcastReceiver:

WakefulBroadcastReceiver mMessageReceiver = new WakefulBroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      SharedPreferences mahprefs = PreferenceManager.getDefaultSharedPreferences(getApplication()); 
      Integer radius = mahprefs.getInt("radiusnumber",500); 
      String lat = (String) intent.getExtras().get("Latitude"); 
      String longi = (String) intent.getExtras().get("Longitude"); 
      Double alt = intent.getDoubleExtra("Altitude", 0); 
      Boolean geofenceexists = mahprefs.getBoolean("geofenceexists",false); 
      Boolean scharf = mahprefs.getBoolean("scharf",false); 
      Float accuracys = intent.getFloatExtra("Accuracy", 0); 
      String providertype = intent.getStringExtra("Provider"); 
      Number speed = intent.getFloatExtra("Speed", 0); 
      latText.setText(lat); 
      longText.setText(longi); 
      altitude.setText(String.valueOf(alt)+getString(R.string.meter)); 
      accuracy.setText(String.valueOf(accuracys)+getString(R.string.meter)); 
      lcprovidertype.setText(String.valueOf(providertype)); 
      Float bearing = intent.getFloatExtra("Bearing", 0); 
      Log.v("INTENTgetextra", lat); 
      Log.v("INTENTgetextra", longi); 
      SharedPreferences.Editor editor = mahprefs.edit(); 
      editor.putString("latitude", lat); 
      editor.putString("longitude", longi); 
      editor.putString("altitude", String.valueOf(alt)); 
      editor.putString("speed", String.valueOf(speed)); 
      editor.putString("bearing", String.valueOf(bearing)); 
      editor.apply(); 

      //Geofence Managment 
      if(scharf){ 
       if(!geofenceexists){ 
        mGeofenceList.add(new Geofence.Builder().setRequestId("alarmgeofence").setCircularRegion(Double.parseDouble(lat), Double.parseDouble(longi), radius) 
          .setExpirationDuration(Geofence.NEVER_EXPIRE) 
          .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) 
          .build()); 
        LocationServices.GeofencingApi.addGeofences(mGoogleApiClient, getGeofencingRequest(),getGeofencePendingIntent()).setResultCallback(this); 
        Log.v("GEOFENCES",mGeofenceList.toString()); 
        editor.putBoolean("geofenceexists",true); 
        editor.apply(); 
       } 
      } else{ 
       try { 
        mGeofenceList.removeAll(mGeofenceList); 
        LocationServices.GeofencingApi.removeGeofences(mGoogleApiClient, getGeofencePendingIntent()).setResultCallback(onResult(Status null); // Result processed in onResult(). 
        editor.putBoolean("geofenceexists",false); 
        editor.apply(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 




     } 
    }; 

En activité onCreate:

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

Mon activité: public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,ResultCallback<Status> (Et oui toutes les méthodes nécessaires sont importées)

Et mes importations:

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.common.api.Status; 
import com.google.android.gms.location.Geofence; 
import com.google.android.gms.location.GeofencingRequest; 
import com.google.android.gms.location.LocationServices; 
+0

Pourriez-vous partager vos importations et la fonction qui contient l'appel à '.setResultCallback (this);'? – antonio

+0

@antonio bien sûr, regardez ma modification. –

Répondre

1

Je comprends que vos outils MainActivityResultCallback, donc votre code devrait ressembler à ceci:

LocationServices.GeofencingApi.addGeofences(mGoogleApiClient, getGeofencingRequest(),getGeofencePendingIntent()).setResultCallback(MainActivity.this); 
+0

Oui, ça semble être ça. Merci! J'accepterai votre réponse dès que possible. –

0

Ce montant est ridicule de travail pour quelque chose de très simple. Même iOS aborde le géofencing d'une manière beaucoup plus propre.