5

ジオフェンスが開始時に動作していますが、1日か2日後に突然トリガーが停止すると、ここのGoogleコードまたはコードに問題がありますか?ブート時にジオフェンスは動作しますが、しばらくするとトリガーが停止します

、その後、ジオフェンスを登録することを私が使用してアプリIntentServiceを開始:

public class RegisterGeoIntentService extends IntentService implements 
GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, ResultCallback<Status> { 

private static final String TAG = "RegisterGeoIS"; 

private static final long TIME_OUT = 100; 
protected GoogleApiClient mGoogleApiClient; 
protected ArrayList<Geofence> mGeofenceList; 
private PendingIntent mGeofencePendingIntent; 

public RegisterGeoIntentService() { 
    super(TAG); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.i(TAG, "Creating Register Geo Intent service"); 
    mGeofenceList = new ArrayList<Geofence>(); 
    mGeofencePendingIntent = null; 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    buildGoogleApiClient(); 
    populateGeofenceList(); 
    mGoogleApiClient.blockingConnect(TIME_OUT, TimeUnit.MILLISECONDS); 
    String connected = mGoogleApiClient.isConnected() ? "connected" : "disconnected"; 
    Log.i(TAG, "Restoring geofence - status: " + connected); 

    String mode = null; 
    if(intent != null) { 
     mode = intent.getStringExtra(GEOFENCE_MODE); 
     if(mode.equals(GEOFENCE_MODE_START)) { 
      removeGeofencesButtonHandler(); 
      addGeofencesButtonHandler(); 
     } else { 
      removeGeofencesButtonHandler(); 
     } 
    } else { 
     Log.e(TAG, "No Intent data, could not start Geo"); 
    } 
} 

@Override 
public void onConnected(Bundle bundle) { 
    Log.i(TAG, "Connected to GoogleApiClient"); 
} 

@Override 
public void onConnectionSuspended(int i) { 
    Log.i(TAG, "Connection suspended"); 
} 

@Override 
public void onConnectionFailed(ConnectionResult result) { 
    Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode()); 
} 

@Override 
public void onResult(Status status) {  // Not used, using await 
    if(status.isSuccess()) { 
     Log.i(TAG, "Geofences added"); 
     mGoogleApiClient.disconnect(); 
    } else { 
     Log.i(TAG, "Geofences not successful"); 
     String errorMessage = GeoErrorMessages.getErrorString(this, status.getStatusCode()); 
     Log.e(TAG, errorMessage); 
    } 
} 

public void addGeofencesButtonHandler() { 
    if(!mGoogleApiClient.isConnected()) { 
     Toast.makeText(this, getString(R.string.not_connected), Toast.LENGTH_SHORT).show(); 
     return; 
    } 
    Status result = null; 
    try { 
     result = LocationServices.GeofencingApi.addGeofences(
      mGoogleApiClient, 
      getGeofencingRequest(), 
      getGeofencePendingIntent() 
     ).await(TIME_OUT, TimeUnit.MILLISECONDS); 
    } catch (SecurityException securityException) { // TODO Catch if manually disabled 
     // Catch exception generated if the app does not use ACCESS_FINE_LOCATION permission. 
     logSecurityException(securityException); 
    } 
    if(result != null) { 
     Log.i(TAG, "Trying to add Geofences - result: " + result.toString()); 
    } else { 
     Log.i(TAG, "Trying to add Geofences - result: is null"); 
    } 
} 

public void removeGeofencesButtonHandler() { 
    if(!mGoogleApiClient.isConnected()) { 
     Toast.makeText(this, getString(R.string.not_connected), Toast.LENGTH_SHORT).show(); 
     return; 
    } 
    Status result = null; 
    try { 
     result = LocationServices.GeofencingApi.removeGeofences(mGoogleApiClient, getGeofencePendingIntent() 
     ).await(TIME_OUT, TimeUnit.MILLISECONDS); 
    } catch (SecurityException securityException) { // TODO Catch if manually disabled 
     // Catch exception generated if the app does not use ACCESS_FINE_LOCATION permission. 
     logSecurityException(securityException); 
    } 
    if(result != null) { 
     Log.i(TAG, "Trying to remove Geofences - result: " + result.toString()); 
    } else { 
     Log.i(TAG, "Trying to remove Geofences - result: is null"); 
    } 
} 

private GeofencingRequest getGeofencingRequest() { 
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); 
    // The INITIAL_TRIGGER_ENTER flag indicates that geofencing service should trigger a 
    // GEOFENCE_TRANSITION_ENTER notification when the geofence is added and if the device 
    // is already inside that geofence. 
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); 
    builder.addGeofences(mGeofenceList); 
    return builder.build(); 
} 

private PendingIntent getGeofencePendingIntent() { 
    if(mGeofencePendingIntent != null) { 
     return mGeofencePendingIntent; 
    } 
    // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling 
    // addGeofences() and removeGeofences(). 
    // Removed, using Broadcast now 
    // Intent intent = new Intent(this, GeoTransitionsIntentService.class); 
    // return PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    Intent intent = new Intent("com.xyz.app.ACTION_RECEIVE_GEOFENCE"); 
    return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
} 

private void logSecurityException(SecurityException securityException) { 
    Log.e(TAG, "Invalid location permission. You need to use ACCESS_FINE_LOCATION with geofences", securityException); 
} 

public void populateGeofenceList() { 
    RealmHelper realmHelper = RealmHelper.getInstance(this); 
    for(Map.Entry<String, LatLng> entry : realmHelper.queryLandMarks().entrySet()) { 
     mGeofenceList.add(new Geofence.Builder() 
     .setRequestId(entry.getKey()) 
     .setCircularRegion(
      entry.getValue().latitude, 
      entry.getValue().longitude, 
      Constants.GEOFENCE_RADIUS_IN_METERS) 
     .setExpirationDuration(Geofence.NEVER_EXPIRE) 
     .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) 
     .build()); 
    } 
} 

protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .addConnectionCallbacks(this) 
     .addOnConnectionFailedListener(this) 
     .addApi(LocationServices.API) 
     .build(); 
} 
} 

そして、この:

public class GeofenceReceiver extends BroadcastReceiver { 
... 

@Override 
public void onReceive(Context context, Intent intent) { 
this.context = context; 

GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); 
if(geofencingEvent.hasError()) { 
    String errorMessage = GeoErrorMessages.getErrorString(context, geofencingEvent.getErrorCode()); 
    Log.e(TAG, errorMessage); 
    return; 
} 

int geofenceTransition = geofencingEvent.getGeofenceTransition(); 

if(geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER || geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) { 

// Do stuff 
} 
... 

はまた、私が試したと私は固定思った私の答えを参照してください。しかし、それは役に立たなかった。

+0

としてAndroidManifestで定義されているBroadcastReceiverを使用するように変更し、問題だった助けていないのでご注意ください*このアプリのDozeModeを無効にしようとしました*これは不可能です –

+0

Android、Settiバッテリー、バッテリーの最適化、すべてのアプリ... Nexus 6Pで選択して最適化しない – powder366

+0

あなたが思うようにはできません。アプリのドーズモードを無効にすることはできません –

答えて

0

が、これは実際に

私のジオフェンスは常にトリガが、IntentServiceが

private PendingIntent getGeofencePendingIntent() { 
    if(mGeofencePendingIntent != null) { 
     return mGeofencePendingIntent; 
    } 
    Intent intent = new Intent(this, GeoTransitionsIntentService.class); 
    // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back  when calling 
    // addGeofences() and removeGeofences(). 
    return PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
} 

private PendingIntent getGeofencePendingIntent() { 
    if(mGeofencePendingIntent != null) { 
     return mGeofencePendingIntent; 
    } 
    // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling 
    // addGeofences() and removeGeofences(). 
    // Removed, using Broadcast now 
    // Intent intent = new Intent(this, GeoTransitionsIntentService.class); 
    // return PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    Intent intent = new Intent("com.xyz.myapp.ACTION_RECEIVE_GEOFENCE"); 
    return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
} 
+0

これは実際には機能しませんでした。 – powder366

+0

動作していない/正しくない場合は、自分で回答を受け入れないでください。あなたが他人から正しい解決策を受け取るまで待ってください。 – james

+0

私が言及したように、私はそれを修正したと思ったが、それは解決策ではなかった(そして、この答えを削除することはできない、それは物語の一部であると言っている)。 – powder366

関連する問題