2022年如何应对后台地理围栏?

2023-12-28

情况如下:

当用户创建地理围栏时,我将其保存到后端并向操作系统注册地理围栏。但是每当我的应用程序重新启动时,我都会从后端获取地理围栏并再次在操作系统中重新注册它们,因为它们不断消失。

我有两节课MainActivity and FormActivity。这两个活动都注册地理围栏,因此我将实际注册提取到普通 POJOGeofences.java

问题是这样的:

现在奇怪的是,只有当地图活动出现在屏幕上时才会收到触发器。我的应用程序中确实有一个地图活动,但它甚至不必是我的地图活动,即使我启动谷歌地图地理围栏触发器开始触发。

我究竟做错了什么?

地理围栏.java:

public class Geofences {

    private final String TAG = Geofences.class.getSimpleName();
    private final float RADIUS = 150.0F; //meter
    private boolean success = false;

    private final int LOITERING_IN_MILLISECONDS = 30000;// 30 seconds

    public boolean doGeofenceStuff(GeoTemp newTemp, String geofenceId, PendingIntent pendingIntent, GeofencingClient geofencingClient) {

        Geofence geofence = createGeofence(newTemp, geofenceId);
        GeofencingRequest geofencingRequest = createGeofenceRequest(geofence);
        geofencingClient.addGeofences(geofencingRequest, pendingIntent)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            success = true;
                            Log.i(TAG, "onComplete: DEBUG-Message: Geofence has been added.");

                        } else {
                            success = false;
                            Log.i(TAG, "onComplete: Geofence could not be added");
                        }
                    }
                }); // handle error here
        return success;
    }

    // Create a Geofence
    private Geofence createGeofence(GeoTemp geoTemp, String geofenceId) {


        long expiration = getExpirationForCurrentGeofence();
        if (expiration < 1) {
            Log.e(TAG, "createGeofence: Can't create Geofence, since expiration is less than zero");
            return null;
        }
        Log.d(TAG, "createGeofence");
        return new Geofence.Builder()
                .setRequestId(geofenceId)
                .setCircularRegion(getLat(), getLong(), RADIUS)
                .setExpirationDuration(expiration)
                .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_DWELL | Geofence.GEOFENCE_TRANSITION_EXIT)
                .setLoiteringDelay(LOITERING_IN_MILLISECONDS)
                .build();
    }

    // Create a Geofence Request
    private GeofencingRequest createGeofenceRequest(Geofence geofence) {
        Log.d(TAG, "createGeofenceRequest");
        return new GeofencingRequest.Builder()
                .setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_DWELL)
                .addGeofence(geofence)
                .build();
    }

}

这个POJOGeofences.java然后被我的两个活动使用:

主要活动:

public class MainActivity extends AppCompatActivity {

    private static String TAG = "MainActivity";
    private final int GEOFENCE_REQ_CODE = 0;
    private GeofencingClient geofencingClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        geofencingClient = LocationServices.getGeofencingClient(this);
        getCurrentTemps();
    }

    private void refreshGeofence(GeoTemp temp, String id) {
        new Geofences().doGeofenceStuff(temp, id, createGeofencePendingIntent(), geofencingClient);
    }
    private void getCurrentTemps() {
        List<GeoTemp> currentGeofences = getUpdatedList();
        currentGeofences.forEach(geoTemp -> {
            refreshGeofence( geoTemp, id);
        });
    }
    private PendingIntent createGeofencePendingIntent() {
        Log.d(TAG, "createGeofencePendingIntent");
        Intent intent = new Intent(this, LocationAlertIntentService.class);
        return PendingIntent.getService(
                this, GEOFENCE_REQ_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }
}

还有一项活动使用 Geofences.java 向操作系统注册地理围栏。

Update:

我发现,如果任何其他应用程序(包括我的)请求位置锁定,地理围栏会触发火灾。我需要他们在后台开火。


我在 Android 中使用地理围栏时遇到了类似的问题。

发生这种情况是由于背景限制 https://developer.android.com/about/versions/oreo/background在 Android Oreo 及更高版本中添加。

操作系统不允许您的应用程序在后台启动服务,因此您不会收到地理围栏触发器。

要处理这个问题:

  • 添加广播接收器以接收意图。 (该接收者将得到 即使应用程序处于后台,地理围栏也会发出警报)
  • 将服务替换为 JobIntentService。 (这将使用操作系统 JobSchedular 即使有后台限制也可以运行)
  • 从挂起的意图而不是服务中获取广播。

结账这个示例项目 https://github.com/googlesamples/android-play-location/tree/master/Geofencing以便进一步澄清。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2022年如何应对后台地理围栏? 的相关文章

  • 尝试使用 FileProvider(Android) 获取 URI 时出现 NullPointerException [重复]

    这个问题在这里已经有答案了 我想在单击按钮后拍照 但我越来越NullPointerException当试图得到URI with FileProvider 这是我的错误代码 Caused by java lang NullPointerExc
  • 在 AChartEngine 中单击时突出显示饼图切片

    我想在用户单击时突出显示 更改颜色 饼图特定切片 我可以在示例 下面的代码 中发现可以显示切片的索引和确切的点 但是给切片重新着色怎么样 mChartView setOnClickListener new View OnClickListe
  • Android中如何使用ScrollView?

    我有一个 XML 布局文件 但文本超出了屏幕尺寸 我需要做什么才能制作ScrollView
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • Android Studio 无法识别 GSON 库

    我正在 Android Studio 中制作一个应用程序 我需要使用GSON图书馆 我已经下载了gson 2 8 2 javadoc 然后我就这样走了 文件 gt 新建 gt 新模块 gt 导入 JAR AAR 打包 gt gson 2 8
  • 使用 javax.mail 和 CentOS 的邮件服务器

    我有一个 Java 程序 安装在一台旧的 Ubuntu 机器上 并使用 javax mail 发送邮件 然而 那台机器宕机了 我现在在新的 CentOS 机器上运行相同的 Java 应用程序 但是 当我尝试使用 mail smtp host
  • 方向更改时视图高度/宽度值错误?

    我实现了 onConfigurationChanged 来读取方向配置更改时视图高度和宽度的值 Override public void onConfigurationChanged Configuration newConfig supe
  • 配置为“ ”的资源“attr/pivotX”的值重复

    一个月后 启动 Android studio 并与 Gradle 同步时 弹出此错误 重建 清理项目不起作用并再次显示相同的错误 我尝试过重建 清理和无效 重新启动项目 但似乎没有任何效果 我已经在这个网站上搜索过这个问题 但似乎仍然没有任
  • 如何迭代SparseArray?

    有没有办法迭代 Java SparseArray 适用于 Android 我用了sparsearray通过索引轻松获取值 我找不到 看来我找到了解决方案 我没有正确注意到keyAt index 功能 所以我会这样做 for int i 0
  • ObservableList 不更新 ArrayList

    对于学校作业 我们正在使用 JavaFX 中的 ObservableList 对象 对吗 我已经为此工作了一天多了 但无法弄清楚 老师只告诉我们 谷歌一下 所以这也没有帮助 基本上 我们正在开发一个基本的管理应用程序来跟踪人们及其家人 人们
  • 对于每个抛出异常的语句,try/catch 是否被视为反模式?

    我目前正在审查同事的 Java 代码 我看到很多情况下 每个可能抛出异常的语句都被封装在自己的 try catch 中 其中 catch 块都执行相同的操作 哪个操作与我的问题无关 对我来说 这似乎是一种代码味道 我记得读到过它是一种常见的
  • 我用 java 7 android studio 替换 java 8 错误?

    为什么我用 JAVA 7 替换 JAVA 8 Android studio 错误 gt Error Error converting bytecode to dex Cause Dex cannot parse version 52 byt
  • unityLibrary:compileDebugJavaWithJavac

    所以当我单击 构建项目 时 它显示 零错误 但我仍然得到这个 Executing tasks clean unityLibrary assembleDebug launcher assembleDebug in project C User
  • 在调试模式下,哪些代码更改会自动反映在 Eclipse 中?

    我使用 eclipse 用于编写 调试 作为 IDE 在调试模式下 当我进行一些更改 例如初始化局部变量 时 它们会自动反映 但其他更改例如更改静态变量的值 有时我会收到一条消息 说我需要重新启动虚拟机 有时则不需要 现在的问题是哪些类型的
  • Spring Boot 健康执行器 - 什么时候上线?

    我找不到任何有关 Springs Health Actuator 何时返回 UP 状态的文档 你能依靠一切吗 Components正在初始化 会不会 Controller准备好满足请求了吗 为了测试应用程序上下文是否已加载 您可以执行此自定
  • SAXParseException:找不到元素“定义”的声明

    我对 camunda 和 DMN 完全陌生 我试图在 spring boot 中运行 DMN 示例 链接在这里 https github com camunda camunda bpm examples tree master dmn en
  • PSQLException:错误:关系“TABLE_NAME”不存在

    我正在尝试在 PostgreSQL 8 4 2 DB 上运行休眠 每当我尝试运行简单的java代码时 例如 List
  • 跳过一行GridBagLayout

    我在 JFrame 上使用 GridBagLayout 我希望能够跳过一两行 但将这些行显示为空白 然后在这些行后面有一个按钮 我在文档中找不到任何方法来执行我所描述的操作 有谁知道我可以执行此操作的任何方法吗 发现它比添加空组件干净得多
  • PostgreSQL 使用 JPA 和 Hibernate 抛出“列的类型为 jsonb,但表达式的类型为 bytea”

    这是我的实体类 映射到表中postgres 9 4 我正在尝试将元数据存储为jsonb在数据库中输入 Entity Table name room categories TypeDef name jsonb typeClass JsonBi
  • 如何在 SpringDoc OpenAPI 3 中引用文件?

    我有 Spring Boot 项目 我想在其中记录我的 API 这里是正在处理的 Web 服务的示例 ApiResponses value ApiResponse responseCode 200 content Content media

随机推荐

  • 如何找到Matlab中某个结构体执行的命令?

    Suppose a定义为以下结构 我试图找到与 R 的 dput 等效的命令 但出错了here https stackoverflow com questions 8377575 is there an equivalent of rs d
  • Google Calendar API 返回不再存在的事件

    使用日历 API V3 我注意到返回的事件数与给定日历上显示的事件数不一致 看来此问题是由于用户已移至其他日期或在给定日期删除的重复事件而发生的 日历似乎无法识别这一点 但仍然返回它们 Events get 和 Events list 都显
  • 在 Apache Commons exec 或 ProcessBuilder 之间做出选择

    我正在尝试决定是否使用ProcessBuilder或 Commons 执行人员 我的要求是 我只是想创建一个守护进程 我不关心其 stdout stdin stderr 另外 我想在时机成熟时执行一个kill来销毁这个进程 我在 Linux
  • EnumAvailableSqlServers 返回空列表

    我遇到了一个奇怪的情况 我添加了对 微软SqlServer Smo Microsoft SqlServer ConnectionInfo 微软 SqlServer 管理 Sdk Sfc 当 SmoApplication EnumAvaila
  • 在哪里可以下载 Microsoft.Samples.Debugging .NET 库?

    这似乎是一个简单的问题 但我到处搜索了 Microsoft Samples Debugging 库 我在 MSDN 博客上的代码示例中找到了该参考 但没有它我无法编译我的代码 进一步来说 使用 Microsoft Samples Debug
  • 使用 ClusterEvalQ 编译 Rcpp 函数

    我正在开发一个需要在 R 中进行并行处理的项目 并且我是 doparallel 包的新手 我想做的是使用并行的 foreach 循环 由于问题的性质 这个 foreach 循环需要执行多次 我遇到的问题是我在循环中使用 cppfunctio
  • Log4j 在所有类级别记录

    我正在使用 Log4j 调试我的 Java Web 应用程序 我需要在类级别进行日志记录 我不想在 log4j properties 文件中为每个类添加一行 因为我的应用程序中有数百个类 如下所示 log4j logger com my p
  • 表单提交在 Firefox 中不起作用,但在 IE 中工作正常

    当我单击子页面的提交按钮时 我想提交我的父页面 在我的子页面中 我将代码编写为 string scriptString ASP NET 2 0 if Page ClientScript IsClientScriptBlockRegister
  • Facebook 打开图 GraphMethodException 错误代码 100

    我正在尝试通过 Facebook 教程发布和打开 iOS 的图表故事 https developers facebook com docs tutorials ios sdk tutorial publish open graph stor
  • 暂时无法评级 - FEDEX 中出现错误

    我正在我的项目中通过 php Web 服务集成 FEDEX 但现在我最近两天收到这个错误 此错误是由于 FEDEX 或编码 数据中的任何其他错误而发生的吗 以下是我在使用 FEDEX Web 服务时收到的响应 处理交易时返回错误 严重性 失
  • 放大和缩小小部件

    如何通过小部件上的按键输入来制作缩放效果 该小部件位于滚动区域内 并且有一些使用 QPainter 制作的绘图 这些绘图会随着用户输入而变化 缩放会影响滚动条的长度 距离越近 滚动条越小 最小级别的缩放应该使滚动条与小部件区域一样大 以便可
  • Rcpp函数检查是否缺少值

    我正在将基于 R 的代码转换为基于 Rcpp 的代码 我的函数的头部是 NumericMatrix createMatrixOfLinkRatiosC NumericMatrix matr double threshold4Clean in
  • 如何将文本字段值从一个视图传递到另一个视图 xcode

    我必须将 UITextField 值从一个视图传递到其他视图 第二个 第三个 视图 实际上 在我的第三个 ViewController 中 我有一个滚动视图 我必须在其上显示值 但是 UITextField 值没有被传递 返回 null 无
  • iPhone SDK 3.0之后自定义tableviewcell可以使用initWithFrame吗?

    可以看出 在sdk3 0及以上版本中 initWithFrame和initWithStyle已被弃用 但我们仍然可以使用它而不会出现任何警告 错误 那么继续使用 initWithFrame 在 tableview 中实现自定义单元格可以吗
  • 创建 ASP.Net 处理程序以将图像作为字节返回

    我正在考虑创建一个处理程序来根据传递的 id 返回图像 我之前没有创建过自己的处理程序 当我创建它时 它提到它必须在 IIS 中注册 这个项目分发给很多客户 我是否必须更改每个客户的 IIS 或者是否有某种方法可以解决这个问题 或者有处理程
  • 将 NHibernate 应用程序转换为多租户的最佳实践?

    我有一个简单的 ASP NET MVC OpenID NHibernate应用程序 在 MSSQL Server DB 之上 该应用程序是严格的单租户 仅支持具有 2 个角色的多个用户 Admin and User 我想将此应用程序转换为多
  • Windows 10 LLDB 错误:无法将断点解析到任何实际位置

    我使用的是 Windows 10 使用 MSVC 16 编译了 llvm 11 这是main cpp include
  • EF4 和连接字符串

    我有一个 3 层项目 1 项目 数据 EDMX文件 2 项目 模型 POCO的 3 Project Console 控制台应用程序 我已将连接字符串添加到Project Console
  • 如何使用 Tokio 远程关闭正在运行的任务

    我有一个正在接收数据的 UDP 套接字 pub async fn start gt Result lt std io Error gt loop let mut data vec 0 1024 socket recv from mut da
  • 2022年如何应对后台地理围栏?

    情况如下 当用户创建地理围栏时 我将其保存到后端并向操作系统注册地理围栏 但是每当我的应用程序重新启动时 我都会从后端获取地理围栏并再次在操作系统中重新注册它们 因为它们不断消失 我有两节课MainActivity and FormActi