如何检查Android是否没有信标可用

时间:2017-05-09 06:56:35

标签: android beacon estimote

我正在尝试使用Beacons,我有这个代码: 按照this教程:

Activity2.java

public class Activity2 extends AppCompatActivity {

    //String myString = MyViewClass.infoToPass;

    public static final String TAG = "Airport";
    TextView tvFooter;

    private static final Map<String, List<String>> PLACES_BY_BEACONS;

    // TODO: replace "<major>:<minor>" strings to match your own beacons.
    static {
        Map<String, List<String>> placesByBeacons = new HashMap<>();
        placesByBeacons.put("22504:48827", new ArrayList<String>() {{
            add("Heavenly Sandwiches");
            // read as: "Heavenly Sandwiches" is closest
            // to the beacon with major 22504 and minor 48827
            add("Green & Green Salads");
            // "Green & Green Salads" is the next closest
            add("Mini Panini");
            // "Mini Panini" is the furthest away
        }});
        placesByBeacons.put("648:12", new ArrayList<String>() {{
            add("Mini Panini");
            add("Green & Green Salads");
            add("Heavenly Sandwiches");
        }});
        PLACES_BY_BEACONS = Collections.unmodifiableMap(placesByBeacons);
    }

    private List<String> placesNearBeacon(Beacon beacon) {
        String beaconKey = String.format("%d:%d", beacon.getMajor(), beacon.getMinor());
        if (PLACES_BY_BEACONS.containsKey(beaconKey)) {
            return PLACES_BY_BEACONS.get(beaconKey);
        }
        return Collections.emptyList();
    }

    private BeaconManager beaconManager;
    private Region region;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);

        //updateCordinate("Just some random text");

        Log.d(TAG, "onCreate");

        beaconManager = new BeaconManager(this);
        beaconManager.setRangingListener(new BeaconManager.RangingListener() {
            @Override
            public void onBeaconsDiscovered(Region region, List<Beacon> list) {
                Log.d(TAG, "onBeaconsDiscovered");
                if (!list.isEmpty()) {
                    Beacon nearestBeacon = list.get(0);
                    List<String> places = placesNearBeacon(nearestBeacon);
                    // TODO: update the UI here
                    Log.d(TAG, "Nearest places: " + places);
                }
                else{
                    // this line is not executing
                    Log.d(TAG, "You are not in area of beacons");
                }
            }
        });
        region = new Region("ranged region", UUID.fromString("B9407F30-F5F8-466E-AFF9-25556B57FE6D"), null, null);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
        SystemRequirementsChecker.checkWithDefaultDialogs(this);

        beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
            @Override
            public void onServiceReady() {
                Log.d(TAG, "onServiceReady");
                beaconManager.startRanging(region);
            }
        });
    }

    @Override
    protected void onPause() {
        beaconManager.stopRanging(region);
        Log.d(TAG, "onPause");
        super.onPause();
    }


    //public void updateCordinate(String text1) {
     //   tvFooter = (TextView) findViewById(R.id.tvFooter);
     //   tvFooter.setText("Location is :" + myString);
   // }
}

现在我想要它:

  • 如果我周围没有任何Beacons,我想检查它并将该值存储在某个变量中,以便我可以在其他类(非活动类)中使用它。
  • 另外如何检查范围? (我知道这超出了这个问题的范围,但很少有人会受到欢迎)

1 个答案:

答案 0 :(得分:0)

//你可能会忽略通知代码,因为我在我的应用程序中使用了Beacons,i //当信标//进/出范围时,即使通过应用程序发送通知也不会打开。

 public class EstimoteService extends Service implements BeaconManager.RangingListener, BeaconManager.MonitoringListener {
    private static final int NOTIFICATION_ID = 123;
    private static final Region ALL_ESTIMOTE_BEACONS_REGION = new Region("regionId", null, null, null);
    private Beacon beaconFound;

    private NotificationManager notificationManager;
    private BeaconManager beaconManager;

    @Override
    public void onCreate() {
        super.onCreate();

        initResources();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        notificationManager.cancel(NOTIFICATION_ID);

        // Default values are 5s of scanning and 25s of waiting time to save CPU cycles.
        // In order for this demo to be more responsive and immediate we lower down those values.
        beaconManager.setBackgroundScanPeriod(TimeUnit.SECONDS.toMillis(1), 0);
        beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
            @Override
            public void onServiceReady() {
                try {
                    beaconManager.startRanging(ALL_ESTIMOTE_BEACONS_REGION);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });


        return START_NOT_STICKY;
    }

    private void initResources() {
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        beaconManager = new BeaconManager(this);
        beaconManager.setRangingListener(this);
        beaconManager.setMonitoringListener(this);
    }

    @Override
    public void onBeaconsDiscovered(Region region, List<Beacon> beacons) {
        if (beaconFound == null) {
            // Get the first available beaconFound
            if (beacons.isEmpty())
                return;

            beaconFound = beacons.get(0);
            final Region beaconRegion = new Region("regionId", beaconFound.getProximityUUID(), beaconFound.getMajor(), beaconFound.getMinor());
            beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
                @Override
                public void onServiceReady() {
                    try {
                        beaconManager.startMonitoring(beaconRegion);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

    @Override
    public void onEnteredRegion(Region region, List<Beacon> beacons) {
        postNotification("Entered region");
        System.out.println("---> enter region");
    }

    @Override
    public void onExitedRegion(Region region) {
        postNotification("Exited region");
        System.out.println("---> exit region");
    }

    private void postNotification(String msg) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setSmallIcon(R.drawable.beacon_gray).setContentTitle("XXX").setContentText(msg);
        notificationManager.notify(NOTIFICATION_ID, builder.build());
    }
}