Android Geofence Not Triggers Once Location Off And On Again
I am using Android Geofencing API.After add geofence it works fine when location is ON.But If I OFF location and ON again,afterwards Geofencing not triggers when enter or exit.I ha
Solution 1:
Yeap, geofences will be removed once location is switched off.
You should listen for location provider broadcasts using a BroadcastReceiver in your manifest, something like: 
<receiverandroid:name="your.Receiver"><intent-filter><actionandroid:name="android.location.PROVIDERS_CHANGED"/></intent-filter></receiver>and then register your geofences again.
publicclassLocationProviderReceiverextendsBroadcastReceiver {
    publicLocationProviderReceiver() {
    }
    @Override
    publicvoidonReceive(Context context, Intent intent) {
        if (action.equals(LocationManager.PROVIDERS_CHANGED_ACTION)) {
            // if location services enabled// restart geofences
        }
    }
}
Solution 2:
Add this to the manifest:
<receiverandroid:name="com.aol.android.geofence.GeofenceReceiver"android:exported="false"><intent-filter ><actionandroid:name="com.aol.android.geofence.ACTION_RECEIVE_GEOFENCE"/></intent-filter></receiver>Then in the GeofenceRequester class you need to change the createRequestPendingIntent method so that it goes to your BroadcastReceiver instead of the ReceiveTransitionsIntentService
private PendingIntent createRequestPendingIntent() {
        // If the PendingIntent already existsif (null != mGeofencePendingIntent) {
            // Return the existing intentreturn mGeofencePendingIntent;
        // If no PendingIntent exists
        } else {
            // Create an Intent pointing to the IntentService
            Intent intent = new Intent("com.aol.android.geofence.ACTION_RECEIVE_GEOFENCE");
//            Intent intent = new Intent(context, ReceiveTransitionsIntentService.class);/*
             * Return a PendingIntent to start the IntentService.
             * Always create a PendingIntent sent to Location Services
             * with FLAG_UPDATE_CURRENT, so that sending the PendingIntent
             * again updates the original. Otherwise, Location Services
             * can't match the PendingIntent to requests made with it.
             */return PendingIntent.getBroadcast(
                    context,
                    0,
                    intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
        }
    }
Then I added the GeofenceReceiver class that looks something like this:
publicclassGeofenceReceiver extends BroadcastReceiver {
    Context context;
    Intent broadcastIntent = newIntent();
    @Override
    publicvoidonReceive(Context context, Intent intent){
        this.context = context;
        broadcastIntent.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES);
        if (LocationClient.hasError(intent)) {
            handleError(intent);
        } else {
            handleEnterExit(intent);
        }
    }
    privatevoidhandleError(Intent intent){
        // Get the error codeint errorCode = LocationClient.getErrorCode(intent);
        // Get the error message
        String errorMessage = LocationServiceErrorMessages.getErrorString(
                context, errorCode);
        // Log the error
        Log.e(GeofenceUtils.APPTAG,
                context.getString(R.string.geofence_transition_error_detail,
                        errorMessage));
        // Set the action and error message for the broadcast intent
        broadcastIntent
                .setAction(GeofenceUtils.ACTION_GEOFENCE_ERROR)
                .putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, errorMessage);
        // Broadcast the error *locally* to other components in this app
        LocalBroadcastManager.getInstance(context).sendBroadcast(
                broadcastIntent);
    }
    privatevoidhandleEnterExit(Intent intent){
        // Get the type of transition (entry or exit)int transition = LocationClient.getGeofenceTransition(intent);
        // Test that a valid transition was reportedif ((transition == Geofence.GEOFENCE_TRANSITION_ENTER)
                || (transition == Geofence.GEOFENCE_TRANSITION_EXIT)) {
            // Post a notification
            List<Geofence> geofences = LocationClient
                    .getTriggeringGeofences(intent);
            String[] geofenceIds = new String[geofences.size()];
            String ids = TextUtils.join(GeofenceUtils.GEOFENCE_ID_DELIMITER,
                    geofenceIds);
            String transitionType = GeofenceUtils
                    .getTransitionString(transition);
            for (int index = 0; index < geofences.size(); index++) {
                Geofence geofence = geofences.get(index);
                ...do something with the geofence entry or exit. I'm saving them to a local sqlite db
            }
            // Create an Intent to broadcast to the app
            broadcastIntent
                    .setAction(GeofenceUtils.ACTION_GEOFENCE_TRANSITION)
                    .addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES)
                    .putExtra(GeofenceUtils.EXTRA_GEOFENCE_ID, geofenceIds)
                    .putExtra(GeofenceUtils.EXTRA_GEOFENCE_TRANSITION_TYPE,
                            transitionType);
            LocalBroadcastManager.getInstance(MyApplication.getContext())
                    .sendBroadcast(broadcastIntent);
            // Log the transition type and a message
            Log.d(GeofenceUtils.APPTAG, transitionType + ": " + ids);
            Log.d(GeofenceUtils.APPTAG,
                    context.getString(R.string.geofence_transition_notification_text));
            // In debug mode, log the result
            Log.d(GeofenceUtils.APPTAG, "transition");
            // An invalid transition was reported
        } else {
            // Always log as an error
            Log.e(GeofenceUtils.APPTAG,
                    context.getString(R.string.geofence_transition_invalid_type,
                            transition));
        }
    }
    /**
     * Posts a notification in the notification bar when a transition is
     * detected. If the user clicks the notification, control goes to the main
     * Activity.
     * 
     * @param transitionType
     *            The type of transition that occurred.
     * 
     */privatevoidsendNotification(String transitionType, String locationName){
        // Create an explicit content Intent that starts the main Activity
        Intent notificationIntent = newIntent(context, MainActivity.class);
        // Construct a task stack
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        // Adds the main Activity to the task stack as the parent
        stackBuilder.addParentStack(MainActivity.class);
        // Push the content Intent onto the stack
        stackBuilder.addNextIntent(notificationIntent);
        // Get a PendingIntent containing the entire back stack
        PendingIntent notificationPendingIntent = stackBuilder
                .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        // Get a notification builder that's compatible with platform versions// >= 4
        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                context);
        // Set the notification contents
        builder.setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(transitionType + ": " + locationName)
                .setContentText(
                        context.getString(R.string.geofence_transition_notification_text))
                .setContentIntent(notificationPendingIntent);
        // Get an instance of the Notification manager
        NotificationManager mNotificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        // Issue the notification
        mNotificationManager.notify(0, builder.build());
    }
}
Post a Comment for "Android Geofence Not Triggers Once Location Off And On Again"