gpt4 book ai didi

android-geofence - Android Geofence最终停止获得过渡意图

转载 作者:行者123 更新时间:2023-12-03 08:36:51 28 4
gpt4 key购买 nike

我有一个以Google地理围栏示例代码开头的应用。它运行了好几天,并且我得到了所有预期的过渡意图。但是,过了一段时间(例如3天),该应用程序停止了获取这些意图,我不知道为什么。

创建围栏时,将有效期设置为Geofence。NEVER_EXPIRE

这是我的IntentService,在它们停止工作之前我可以获取过渡意图:

public class ReceiveTransitionsIntentService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {

Intent broadcastIntent = new Intent();

broadcastIntent.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES);

// First check for errors
if (LocationClient.hasError(intent)) {
...handle errors
} else {

// Get the type of transition (entry or exit)
int transition = LocationClient.getGeofenceTransition(intent);

// Test that a valid transition was reported
if ((transition == Geofence.GEOFENCE_TRANSITION_ENTER)
|| (transition == Geofence.GEOFENCE_TRANSITION_EXIT)) {

// Post a notification
NEVER GETS HERE
} else {
...log error
}
}
}
}

这是 list 的相关部分:
<service
android:name="com.aol.android.geofence.ReceiveTransitionsIntentService"
android:exported="false" >
</service>

在我的GeofenceRequester类中,它几乎与示例代码相同。以下是相关部分:
// Get a PendingIntent that Location Services issues when a geofence transition occurs
mGeofencePendingIntent = createRequestPendingIntent();

// Send a request to add the current geofences
mLocationClient.addGeofences(mCurrentGeofences, mGeofencePendingIntent, this);

private PendingIntent createRequestPendingIntent() {

// Create an Intent pointing to the IntentService
Intent intent = new Intent(context, ReceiveTransitionsIntentService.class);

return PendingIntent.getService(
context,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
}

谁能看到为什么这将停止工作?

最佳答案

因此,经过一番尝试之后,示例代码中定义的ReceiveTransitionsIntentService似乎将在应用程序不在时停止获取通知。我认为这是示例代码的一个大问题。似乎这样会使像我这样的人绊倒。

因此,我改为使用广播接收器,到目前为止,从我的测试来看,它似乎仍在工作。

将此添加到 list 中:

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

然后,在GeofenceRequester类中,您需要更改createRequestPendingIntent方法,以便它转到您的BroadcastReceiver而不是ReceiveTransitionsIntentService
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.aol.android.geofence.ACTION_RECEIVE_GEOFENCE");
// Intent intent = new Intent(context, ReceiveTransitionsIntentService.class);
/*
* Return a PendingIntent to start the IntentService.
* Always create a PendingIntent sent to Location Services
* with FLAG_UPDATE_CURRENT, so that sending the PendingIntent
* again updates the original. Otherwise, Location Services
* can't match the PendingIntent to requests made with it.
*/
return PendingIntent.getBroadcast(
context,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
}

然后,我添加了看起来像这样的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);

if (LocationClient.hasError(intent)) {
handleError(intent);
} else {
handleEnterExit(intent);
}
}

private void handleError(Intent intent){
// Get the error code
int errorCode = LocationClient.getErrorCode(intent);

// Get the error message
String errorMessage = LocationServiceErrorMessages.getErrorString(
context, errorCode);

// Log the error
Log.e(GeofenceUtils.APPTAG,
context.getString(R.string.geofence_transition_error_detail,
errorMessage));

// Set the action and error message for the broadcast intent
broadcastIntent
.setAction(GeofenceUtils.ACTION_GEOFENCE_ERROR)
.putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, errorMessage);

// Broadcast the error *locally* to other components in this app
LocalBroadcastManager.getInstance(context).sendBroadcast(
broadcastIntent);
}


private void handleEnterExit(Intent intent) {
// Get the type of transition (entry or exit)
int transition = LocationClient.getGeofenceTransition(intent);

// Test that a valid transition was reported
if ((transition == Geofence.GEOFENCE_TRANSITION_ENTER)
|| (transition == Geofence.GEOFENCE_TRANSITION_EXIT)) {

// Post a notification
List<Geofence> geofences = LocationClient
.getTriggeringGeofences(intent);
String[] geofenceIds = new String[geofences.size()];
String ids = TextUtils.join(GeofenceUtils.GEOFENCE_ID_DELIMITER,
geofenceIds);
String transitionType = GeofenceUtils
.getTransitionString(transition);

for (int index = 0; index < geofences.size(); index++) {
Geofence geofence = geofences.get(index);
...do something with the geofence entry or exit. I'm saving them to a local sqlite db

}
// Create an Intent to broadcast to the app
broadcastIntent
.setAction(GeofenceUtils.ACTION_GEOFENCE_TRANSITION)
.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES)
.putExtra(GeofenceUtils.EXTRA_GEOFENCE_ID, geofenceIds)
.putExtra(GeofenceUtils.EXTRA_GEOFENCE_TRANSITION_TYPE,
transitionType);

LocalBroadcastManager.getInstance(MyApplication.getContext())
.sendBroadcast(broadcastIntent);

// Log the transition type and a message
Log.d(GeofenceUtils.APPTAG, transitionType + ": " + ids);
Log.d(GeofenceUtils.APPTAG,
context.getString(R.string.geofence_transition_notification_text));

// In debug mode, log the result
Log.d(GeofenceUtils.APPTAG, "transition");

// An invalid transition was reported
} else {
// Always log as an error
Log.e(GeofenceUtils.APPTAG,
context.getString(R.string.geofence_transition_invalid_type,
transition));
}
}

/**
* Posts a notification in the notification bar when a transition is
* detected. If the user clicks the notification, control goes to the main
* Activity.
*
* @param transitionType
* The type of transition that occurred.
*
*/
private void sendNotification(String transitionType, String locationName) {

// Create an explicit content Intent that starts the main Activity
Intent notificationIntent = new Intent(context, MainActivity.class);

// Construct a task stack
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);

// Adds the main Activity to the task stack as the parent
stackBuilder.addParentStack(MainActivity.class);

// Push the content Intent onto the stack
stackBuilder.addNextIntent(notificationIntent);

// Get a PendingIntent containing the entire back stack
PendingIntent notificationPendingIntent = stackBuilder
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

// Get a notification builder that's compatible with platform versions
// >= 4
NotificationCompat.Builder builder = new NotificationCompat.Builder(
context);

// Set the notification contents
builder.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(transitionType + ": " + locationName)
.setContentText(
context.getString(R.string.geofence_transition_notification_text))
.setContentIntent(notificationPendingIntent);

// Get an instance of the Notification manager
NotificationManager mNotificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);

// Issue the notification
mNotificationManager.notify(0, builder.build());
}
}

希望可以帮助其他人。

关于android-geofence - Android Geofence最终停止获得过渡意图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505614/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com