Как запустить фоновый сервис для отправки push-уведомлений, когда я вхожу в геозону? - PullRequest
0 голосов
/ 13 мая 2019

Мое приложение посвящено управлению задачами, в которых для конкретной задачи я могу назначить местоположение.Я храню эту широту и долготу местоположения в базе данных. Теперь я хочу создать географический забор во время выполнения вокруг текущего местоположения пользователей. И проверить, существуют ли эти сохраненные значения в фехтовании или нет.Если существует, я хочу отправить уведомление пользователю о том, что у вас есть задание, назначенное для этого местоположения.

В моей основной деятельности у меня есть метод create для получения значений широты из базы данных.Получить текущее местоположение и сгенерировать геозону вокруг него в 500 м. Проверьте, совпадает ли значение базы данных и текущее значение широты, если совпадает, отправьте уведомление. Для отправки уведомления я создал фоновый сервис.Теперь моя служба работает правильно и отправляет уведомления непрерывно, но когда я удаляю свое приложение из истории, я не получаю уведомления. Я пытался использовать одно сигнальное push-уведомление, но не решил мою проблему.Не открывая мою заявку, можем ли мы постоянно проверять это условие в фоновом режиме и отправлять уведомления?В фоновом режиме без открытия приложения мы можем получить доступ к значениям базы данных sqlite?

                    private void startGeofence() {
      Log.i(TAG, "startGeofence()");
      LatLng latLng = new LatLng(latitude, longitude);
      Geofence geofence = createGeofence(latLng, GEOFENCE_RADIUS);
      GeofencingRequest geofenceRequest = createGeofenceRequest(geofence);
      arrayList = dataBaseHelper.getLatlongList();
      arrayList.removeAll(Arrays.asList(" ", null));
      arrayList.removeAll(Arrays.asList("", null));
      Log.d(TAG, "onStart: " + arrayList.toString());
      String lat = String.format("%.2f", latitude);
      //String lat = String.valueOf(latitude);
      for (int j = 0; j < arrayList.size(); j++) {

         String first = arrayList.get(j);
         String value = String.format("%.5s", first);
         if (!value.equals(lat)) {
            //addGeofence(geofenceRequest);

            } else {
               if (ActivityCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) != 
       PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then 
       overriding
                //   public void onRequestPermissionsResult(int 
       requestCode, String[] permissions,
                //                                          int[] 
          grantResults)
                // to handle the case where the user grants the 
           permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            geofencingClient.addGeofences(createGeofenceRequest(geofence), 
              getGeofencePendingIntent())
                    .addOnSuccessListener(this, new 
            OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            // Geofences added
                            Log.d(TAG, "onSuccess: successfully added");
                            getGeofencePendingIntent();
                            // ...
                        }
                    })
                    .addOnFailureListener(this, new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // Failed to add geofences
                            // ...
                        }
                    });

                    }
                  }


             }

       private PendingIntent getGeofencePendingIntent() {
             // Reuse the PendingIntent if we already have it.
      if (geoFencePendingIntent != null) {
        return geoFencePendingIntent;
     }
           Intent intent = new Intent(this, 
       GeofenceTrasitionService.class);
            // We use FLAG_UPDATE_CURRENT so that we get the same pending 
            intent 
         back when
    // calling addGeofences() and removeGeofences().
      geoFencePendingIntent = PendingIntent.getService(this, 0, intent, 
             PendingIntent.
            FLAG_UPDATE_CURRENT);
        return geoFencePendingIntent;
             }



                if (intent != null) {
                    GeofencingEvent geofencingEvent = 
                 GeofencingEvent.fromIntent(intent);

                       // Handling errors
                         if ( geofencingEvent.hasError() ) {
            String errorMsg = 
             getErrorString(geofencingEvent.getErrorCode() );
            Log.e( TAG, errorMsg );
            return;
             }

         // Retrieve GeofenceTrasition
         int geoFenceTransition = geofencingEvent.getGeofenceTransition();
         // Check if the transition type
         if ( geoFenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
                 geoFenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT ) 
                  {
            // Get the geofence that were triggered
             List<Geofence> triggeringGeofences = 
                 geofencingEvent.getTriggeringGeofences();
            // Create a detail message with Geofences received
            String geofenceTransitionDetails = 
           getGeofenceTrasitionDetails(geoFenceTransition, 
             triggeringGeofences );
            // Send notification details as a String
             try {
                OneSignal.postNotification(new JSONObject("{'contents': 
            {'en':'Test Message'}, 'include_player_ids': ['" + playerId + 
           "']}"), null);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            Log.d(TAG, "onHandleIntent: Send Notification");
            //sendNotification( geofenceTransitionDetails );
                  }

В фоновом режиме постоянно проверяйте местоположение базы данных и текущее местоположение, если местоположение базы данных существует в текущем расположении. Забор отправляйте уведомления также, если я удаляю приложение из истории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...