2016-08-11 9 views
9

Все правильно работает и работает в эмуляторе, но я не могу заставить свой IntentService регистрировать что-либо. Я уверен, что есть что-то основное, что я пропускаю или не замечаю, но я довольно новичок в Android/Java и на данный момент исчерпал идеи.Намерение, полученное от события Geofence от Android

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

Всякий раз, когда я обновлю это устройство LAT/LNG, используя эмулятор или андроида консоли, никакого намерения не получает следующие услуги:

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> 

Я ссылался на следующие ресурсы: Android Documentation и Google Sample.

+1

Я несколько вещей, которые вы не уточнили: 1-Вы протестировали его на реальном устройстве? 2-Вы находитесь внутри указанного lat/lng? 3 - Установлены ли службы Google Play? 4-Вы пытались открыть Карты Google, а затем обновлять lat/lng? Иногда это единственный способ заставить GPS работать с эмулятором. – fernandospr

+0

Запустите приложение на реальном устройстве, а затем сообщите. –

ответ

0

Услуги по размещению не отображаются в эмуляторе полностью. Как только я подключился к реальному устройству, все работало, как ожидалось.