android - 附近的 Google Play 服务注册失败,有 TOO_MANY_PENDING_INTENTS 个

标签 android google-play-services android-pendingintent google-nearby

在我的登录申请中,我们正在附近注册 Google Play 服务,并在注销时取消注册(代码如下)。即使在注册期间,我们也总是先取消订阅,然后再订阅。

但在几次注销/登录循环后,应用程序不断捕获 ApiException 消息 ApiException: 2801: Will exceed MAX_PENDING_INTENTS_PER_APP=5

我知道这个错误是什么意思,但据我所知,代码首先是取消注册。所以它不应该达到那个配额。

订阅代码,在登录时和信标更新时运行

    val nearby = Nearby.getMessagesClient(app, MessagesOptions.Builder()
            .setPermissions(NearbyPermissions.BLE)
            .build())
    val task = apis
        .checkApiAvailability(nearby)
        .onSuccessTask { nearby.unsubscribe(BeaconReceiver.generatePendingIntent(app)) }
        .onSuccessTask {
            return@onSuccessTask if (beacons.isEmpty()) {
                // if beacons is empty, I don't have to register anything,
                Tasks.forResult(null as Void?)
            } else {
                val messageFilter = MessageFilter.Builder()
                beacons.forEach {
                    messageFilter.includeIBeaconIds(it.proximityUuid, it.major, it.minor)
                }

                val options = SubscribeOptions.Builder()
                    .setStrategy(Strategy.BLE_ONLY)
                    .setFilter(messageFilter.build())
                    .build()

                nearby.subscribe(BeaconReceiver.generatePendingIntent(app), options)
            }
        }
    // inside awaitResult there's Task.await, and catch/log exceptions
    val result = awaitResult("Beacon", 30, task)

取消订阅代码,在每次注销时运行,几乎与订阅相同

    val nearby = Nearby.getMessagesClient(app, MessagesOptions.Builder()
        .setPermissions(NearbyPermissions.BLE)
        .build())
    val geofence = GeofencingClient(app)
    val task = GoogleApiAvailability.getInstance().checkApiAvailability(nearby, geofence)
        .onSuccessTask { nearby.unsubscribe(BeaconReceiver.generatePendingIntent(app)) }
        .onSuccessTask { geofence.removeGeofences(GeofenceReceiver.generatePendingIntent(app)) }
    val result = awaitResult("SdkDisabled", 30, task)

和 PendingIntent 代码,它使用我们的显式类和静态请求代码:

val intent = Intent(context, BeaconReceiver::class.java)
return PendingIntent.getBroadcast(context, BEACON_REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT)

所以问题:

为什么会抛出异常,我该怎么做才能正确注销/取消订阅?

最佳答案

当您取消订阅时,删除调用 getBroadcast() 时的 PendingIntent.FLAG_CANCEL_CURRENT

取消订阅时,您需要提供一个“匹配”您用于订阅的PendingIntent。通过使用 FLAG_CANCEL_CURRENT,您将取消现有的 PendingIntent 并创建一个新的,显然新的与您订阅时使用的不“匹配”。

恕我直言,这是 Play 服务库中的错误,因为它没有使用正确的“匹配”算法,因为 PendingIntent 应该“匹配”。

关于android - 附近的 Google Play 服务注册失败,有 TOO_MANY_PENDING_INTENTS 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51838432/

相关文章:

android - 如何停止 fcm 后台自动生成的通知?

android层列表不会同时显示渐变和实体

android - 编译错误 : "Conversion to Dalvik format failed: Unable to execute dex: Cannot merge new index 74303 into a non-jumbo instruction"

android - Admob 插页式 loadEd 功能太慢

android - 在 PackageInstaller 完成( self )更新后启动应用程序

android - OnItemClickListener() - Android ListView

android - React Native FAILURE : Build failed with an exception. 无法解析 ':classpath'。找不到 com.android.tools.build :gradle:3. 0.1

android - 构建失败并显示 'Program type already present: android.arch.core.util.Function'

android - 发送未收到的短信广播

android - 从通知打开应用程序