收到远程通知后扫描iBeacon

时间:2017-07-05 09:52:38

标签: java android android-studio ibeacon azure-notificationhub

我目前有一个应用程序设置,可以使用Azure Notification Hub接收远程通知。 现在,我想扫描iBeacons,查看特定的是否在附近,如果是,则不应向用户显示通知。但是,如果信标不在视线范围内,则用户应收到此通知。

基本上我希望信标能够抑制此应用的通知。

如何做到这一点?

2 个答案:

答案 0 :(得分:1)

根据the docs from Azure,当收到远程通知时,您会收到如下回调:

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
    ...
  }

}

如果要根据信标存在过滤通知,可以将该逻辑添加到onReceive方法,如下所示:

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

以上isBeaconVisible()可以使用Android Beacon Library在自定义Android应用程序类中实现,如下所示。您需要阅读有关如何设置该库以使其工作的更多信息。您还需要在AndroidManifest.xml中注册自定义Application类。

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;
    }
}

如果在最后一秒看到任何带有任何标识符的信标,则isBeaconVisible()的上述逻辑返回true。但您可以根据自己的要求对其进行更改以使其更加复杂。

答案 1 :(得分:0)

您可以使用一些开源库来处理信标。我以Altbeacon库为例。 以下是样本:https://altbeacon.github.io/android-beacon-library/samples.html 对于您的目标,您需要在Activity或Service上实现BeaconConsumer接口。它有一个方法onBeaconServiceConnect()。实施示例:

    @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) {    }
    }