- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我尝试在我的应用程序中使用地理围栏时遇到问题。我已成功注册地理围栏,但我从未收到通知。
首先,我按照 http://developer.android.com/training/location/geofencing.html 中提供的示例进行操作,但即使我走向或远离区域,代码也不会触发 Intent 服务。
我的注册地理围栏和调用 Intent 服务的代码如下:
内部 list :
<service
android:name="com.example.zukami.apps.blynk.geofence.ReceiveTransitionsIntentService"
android:exported="true" >
</service>
在我的 MainActivity 中
private boolean registerGeofence() {
mRequestType = GeofenceUtils.REQUEST_TYPE.ADD;
if (!servicesConnected()) {
return false;
}
SimpleGeofence testGeo = new SimpleGeofence(Flag.GEOFENCE + "_"
+ 1, Double.valueOf("1.317342"),
Double.valueOf("103.841998"), (float) (200),
GEOFENCE_EXPIRATION_IN_HOURS,
Geofence.GEOFENCE_TRANSITION_ENTER);
mPrefs.setGeofence(Flag.GEOFENCE + "_" + 1, testGeo);
mCurrentGeofences.add(testGeo.toGeofence());
SimpleGeofence testGeo2 = new SimpleGeofence(Flag.GEOFENCE + "_"
+ 2, Double.valueOf("1.303961"),
Double.valueOf("103.909356"), (float) (200),
GEOFENCE_EXPIRATION_IN_HOURS,
Geofence.GEOFENCE_TRANSITION_ENTER);
mPrefs.setGeofence(Flag.GEOFENCE + "_" + 2, testGeo2);
mCurrentGeofences.add(testGeo2.toGeofence());
// end deleted this code after testing
try {
mGeofenceRequester.addGeofences(mCurrentGeofences);
Log.e(TAG, "ADDING GEOFENCE ??? YES WE DID IT");
} catch (UnsupportedOperationException e) {
Toast.makeText(this,
R.string.add_geofences_already_requested_error,
Toast.LENGTH_LONG).show();
}
return true;
}
@Override
protected void onResume() {
super.onResume();
// Register the broadcast receiver to receive status updates
LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver, mIntentFilter);
在我的地理围栏请求器中
private PendingIntent createRequestPendingIntent() {
Log.e(TAG, "CREATE REQUEST PENDING INTENT");
// If the PendingIntent already exists
if (null != mGeofencePendingIntent) {
Log.e(TAG, "PENDING INTENT NOT NULL");
return mGeofencePendingIntent;
// If no PendingIntent exists
} else {
Log.e(TAG, "PENDING INTENT NULL, LET'S CREATED IT");
// Create an Intent pointing to the IntentService
Intent intent = new Intent(mActivity,
ReceiveTransitionsIntentService.class);
Log.e(TAG,
return PendingIntent.getService(mActivity, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
并且在类中,IntentService 的子类与示例保持相同。
我搜索了这个问题并找到了这个链接描述的解决方案: Android Geofence eventually stop getting transition intents ,所以我完全按照建议更改了我的代码,但我仍然无法从我在 GeofenceReceiver 类中的代码,这一行中的代码中获得通知
LocationClient.getGeofenceTransition(intent);
总是返回我-1,这意味着我永远不会进入或离开该区域(指示 GEOFENCE NEVER_EXPIRED),所以我永远不会收到通知。请在下面找到我的 GeofenceReceiver 类:
public class GeofenceReceiver extends BroadcastReceiver {
public static String TAG = GeofenceReceiver.class.getCanonicalName();
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) {
int errorCode = LocationClient.getErrorCode(intent);
String errorMessage = LocationServiceErrorMessages.getErrorString(
context, errorCode);
Log.e(GeofenceUtils.APPTAG, context.getString(
R.string.geofence_transition_error_detail, errorMessage));
broadcastIntent.setAction(GeofenceUtils.ACTION_GEOFENCE_ERROR)
.putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, errorMessage);
LocalBroadcastManager.getInstance(context).sendBroadcast(
broadcastIntent);
}
private void handleEnterExit(Intent intent) {
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 = getTransitionString(transition);
for (int index = 0; index < geofences.size(); index++) {
Geofence geofence = geofences.get(index);
geofenceIds[index] = geofences.get(index).getRequestId();
}
sendNotification(transitionType, ids);
// 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(context).sendBroadcast(
broadcastIntent);
// Log the transition type and a message
Log.e(GeofenceUtils.APPTAG, transitionType + ": " + ids);
Log.e(GeofenceUtils.APPTAG, context
.getString(R.string.geofence_transition_notification_text));
Log.e(GeofenceUtils.APPTAG, "transition");
} else {
// Always log as an error
Log.e(TAG, "TRANSITION = " + transition);
}
}
请告知我应该如何修复此代码,非常感谢您提供的任何帮助。
最佳答案
对我来说,我只是更改了createPendingIntent方法中的一些代码行
private PendingIntent createRequestPendingIntent() {
Log.e(TAG, "CREATE REQUEST PENDING INTENT");
// If the PendingIntent already exists
if (null != mGeofencePendingIntent) {
Log.e(TAG, "PENDING INTENT NOT NULL");
return mGeofencePendingIntent;
// If no PendingIntent exists
} else {
Log.e(TAG, "PENDING INTENT NULL, LET'S CREATED IT");
// Create an Intent pointing to the IntentService
Intent intent = new Intent(mActivity,
ReceiveTransitionsIntentService.class);
Log.e(TAG,
return PendingIntent.getService(mActivity, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
所以代替 返回 PendingIntent.getService(mActivity, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
用这 block 蛋糕返回 PendingIntent.getBroadcast(mActivity, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
并确保您已在应用程序 list 文件中声明了您的 BroadcastReceiver。祝您好运!!!!
关于Android Geofence 无法调用 IntentService 并且无法在 BroadcastReceiver 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22548706/
我正在使用下面的代码监控地理围栏转换 LocationServices.GeofencingApi .addGeofences(AssistApplication.getApiHelper()
当用户进入定义的地理围栏区域时,我正在使用意向服务创建通知。问题是,当我第一次运行应用程序时,它工作正常,并且我在意向服务上获得待处理意向,但之后有些天(2-3),我没有在意向服务上获得所需的意向。
这个问题在这里已经有了答案: How to check if Location Services are enabled? (24 个答案) 关闭 7 年前。 我正在使用 Android 地理围栏
我已经对这个主题进行了很多天的认真研究......我在这里也看到了很多主题......但不幸的是我找不到解决方案.... 我正在编写一个使用新的 Google API for Geofence 的应用
我尝试从 android 开发人员运行此应用程序:https://developer.android.com/codelabs/advanced-android-kotlin-training-geo
我有一个以Google地理围栏示例代码开头的应用。它运行了好几天,并且我得到了所有预期的过渡意图。但是,过了一段时间(例如3天),该应用程序停止了获取这些意图,我不知道为什么。 创建围栏时,将有效期设
对于后台位置,如果设备进入低功耗模式或后台应用刷新被禁用,而应用程序在后台并收集位置......操作系统会杀死它。然后,即使这些模式被颠倒,直到应用程序再次出现在前台,这些事件才能恢复.... 但是在
如果电源不是问题,那么在 Android 设备(特别是 Nexus 7)上跟踪地理围栏事件的最佳方法是什么。 Geofence api,或者主动轮询 平板电脑永久固定在车辆中并始终通电。所以省电不是问
我的问题与这里的问题基本相同: iOS Geofence, how to handle when inside region when monitoring starts? 我需要一个 Swift 3
我已成功添加带有标志 NEVER_EXPIRE 的地理围栏。一切似乎都运行良好。 但现在在测试时我发现,如果我停止定位服务,地理围栏将按预期停止工作。此外,当我再次启动定位服务时,我之前添加的地理围栏
我已经实现了 geoFence api,并且一切正常。但是有一些问题,我想更多地澄清我的困惑。 下面是一些困惑和问题: 我希望我的用户在进入地理围栏区域时得到通知。我已经按照指南实现了 Geofenc
我正在为 Android Wear 构建一个 Android 应用。为了节省电池电量,我正在尝试使用 Geofences 来跟踪您是否进入或离开某个位置。但我无法让它工作。 首先,我不确定 Andro
我正在制作一个地理围栏应用程序,它必须在设备位于地理围栏之外时不断触发通知,而不仅仅是在退出时。 我已尝试通过 Google android developer training page 中给出的训
随着向 android 8 的过渡,我遇到了一个问题,即当应用程序被终止时,应用程序中的地理围栏不再工作。 我根据 Android 开发人员指南实现了地理围栏,因此没有理由显示任何代码 fragmen
7 天以来,我一直在尝试这样做,但没有结果。问题是 ResultCallback,对于地理围栏我需要 ResultCallback,而对于 LocationSettings 我需要 ResultCal
我正在尝试针对位置感知应用程序测试 GeoFences。我已经获得了多达 11 次连续成功,但通常随之而来的是数十次失败。重新启动设备没有帮助。卸载/重新安装没有帮助。禁用位置,重新启用位置没有帮助。
我正在使用 Geofence API Sample application我让它运行起来,似乎工作正常。我确实对其进行了修改,以使用 BroadcastReceiver 而不是 IntentServi
问题在标题中。如果应用被用户终止,新的 Android Geofences 是否会被删除? 我正在使用新的 Android Geofences (在 2013 年 Google IO 上宣布)。如果用
我无法从服务类添加地理围栏。下面是我的代码: 地理围栏服务: package com.example.admin.reminderapp.services; import android.app.Pe
我开发了一个地理围栏应用程序,它运行正常。但我也有用户告诉我,即使设备没有移动,该应用程序也会报告可重复进入和退出该区域! 该应用程序使用最新的 Google Geofencing API,过渡类型为
我是一名优秀的程序员,十分优秀!