问题描述
我只是在做机器人演示了地理围栏按文档,但这里地质击剑广播接收器并没有叫,当我从围栏面积外出或进入它。
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.
专家看code和试图抓住这个问题。
Guys look the code and try to catch the issue.
由于金吾
SplashActivity.java
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
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
GeofenceReceiver.java
公共类GeofenceReceiver扩展广播接收器{
上下文的背景下;
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中
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
推荐答案
Android的地理围栏从未启用GPS(因为它们的API是可怕的和器件的功耗已经是如此不可收拾的地步)。你必须设置你的地理围栏,然后不断的,如果你想在GPS地理围栏分别轮询GPS。
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.
这篇关于安卓:地理围栏接收器不是要求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!