2016-08-11 2 views
9

Alles baut sich korrekt und läuft im Emulator, aber ich kann nicht scheinen, meine IntentService zu bekommen, um irgendetwas zu loggen. Ich bin sicher, dass es etwas Grundlegendes gibt, das ich vermisse oder übersehe, aber ich bin ziemlich neu in Android/Java und habe an dieser Stelle keine Ideen mehr.Intent nicht erhalten von Android Geofence Ereignis

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

private Geofence geofence; 
private PendingIntent mGeofencePendingIntent; 
private GoogleApiClient mGoogleApiClient; 

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

    LatLng latLng = new LatLng(39.7492350, -104.9913250); 

    geofence = new Geofence.Builder() 
      .setRequestId(GEOFENCE_REQ_ID) 
      .setCircularRegion(latLng.latitude, latLng.longitude, GEOFENCE_RADIUS_IN_METERS) 
      .setExpirationDuration(GEOFENCE_EXPIRATION) 
      .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) 
      .build(); 

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

private boolean checkPermission() { 
    Log.i(TAG, "MainActivity.checkPermission()"); 
    return (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED); 
} 

private GeofencingRequest getGeofencingRequest() { 
    Log.i(TAG, "MainActivity.getGeofencingRequest()"); 
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); 
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); 
    builder.addGeofence(geofence); 
    return builder.build(); 
} 

private PendingIntent getGeofencePendingIntent() { 
    Log.i(TAG, "MainActivity.getGeofencePendingIntent()"); 
    if (null != mGeofencePendingIntent) { 
     return mGeofencePendingIntent; 
    } 

    Intent intent = new Intent(this, GeofenceTransitionsIntentService.class); 
    return PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
} 

@Override 
public void onConnected(Bundle connectionHint) { 
    Log.i(TAG, "MainActivity.onConnected()"); 
    if (checkPermission()) { 
     mGeofencePendingIntent = getGeofencePendingIntent(); 
     LocationServices.GeofencingApi.addGeofences(mGoogleApiClient, getGeofencingRequest(), mGeofencePendingIntent); 
    } else { 
     Log.i(TAG, "Permission not granted"); 
    } 
} 

@Override 
public void onConnectionSuspended(int i) { 
    Log.i(TAG, "MainActivity.onConnectionSuspended()"); 
    if (null != mGeofencePendingIntent) { 
     LocationServices.GeofencingApi.removeGeofences(mGoogleApiClient, mGeofencePendingIntent); 
    } 
} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    Log.i(TAG, "MainActivity.onConnectionFailed()"); 
}} 

Jedes Mal, wenn ich das Gerät lat/lng aktualisieren den Emulator oder die Android-Konsole verwenden, ist keine Absicht durch den folgenden Dienst erhalten:

public class GeofenceTransitionsIntentService extends IntentService { 

public GeofenceTransitionsIntentService() { 
    super(GeofenceTransitionsIntentService.class.getSimpleName()); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    Log.i(TAG, "GeofenceTransitionsIntentService.onHandleIntent()"); 

    GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); 
    if (geofencingEvent.hasError()) { 
     int errorCode = geofencingEvent.getErrorCode(); 
     Log.e(TAG, "Location Services error: " + errorCode); 
    } else { 
     Log.i(TAG, "geofencingEvent was successful"); 
    } 
}} 

Manifest:

<?xml version="1.0" encoding="utf-8"?> 

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <service android:name=".GeofenceTransitionsIntentService" /> 
</application> 

Ich habe die folgenden Quellen referenziert: Android Documentation und Google Sample.

+1

Ich habe ein paar Dinge, die Sie nicht geklärt haben: 1-Haben Sie es auf einem echten Gerät getestet? 2 - Befinden Sie sich innerhalb des angegebenen Breitengrads? 3 - Sind die Google Play-Dienste installiert? 4-Haben Sie versucht, Google Maps zu öffnen und dann den Lat/lng zu aktualisieren? Manchmal ist dies der einzige Weg, um GPS auf einem Emulator arbeiten zu lassen. – fernandospr

+0

Bitte führen Sie Ihre App auf einem echten Gerät und dann sagen. –

Antwort

0

Standortdienste scheinen im Emulator nicht voll funktionsfähig zu sein. Sobald ich ein echtes Gerät eingesteckt habe, hat alles wie erwartet funktioniert.