Question

I am working on GeoFencing in Android and I am stuck at one point. My task is to show notification to user when he enters/exits a Geofence area defined by me.

Here is my code:

Activity class

public class TestMapActivity extends FragmentActivity implements    
    OnMarkerDragListener,ConnectionCallbacks, OnConnectionFailedListener,OnAddGeofencesResultListener {

private static GoogleMap map;
private LocationClient mLocationClient;
private PendingIntent mGeofencePendingIntent;
private SimpleGeoFence fence;
private List<Geofence> mGeoList;
private LocationRequest localRequest;
private GeofenceReceiver mBroadcastReceiver;
private IntentFilter mIntentFilter;

@Override
protected void onCreate(Bundle saveInstance)
{
        super.onCreate(saveInstance);
        setContentView(R.layout.activity_map);
        map = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
        map.setOnMarkerDragListener(this);
        CameraPosition INIT =
        new CameraPosition.Builder()
        .target(new LatLng(19.0222, 72.8666))
        .zoom(17.5F)
        .bearing(300F) // orientation
        .tilt( 50F) // viewing angle
        .build();
         map.moveCamera( CameraUpdateFactory.newCameraPosition(INIT) );

 }


   @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.main, menu);
        return true;
    }

 @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {

        switch (item.getItemId())
        {
            case R.id.add_fence:

            Toast.makeText(TestMapActivity.this, "Add fence is Selected", Toast.LENGTH_LONG).show();

            fence= new SimpleGeoFence();
            fence.toGeofence();
            addMarkerForFence(fence);
            addIntentForFence();
            return true;
            default:
                 return super.onOptionsItemSelected(item);
        }
    }

     public void addMarkerForFence(SimpleGeoFence fence){
     if(fence == null){
         // display an error message and return
        return;
     }


     //Instantiates a new CircleOptions object +  center/radius
     CircleOptions circleOptions = new CircleOptions()
       .center( new LatLng(19.0216, 72.8646 ))
       .radius( 500 )
       .fillColor(0x40ff0000)
       .strokeColor(Color.TRANSPARENT)
       .strokeWidth(2);

     map.addCircle(circleOptions);

     map.addMarker( new MarkerOptions()
       .position( new LatLng(19.0216, 72.8646) )
       .title("Fence " +fence.getId())
       .snippet("Radius: " +fence.getRadius()) ).showInfoWindow();

     // Get back the mutable Circle
     Circle circle = map.addCircle(circleOptions);

 }

     public void addIntentForFence()
 {

     Geofence geoFence= fence.toGeofence();
     mGeoList = new ArrayList<Geofence>();
     mGeoList.add(geoFence);

     mLocationClient = new LocationClient(this, this, this);
     mLocationClient.connect();

    }

   @Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

    mGeofencePendingIntent = createRequestPendingIntent(); 

    localRequest = LocationRequest.create();
    localRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    localRequest.setInterval(5000);

    mLocationClient.addGeofences(mGeoList, mGeofencePendingIntent , this);  
}

    private PendingIntent createRequestPendingIntent() {

    if (null != mGeofencePendingIntent) {

        return mGeofencePendingIntent;

    } else {


        Intent intent = new Intent("com.example.ACTION_RECEIVE_GEOFENCE");
        System.out.println("Intent" +intent);
        //sendBroadcast(intent);
        return PendingIntent.getBroadcast(
                getApplicationContext(),
                0,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
    }
}
} //end oncreate

GeofenceReceiver class

  public class GeofenceReceiver extends BroadcastReceiver
  {
         public Context context;
         Intent broadcastIntent = new Intent();

          @Override
      public void onReceive(Context context, Intent intent) {

           // TODO Auto-generated method stub

             this.context = context;
              broadcastIntent.addCategory("com.example.CATEGORY_LOCATION_SERVICES");        
              String action= intent.getAction();

               if (LocationClient.hasError(intent)) {
                       //do something
                } 
               else 
                {
               handleEnterExit(intent);
                 }
           }

         private void handleEnterExit(Intent intent) {

             int transition = LocationClient.getGeofenceTransition(intent);

              System.out.println("transition" +transition); //getting -1 over here
              if ((transition == Geofence.GEOFENCE_TRANSITION_ENTER)
                || (transition == Geofence.GEOFENCE_TRANSITION_EXIT)) {

                         //send notification over here
             }   

    } 

AndroidManifest.xml container Receiver

    <receiver android:name="com.example.GeofenceReceiver" android:exported="false">
    <intent-filter >
        <action android:name="com.example.ACTION_RECEIVE_GEOFENCE"/>
    </intent-filter>
</receiver>

So basically I am able to see my GeoFence getting created but i don't get notification for the same.

does anyone have a solution for this?

Was it helpful?

Solution

Just check it sample code. u r taking Geo-fencing but you are not mention location client and location connect so that google play service not connect to client and you are not able to receive notification take google requester file and check main acitvity where geofence add in list and also connect location client hope so its work for you

OTHER TIPS

So from the comments you are saying that you are able to add a geofence but you are not getting a notification. Firstly it looks as if you have used the android's geofence sample code which is their on their website and you have changed it so it uses a receiver instead of a service. For me i did the same and this might not seem like the right solution my answer is :

1.) Follow the same steps/code in the google'e geofence : http://developer.android.com/training/location/geofencing.html

2.) since you are changing the service to a receiver , in your createRequestPendingIntent() method are you returning the right broadcast intent ? I mean you have this line but is it reaching there ? is something getting returned there ?

return PendingIntent.getBroadcast( mActivity,0,intent, PendingIntent.FLAG_UPDATE_CURRENT);

3.)Do you have a LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver, mIntentFilter); in your onResume() ?

I would follow the google's sample project again and just make sure you are changing the service to receiver part right and you should be fine.

I had the same problem. I think that's because you are using the application context for your pending intent, try to use the activity instead.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top