0

Je dispose actuellement d'une configuration d'application pour recevoir des notifications à distance à l'aide d'Azure Notification Hub. Maintenant, je voudrais rechercher des iBeacons, voir si un spécifique est proche et si oui, la notification ne devrait pas être montrée à l'utilisateur. Cependant, si la balise n'est pas en vue, l'utilisateur devrait recevoir cette notification.Recherche d'iBeacon lors de la réception d'une notification à distance

Fondamentalement, je veux que la balise pour supprimer les notifications pour cette application.

Comment pourrait-on s'y prendre?

Répondre

0

Vous pouvez utiliser une bibliothèque opensource pour travailler avec des balises. J'ai utilisé la bibliothèque Altbeacon par exemple. Voici les exemples: https://altbeacon.github.io/android-beacon-library/samples.html Pour votre cible, vous devez implémenter l'interface BeaconConsumer sur Activity ou Service. Il a une méthode onBeaconServiceConnect(). Exemple de mise en œuvre:

@Override 
    public void onBeaconServiceConnect() { 
     beaconManager.addRangeNotifier(new RangeNotifier() { 
      @Override 
      public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
       if (beacons.size() == 0) { 
        Log.i(TAG, "Show your notification here");   
       } 
      } 
     }); 

     try { 
      beaconManager.startRangingBeaconsInRegion(new Region("someRangingUniqueId", null, null, null)); 
     } catch (RemoteException e) { } 
    } 
1

Basé sur the docs from Azure, lorsqu'une notification à distance arrive, vous obtenez un rappel comme celui-ci:

public class MyHandler extends NotificationsHandler { 
    public static final int NOTIFICATION_ID = 1; 
    private NotificationManager mNotificationManager; 
    NotificationCompat.Builder builder; 
    Context ctx; 

    @Override 
    public void onReceive(Context context, Bundle bundle) { 
    ctx = context; 
    String nhMessage = bundle.getString("message"); 
    sendNotification(nhMessage); 
    if (MainActivity.isVisible) { 
     MainActivity.mainActivity.ToastNotify(nhMessage); 
    } 
    } 

    private void sendNotification(String msg) { 
    // put your notification code here 
    ... 
    } 

}

Si vous souhaitez filtrer les notifications en fonction de quelles balises sont présentes, vous pouvez ajouter cette logique à la méthode onReceive comme ceci:

public void onReceive(Context context, Bundle bundle) { 
    if (!(MyApplication)this.getApplication()).isBeaconVisible()) { 
     // Suppress notification by returning early from method 
     return; 
    } 
    ... 
    } 

Le isBeaconVisible() ci-dessus pourrait être mis en œuvre dans une classe d'application Android personnalisée en utilisant la bibliothèque Beacon Android avec quelque chose comme ci-dessous. Vous devrez en savoir plus sur la configuration de cette bibliothèque pour que cela fonctionne. Vous devrez également enregistrer la classe Application personnalisée dans votre AndroidManifest.xml.

public class MyApplication extends Application implements BeaconConsumer, RangeNotifier { 

    public Collection<Beacon> mVisibleBeacons; 

    public void onCreate() { 
     super.onCreate(); 
     BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); 
     // TODO: look up the proper I_BEACON_LAYOUT in a google search 
     beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(I_BEACON_LAYOUT)); 
     beaconManager.addRangeNotifier(this); 

    } 

    @Override 
    public void onBeaconServiceConnect() { 
     BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); 
     try { 
      beaconManager.startRangingBeaconsInRegion(new Region("all-beacons", null, null, null)); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
     mVisibleBeacons = beacons; 
    } 

    public boolean isBeaconVisible() { 
     return mVisibleBeacons.size() > 0; 
    } 
} 

La logique ci-dessus pour isBeaconVisible() renvoie vrai si une quelconque balise avec un identificateur a été vu dans la dernière seconde. Mais vous pouvez modifier cela pour le rendre plus sophistiqué selon vos besoins.