代码之家  ›  专栏  ›  技术社区  ›  Budius

Google Play服务附近注册失败,有太多未完成的打算

  •  1
  • Budius  · 技术社区  · 7 年前

    在我的登录应用程序上,我们正在附近注册Google Play服务,在注销时取消注册(代码如下)。即使在注册过程中,我们也总是先取消订阅,然后再订阅。

    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)
    

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

    所以问题是:

    1 回复  |  直到 7 年前
        1
  •  1
  •   David Wasser    7 年前

    移除 PendingIntent.FLAG_CANCEL_CURRENT getBroadcast() 当你退订时。

    PendingIntent 它“匹配”你以前订阅的那个。通过使用 FLAG_CANCEL_CURRENT 你正在取消现有的 创建一个新的,显然新的和你订阅时使用的不匹配。

    处理意图