问题
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