Unable to display notification when entering GeoFence in Android

大憨熊 提交于 2019-12-21 17:27:09

问题


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?


回答1:


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




回答2:


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.




回答3:


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.



来源:https://stackoverflow.com/questions/19745345/unable-to-display-notification-when-entering-geofence-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!