问题
I just made a demo for the Geo Fencing in android as per the documentation but here Geo Fencing Broadcast Receiver is not calling when I go out from the fence area or entered into it.
Guys look the code and try to catch the issue.
Thanks Kingo
SplashActivity.java
public class SplashActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
List<Geofence> mCurrentGeofences = new ArrayList<Geofence>();
SimpleGeofence mUIGeofence1 = new SimpleGeofence("1",
// Get latitude, longitude, and radius from the UI
26.87473379143512, 75.78373555021025, 1,
// Set the expiration time
Geofence.NEVER_EXPIRE,
// Only detect entry transitions
Geofence.GEOFENCE_TRANSITION_ENTER);
/*
* Add Geofence objects to a List. toGeofence() creates a Location
* Services Geofence object from a flat object
*/
mCurrentGeofences.add(mUIGeofence1.toGeofence());
// Start the request. Fail if there's already a request in progress
try {
// Try to add geofences
GeofenceRequester mGeofenceRequester = new GeofenceRequester(this);
mGeofenceRequester.addGeofences(mCurrentGeofences);
} catch (UnsupportedOperationException e) {
}
}
}
GeoFenceRequestor.java
private PendingIntent createRequestPendingIntent() {
// If the PendingIntent already exists
if (null != mGeofencePendingIntent) {
// Return the existing intent
return mGeofencePendingIntent;
// If no PendingIntent exists
} else {
// Create an Intent pointing to the IntentService
Intent intent = new Intent(
"com.example.demo.ACTION_RECEIVE_GEOFENCE");
// MAKE SURE YOU CHANGE THIS TO getBroadcast if you are coming from
// the sample code.
return PendingIntent.getBroadcast(mActivity, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
}
@Override
public void onAddGeofencesResult(int statusCode, String[] geofenceRequestIds) {
// Create a broadcast Intent that notifies other components of success
// or failure
Intent broadcastIntent = new Intent();
// Temp storage for messages
String msg;
// If adding the geocodes was successful
if (LocationStatusCodes.SUCCESS == statusCode) {
// Create a message containing all the geofence IDs added.
msg = mActivity.getString(R.string.add_geofences_result_success,
Arrays.toString(geofenceRequestIds));
// In debug mode, log the result
Log.d(GeofenceUtils.APPTAG, msg);
// Create an Intent to broadcast to the app
broadcastIntent.setAction(GeofenceUtils.ACTION_GEOFENCES_ADDED)
.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES)
.putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, msg);
// If adding the geofences failed
} else {
/*
* Create a message containing the error code and the list of
* geofence IDs you tried to add
*/
msg = mActivity.getString(R.string.add_geofences_result_failure,
statusCode, Arrays.toString(geofenceRequestIds));
// Log an error
Log.e(GeofenceUtils.APPTAG, msg);
// Create an Intent to broadcast to the app
broadcastIntent.setAction(GeofenceUtils.ACTION_GEOFENCE_ERROR)
.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES)
.putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, msg);
}
// Broadcast whichever result occurred
LocalBroadcastManager.getInstance(mActivity).sendBroadcast(
broadcastIntent);
// Disconnect the location client
requestDisconnection();
}
GeofenceReceiver.java
public class GeofenceReceiver extends BroadcastReceiver { Context context;
Intent broadcastIntent = new Intent();
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
broadcastIntent.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES);
Toast.makeText(context, "Receiver", Toast.LENGTH_LONG).show();
if (LocationClient.hasError(intent)) {
handleError(intent);
} else {
handleEnterExit(intent);
}
}
}
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="10" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/app_id" />
<activity
android:name=".SplashActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".GeofenceReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.example.demo.ACTION_RECEIVE_GEOFENCE" />
</intent-filter>
</receiver>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
</manifest>
It add the Geo Fence successfully but later it does not call the Broadcast receiver to get to know whether entered/exit
回答1:
Android GeoFences never enable the GPS (because their API is awful and their device power consumption is already so out of hand). You have to set up your geofences and then constantly poll the GPS separately if you want geofencing over GPS.
来源:https://stackoverflow.com/questions/21886204/android-geo-fencing-receiver-not-calling