Я программирую приложение, которое предназначено, чтобы помочь детям встать и быть активными в классе, задавая вопросы маякам.Приложение работает следующим образом:
- введите код игры из API (аналогично Kahoot)
- начать сканирование для маяков
- , обнаружив и находясь в пределах метра отопределенный маяк, войдите в экран вопросов и задайте вопрос, на который пользователь должен ответить.
- повторяйте шаги 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 разных неработающих решения моей проблемы, и я просто не уверен, что делать на этом этапе.Любая помощь будет оценена.Я приложил все усилия, чтобы сделать это как можно более ясным, но если вам все еще потребуется дополнительная информация, я буду рад предоставить ее.