Отображать уведомление, когда устройство находится вне диапазона маяка - PullRequest
0 голосов
/ 08 октября 2018

С помощью этой ссылки я могу отображать уведомление, когда мое устройство входит в радиус действия маяка.Я также хочу отображать уведомление, когда устройство выходит за пределы диапазона маяка.Где я должен упомянуть это?

Это мой код

override fun didRangeBeaconsInRegion(p0: MutableCollection<Beacon>?, p1: Region?) {

        for (beacon in p0!!) {
            if (beacon.getServiceUuid() == 0xfeaa && beacon.getBeaconTypeCode() == 0x00) {
                // This is a Eddystone-UID frame
                val namespaceId = beacon.getId1()
                val instanceId = beacon.getId2()
                Log.d("RangingActivity", "I see a beacon transmitting namespace id: " + namespaceId +
                        " and instance id: " + instanceId +
                        " approximately " + beacon.getDistance() + " meters away.")
                runOnUiThread {
                    showNotification("Entry", "Hello world")
                }
            }
        }
    }

    @TargetApi(Build.VERSION_CODES.O)
    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)
    fun showNotification(title: String, message: String) {
        val notifyIntent = Intent(this, MainActivity::class.java)
        notifyIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
        val pendingIntent: PendingIntent = PendingIntent.getActivities(
                this,
                0,
                arrayOf(notifyIntent),
                PendingIntent.FLAG_UPDATE_CURRENT
        )

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val mChannel = NotificationChannel("1", "Notify Channel", NotificationManager.IMPORTANCE_HIGH)
            val notification = NotificationCompat.Builder(this, "1")
                    .setSmallIcon(R.drawable.ic_location_arrow)
                    .setContentTitle(title)
                    .setContentText(message)
                    .setAutoCancel(true)
                    .setContentIntent(pendingIntent)
                    .setChannelId("1")
                    .build()
            notification.defaults = notification.defaults or Notification.DEFAULT_SOUND
            val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(mChannel)
            notificationManager.notify(1, notification)
            startForegroundService(notifyIntent)
        } else {
            val notification = NotificationCompat.Builder(this, "1")
                    .setSmallIcon(R.drawable.ic_location_arrow)
                    .setContentTitle(title)
                    .setContentText(message)
                    .setAutoCancel(true)
                    .setContentIntent(pendingIntent)
                    .setChannelId("1")
                    .build()
            notification.defaults = notification.defaults or Notification.DEFAULT_SOUND
            val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.notify(1, notification)
        }
    }

Кроме того, я постоянно получаю уведомления, когда я нахожусь в зоне действия маяка.Как только я попаду в диапазон, я хочу, чтобы мое уведомление отображалось только один раз.

1 Ответ

0 голосов
/ 08 октября 2018

Несколько советов:

  1. Используйте мониторинг маяка, а не дальность маяка.API мониторинга дают вам один обратный вызов при первом появлении маяка (didEnterRegion) и один при его исчезновении (didExitRegion).Вы можете переместить свою логику в эти обратные вызовы.См. «Получение уведомлений, когда маяки появляются в области здесь .

  2. В настоящее время код проверяет, что это маяк Eddystone, проверяя UUID службы и вводя код вручнуюНе делайте этого. Вместо этого очистите все BeaconParsers, кроме одного для Eddystone, чтобы вы знали, когда получите обратный вызов.

...