用户在某个区域时如何发送通知?

时间:2017-09-10 07:16:49

标签: android

我有一个应用,当用户在特定区域时发送通知。我正在实施LocationListener,在onLocationChanged方法中,我有类似的内容。

 public void onLocationChanged(Location location) {

        Cursor cursor = new DatabaseHelper(this).getAll(); //Gets data from database


        while (cursor.moveToNext()) {
            double lat = Double.valueOf(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL2)));
            double lon = Double.valueOf(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL3)));


            float distance[] = new float[2];

            Location.distanceBetween(location.getLatitude(), location.getLongitude(), lat, lon, distance);

//Notifications are sent from the below lines

            if (distance[0] <= Double.valueOf(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL4)))) {


                NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                builder.setContentTitle("You're nearby a reminder");
                builder.setSmallIcon(R.mipmap.ic_launcher);
                builder.setContentText(cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL1)) + " at " + cursor.getString(cursor.getColumnIndex(DatabaseHelper.COL5)));

                builder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
                builder.setAutoCancel(true);

                Intent intent = new Intent(this, StartActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT);

                builder.setContentIntent(pendingIntent);

                NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.notify(cursor.getPosition(), builder.build());
            }

        }

    }

使用locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, this);调用侦听器,程序运行正常但是当用户移动时,通知音调每10分钟播放一次。

有没有办法只播放一次通知声音,直到状态栏没有清除通知?

2 个答案:

答案 0 :(得分:1)

解决此问题的最佳方法是使用GeoFences功能。有关详细信息,请参阅https://developer.android.com/training/location/geofencing.html

大纲: - 应用程序注册底层操作系统 - 说 - 这里是我想要你监控的我的地理位置列表(特定位置+距离位置的半径)。 - 如果我的用户进入这个地理围栏 - 叫醒我并告诉我。 - 在那个时间点 - 您可以继续执行任何步骤(调用服务器并询问您需要向用户显示哪些信息),或者只是发送推送通知(在应用程序通知中)以执行必要的工作。 / p>

希望这有帮助。

答案 1 :(得分:1)

很容易就像馅饼一样。 Lame让我不读通知文件。

            Notification compat = builder.build();
            compat.flags = Notification.FLAG_ONLY_ALERT_ONCE;

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

            notificationManager.notify(cursor.getPosition(), compat);

刚刚添加Notification.flag就可以了。