Kontakt.io SDK: Есть ли способ жесткого кода в списке маяков, чтобы я мог выбрать их произвольно, когда мне нужно будет найти маяк? - PullRequest
0 голосов
/ 04 мая 2019

Я программирую приложение, которое предназначено, чтобы помочь детям встать и быть активными в классе, задавая вопросы маякам.Приложение работает следующим образом:

  1. введите код игры из API (аналогично Kahoot)
  2. начать сканирование для маяков
  3. , обнаружив и находясь в пределах метра отопределенный маяк, войдите в экран вопросов и задайте вопрос, на который пользователь должен ответить.
  4. повторяйте шаги 2 и 3, пока не останется вопросов.

Проблема возникает из-за2-й шаг процесса.Я хочу получить список всех имеющихся у меня маяков (либо жестко запрограммированных в приложении, либо собирать их на лету), чтобы я мог просто выбрать случайный маяк и попросить пользователя найти этот маяк, чтобы ответить на следующий вопрос.Когда я пытаюсь создать жесткий код в маяках, дистанционирование не работает (он просто читает 0.0), и когда я пытаюсь собрать их во время работы приложения, приложение будет зависать или зависать при обновлении маяков.Я использую Kontakt Android SDK.

Я пытался поместить петли for в onIBeaconsUpdated, чтобы собирать из списка обновляемых маяков и просто выбирать их случайным образом, но он будет постоянно менять нужный маяк, делая невозможным егопользователь для завершения.

Я также пытался составить список маяков, используя данные из маяков на веб-панели Kontakt.io, но я должен пропустить шаг, который связывает эти сгенерированные маяки с физическими маяками, или что-то еще, потому что listOfHardcodedBeacons.get(0).getDistance()всегда будет возвращать 0.0 независимо от того, на какой маяк вы смотрите или на каком расстоянии вы находитесь от маяка.

Пожалуйста, извините за мой ужасный код:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_scanner);
        distanceTV = findViewById(R.id.distanceText);
        setupProximityManager();
        fillBeaconList(listOfHardcodedBeacons);
        randint = random.nextInt(listOfHardcodedBeacons.size());

        super.onCreate(savedInstanceState);
    }

    private void fillBeaconList(List<IBeaconDevice> beaconList) {

        //beacon #1
        BeaconDevice beacon1 = new BeaconDevice.Builder()
                .uniqueId("q0hg")
                .proximityUUID(UUID.fromString("f7826da6-4fa2-4e98-8024-bc5b71e0893e"))
                .major(1)
                .minor(0)
                .address("D3:95:F8:1E:CB:6E")
                .build();

        //beacon #2
        BeaconDevice beacon2 = new BeaconDevice.Builder()
                .uniqueId("eHI1")
                .proximityUUID(UUID.fromString("f7826da6-4fa2-4e98-8024-bc5b71e0893e"))
                .major(1)
                .minor(1)
                .address("CF:FE:16:60:0D:50")
                .build();

        //beacon #3
        BeaconDevice beacon3 = new BeaconDevice.Builder()
                .uniqueId("R9Bq")
                .proximityUUID(UUID.fromString("f7826da6-4fa2-4e98-8024-bc5b71e0893e"))
                .major(1)
                .minor(2)
                .address("CF:81:E3:B6:D1:D0")
                .build();

        //beacon #4
        BeaconDevice beacon4 = new BeaconDevice.Builder()
                .uniqueId("zUiD")
                .proximityUUID(UUID.fromString("f7826da6-4fa2-4e98-8024-bc5b71e0893e"))
                .major(55910)
                .minor(12620)
                .address("DC:65:69:47:93:26")
                .build();

        //beacon #5
        BeaconDevice beacon5 = new BeaconDevice.Builder()
                .uniqueId("QR18")
                .proximityUUID(UUID.fromString("f7826da6-4fa2-4e98-8024-bc5b71e0893e"))
                .major(30785)
                .minor(10106)
                .address("D7:1F:B8:AF:85:B2")
                .build();

        //beacon #6
        BeaconDevice beacon6 = new BeaconDevice.Builder()
                .uniqueId("uhnG")
                .proximityUUID(UUID.fromString("f7826da6-4fa2-4e98-8024-bc5b71e0893e"))
                .major(48261)
                .minor(35926)
                .address("CC:2C:82:59:93:C6")
                .build();

        beaconList.add(beacon1);
        beaconList.add(beacon2);
        beaconList.add(beacon3);
        beaconList.add(beacon4);
        beaconList.add(beacon5);
        beaconList.add(beacon6);
    }

    //TODO: figure out list of known beacons and do stuff
    private IBeaconListener createIBeaconListener() {

        return new IBeaconListener() {
            @Override
            public void onIBeaconDiscovered(IBeaconDevice ibeacon, IBeaconRegion region) {

                //Toast.makeText(getApplicationContext(), String.format("I found beacon %s! :D", ibeacon.getUniqueId()), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onIBeaconsUpdated(List<IBeaconDevice> ibeaconList, IBeaconRegion region) {

                /* This was my original code. It pulls the closest beacon. It isn't what I want because I don't want the user to keep pulling questions from the same beacon.

                String rounded = df.format(ibeaconList.get(0).getDistance());
                distanceTV.setText(String.format("Distance to %s: ", ibeaconList.get(0).getUniqueId()) + rounded);
                if(ibeaconList.get(0).getDistance() <= 2.7432) { //2.7432 = 9 feet
                    distanceTV.setText("Found it! :D");
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            toQuestions();
                        }
                    }, 1000);
                    proximityManager.stopScanning();
                }
                */

            }

            @Override
            public void onIBeaconLost(IBeaconDevice ibeacon, IBeaconRegion region) {
                //Toast.makeText(getApplicationContext(), String.format("I lost beacon %s! D:", ibeacon.getUniqueId()), Toast.LENGTH_SHORT).show();
            }

        };
    }

    public void toQuestions() {

        Intent intent = new Intent(this, QuestionActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        this.startActivity(intent);
        finish();
    }

На данный момент код будет извлекать только из первого маяка в ibeaconList и сообщать пользователю, чтобы перейти к этому, но этоне идеально подходит для цели приложения.Как указывалось ранее, я хочу вытащить из случайного списка предопределенных маяков и просто перебрать список случайным образом.Я написал и удалил, вероятно, 4 разных неработающих решения моей проблемы, и я просто не уверен, что делать на этом этапе.Любая помощь будет оценена.Я приложил все усилия, чтобы сделать это как можно более ясным, но если вам все еще потребуется дополнительная информация, я буду рад предоставить ее.

1 Ответ

0 голосов
/ 04 мая 2019

всем, кто может это прочитать, я разобрался с ответом. Что я сделал, это было:

IBeaconFilter filter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_scanner);
        distanceTV = findViewById(R.id.distanceText);
        fillBeaconList(listOfHardcodedBeacons);
        randint = random.nextInt(listOfHardcodedBeacons.size());
        filter = new IBeaconUniqueIdFilter(listOfHardcodedBeacons.get(randint).getUniqueId());

        setupProximityManager();

        super.onCreate(savedInstanceState);
    }

private void setupProximityManager(){
        proximityManager = ProximityManagerFactory.create(this);

        //configure proximity manager basic options
        proximityManager.configuration()
                //using ranging for continuous scanning or MONITORING for scanning with intervals
                .scanPeriod(ScanPeriod.RANGING)
                //using BALANCED for best performance/battery ratio
                .scanMode(ScanMode.LOW_LATENCY)
                //OnDeviceUpdate callback will be received with 1 second interval
                .deviceUpdateCallbackInterval(TimeUnit.MILLISECONDS.toMillis(20));

        //setting up iBeacon and Eddystone spaces listeners
        //proximityManager.setSpaceListener(createSpaceListener());

        //setting up iBeaconListener to only listen for random beacon (filter)
        proximityManager.filters().iBeaconFilter(filter);
        proximityManager.setIBeaconListener(createIBeaconListener());
        proximityManager.setEddystoneListener(new SimpleEddystoneListener() {
        });

    }

Это позволило мне сохранить существующий (закомментированный) код в onIBeaconsUpdated без каких-либо беспорядочных списков. Это решение принимает случайный int, созданный при запуске Activity, а затем использует этот int в качестве индекса для списка жестко закодированных маяков, который затем используется в качестве уникального идентификатора для фильтра. Когда Proximity Manager начинает сканирование, он обнаруживает только маяки с таким уникальным идентификатором. Это было решение, которого я больше нигде не видел, поэтому я пишу здесь для потомков.

...