Android
Data objects
Использование Parse GeoPoints в Android для ближайших пользователей
33 мин
использование parse geopoints в вашем android приложении введение parse позволяет вам ассоциировать реальные координаты широты и долготы с объектом добавив parsegeopoint к parseuser , вы сможете легко узнать, какой пользователь ближе к другому, показать местоположения пользователей вашего приложения, а также хранить информацию о местоположении пользователя, среди прочих возможностей вы также можете ассоциировать parsegeopoint с любым parseobject например, если ваше приложение связано с магазином с физическими филиалами, вы сможете создать активность, чтобы показать местоположение этих магазинов или показать пользователю, какой магазин ближе всего к нему другой пример использования этой ассоциации если ваше приложение — это игра, в которой вы создали parseobjects для представления персонажей, добавление parsegeopoints к этим персонажам позволит им отображаться вдоль пути игрока этот учебник объясняет, как использовать некоторые функции parsegeopoint через back4app после прохождения этого учебника вы сможете сделать следующее в любое время вы можете получить доступ к полному проекту android, созданному с помощью этого учебника, в нашем репозитории github предварительные требования чтобы завершить этот учебник, нам нужно android studio приложение для регистрации пользователей входа, созданное на back4app примечание следуйте учебнику по регистрации пользователей входу, чтобы узнать, как создать приложение для регистрации пользователей входа на back4app настоящее устройство с android 4 0 (ice cream sandwich) или новее примечание очень вероятно, что приложение, созданное с помощью этого учебника, не будет работать должным образом на виртуальном устройстве и даже может вызывать сбои, потому что оно может не получить текущее местоположение виртуального устройства поэтому мы настоятельно рекомендуем использовать настоящее устройство для его запуска 1 настройка ключа api google чтобы показать местоположение, которое вы сохранили в parsegeopoint, вам нужно отобразить карту для этого интересно использовать активность google maps чтобы создать активность google maps в android studio, выполните следующие действия перейдите в файл файл > новый новый > google google > активность google maps активность google maps затем автоматически будет создан файл java java , файл layout layout и файл values values соответствующие созданной вами активности google maps перейдите в созданный values values файл (вы можете сделать это, перейдя в app app > res res > values values > google maps api xml google maps api xml ), как показано на изображении ниже этот файл даст вам некоторые инструкции о том, как получить ключ api google maps в основном, вам следует открыть ссылку, показанную на изображении 3\ после открытия вам нужно войти в свою учетную запись google, выбрать создать проект создать проект и нажать на продолжить продолжить при создании проекта google активирует ваш api 4\ после активации вашего api вы сможете получить ключ api, для этого нажмите на 5\ затем ваш ключ будет создан, и вы сможете скопировать его и вставить в файл значения значения , который привел вас на эту страницу, в место, где написано ваш ключ здесь ваш ключ здесь 6\ важно иметь разрешение на использование ниже в вашем файле androidmanifest xml если вы создали активность google maps, следуя приведенным выше инструкциям, то одно из этих разрешений уже должно быть в вашем манифесте, в любом случае вам понадобятся оба для правильной работы вашего приложения, поэтому проверьте, есть ли они в вашем файле androidmanifest xml, в противном случае вставьте их в него 1 \<uses permission android\ name="android permission access coarse location" /> 2 \<uses permission android\ name="android permission access fine location" /> 7\ в начале вашего mapsactivity mapsactivity , импортируйте следующее 1 // android dependencies 2 import android manifest; 3 import android app progressdialog; 4 import android content context; 5 import android content dialoginterface; 6 import android content intent; 7 import android content pm packagemanager; 8 import android location location; 9 import android location locationmanager; 10 import android support annotation nonnull; 11 import android support v4 app activitycompat; 12 import android support v4 app fragmentactivity; 13 import android os bundle; 14 import android util log; 15 import android view\ view; 16 import android widget button; 17 // google maps dependencies 18 import com google android gms maps cameraupdatefactory; 19 import com google android gms maps googlemap; 20 import com google android gms maps onmapreadycallback; 21 import com google android gms maps supportmapfragment; 22 import com google android gms maps model bitmapdescriptorfactory; 23 import com google android gms maps model latlng; 24 import com google android gms maps model markeroptions; 25 // parse dependencies 26 import com parse findcallback; 27 import com parse parseexception; 28 import com parse parsegeopoint; 29 import com parse parsequery; 30 import com parse parseuser; 31 // java dependencies 32 import java util list; 2 настройте панель управления back4app для сохранения местоположения пользователя перейдите на сайт back4app , найдите ваше приложение и откройте его панель управления перейдите в core core > browser browser > user user , как показано на изображении ниже 3\ теперь создайте новый столбец для сохранения местоположения пользователя для этого нажмите кнопку редактировать редактировать в правом верхнем углу, как показано ниже 4\ затем нажмите на добавить столбец добавить столбец 5\ в поле какой тип данных вы хотите сохранить?, выберите опцию geopoint 6\ в поле как мы это назовем?, введите “ местоположение ” 7\ итак, нажмите на добавить столбец, как показано на изображении ниже 8\ теперь ваше приложение может хранить данные о местоположении пользователей, и ваш класс пользователя в панели управления back4pp должен выглядеть так 3 сохраните текущее местоположение пользователей в вашей панели управления back4pp откройте ваш mapsactivity mapsactivity и внутри публичного класса mapsactivity mapsactivity определите int с именем request location request location со значением 1 и locationmanager locationmanager , как в следующем коде 1 private static final int request location = 1; 2 locationmanager locationmanager; 2\ в методе oncreate oncreate создайте locationmanager locationmanager , как в следующем коде 1 locationmanager = (locationmanager)getsystemservice(context location service); 3\ чтобы сохранить местоположение пользователя в вашей панели управления back4pp, просто реализуйте следующий метод и вызовите его в вашем onmapready onmapready методе 1 private void savecurrentuserlocation() { 2 // requesting permission to get user's location 3 if(activitycompat checkselfpermission(usersactivity this, manifest permission access fine location) != packagemanager permission granted && activitycompat checkselfpermission(usersactivity this, manifest permission access coarse location) != packagemanager permission granted){ 4 activitycompat requestpermissions(usersactivity this, new string\[]{android manifest permission access fine location}, request location); 5 } 6 else { 7 // getting last know user's location 8 location location = locationmanager getlastknownlocation(locationmanager network provider); 9 10 // checking if the location is null 11 if(location != null){ 12 // if it isn't, save it to back4app dashboard 13 parsegeopoint currentuserlocation = new parsegeopoint(location getlatitude(), location getlongitude()); 14 15 parseuser currentuser = parseuser getcurrentuser(); 16 17 if (currentuser != null) { 18 currentuser put("location", currentuserlocation); 19 currentuser saveinbackground(); 20 } else { 21 // do something like coming back to the login activity 22 } 23 } 24 else { 25 // if it is null, do something like displaying error and coming back to the menu activity 26 } 27 } 28 } 4\ очень важно реализовать следующий метод, чтобы метод savecurrentuserlocation savecurrentuserlocation работал 1 @override 2 public void onrequestpermissionsresult(int requestcode, @nonnull string\[] permissions, @nonnull int\[] grantresults){ 3 super onrequestpermissionsresult(requestcode, permissions, grantresults); 4 5 switch (requestcode){ 6 case request location 7 savecurrentuserlocation(); 8 break; 9 } 10 } 4 получить местоположение пользователя чтобы получить местоположение пользователя, вам нужно узнать, кто является текущим пользователем, сохранить его местоположение, а затем вернуть местоположение, сохраненное в вашей панели управления back4app для этого реализуйте следующий метод в вашем mapsactivity mapsactivity и вызовите его при необходимости 1 / saving the current user location, using the savecurrentuserlocation method of step 3, to avoid 2 null pointer exception and also to return the user's most current location / 3 savecurrentuserlocation(); 4 private parsegeopoint getcurrentuserlocation(){ 5 6 // finding currentuser 7 parseuser currentuser = parseuser getcurrentuser(); 8 9 if (currentuser == null) { 10 // if it's not possible to find the user, do something like returning to login activity 11 } 12 // otherwise, return the current user location 13 return currentuser getparsegeopoint("location"); 14 15 } 5 показ текущего местоположения пользователя на карте чтобы отобразить местоположение пользователя на карте, вам нужно будет получить местоположение пользователя, а затем создать маркер на карте, используя полученную информацию для этого реализуйте следующий метод в вашем mapsactivity mapsactivity и вызовите его в методе onmapready onmapready 1 private void showcurrentuserinmap(final googlemap googlemap){ 2 3 // calling retrieve user's location method of step 4 4 parsegeopoint currentuserlocation = getcurrentuserlocation(); 5 6 // creating a marker in the map showing the current user location 7 latlng currentuser = new latlng(currentuserlocation getlatitude(), currentuserlocation getlongitude()); 8 googlemap addmarker(new markeroptions() position(currentuser) title(parseuser getcurrentuser() getusername()) icon(bitmapdescriptorfactory defaultmarker(bitmapdescriptorfactory hue red))); 9 10 // zoom the map to the currentuserlocation 11 googlemap animatecamera(cameraupdatefactory newlatlngzoom(currentuser, 5)); 12 } 6 поиск ближайшего пользователя к текущему теперь, когда у вас есть множество пользователей с ассоциированными пространственными координатами, было бы хорошо выяснить, какой пользователь ближе к другому это можно сделать с помощью parsequery сначала вам нужно будет создать запрос parseuser и ограничить его с помощью wherenear wherenear , указав, в каком столбце класса user на back4app вы выполняете запрос (в данном случае столбец “location”) и также указать ссылку parsegeopoint для запроса, с помощью которого будет найден ближайший пользователь (в данном случае parsegeopoint, связанный с текущим местоположением пользователя) следующий код делает это 1 parsequery\<parseuser> query = parseuser getquery(); 2 query wherenear("location", getcurrentuserlocation()); 2\ вы можете ограничить количество результатов этого запроса, добавив к нему ограничение setlimit setlimit по умолчанию результаты ограничены 100 поскольку wherenear wherenear ограничение заставит запрос извлечь массив пользователей, упорядоченных по расстоянию (от ближайшего к дальнему) от currentuserlocation, установив лимит близких пользователей для поиска на число 2, список результатов запроса будет содержать только двух пользователей текущего и ближайшего к нему пользователя следующий код устанавливает лимит результатов на 2 1 query setlimit(2); 3\ теперь, когда вы ограничили свой запрос, давайте извлечем его результаты для этого вы вызовете метод findinbackground findinbackground и передадите в качестве аргумента список пользователей, в котором будут храниться результаты запроса, а также parseexception для обработки ошибок чтобы избежать ошибок, не забудьте очистить кэшированные результаты после выполнения запроса следующий код делает это 1 query findinbackground(new findcallback\<parseuser>() { 2 @override public void done(list\<parseuser> nearusers, parseexception e) { 3 if (e == null) { 4 // do something with the list of results of your query 5 } else { 6 // handle the error 7 } 8 } 9 }); 10 parsequery clearallcachedresults(); 11 } 4\ если ошибок не возникает, у вас будет в списке ближайшие пользователи списке ближайшие пользователи два ближайших пользователя к текущему пользователю (фактический текущий пользователь и ближайший к нему пользователь), теперь вам нужно только найти, кто не является текущим пользователем для этого внутри if (e == null) if (e == null) блока используйте следующий код 1 // avoiding null pointer 2 parseuser closestuser = parseuser getcurrentuser(); 3 // set the closestuser to the one that isn't the current user 4 for(int i = 0; i < nearusers size(); i++) { 5 if(!nearusers get(i) getobjectid() equals(parseuser getcurrentuser() getobjectid())) { 6 closestuser = nearusers get(i); 7 } 8 } 5\ теперь, когда вы знаете, кто является ближайшим пользователем к текущему, вы можете измерить расстояние между ними, используя метод distanceinkilometersto distanceinkilometersto для этого используйте следующий код 1 // finding and displaying the distance between the current user and the closest user to him 2 double distance = getcurrentuserlocation() distanceinkilometersto(closestuser getparsegeopoint("location")); 3 alertdisplayer("we found the closest user from you!", "it's " + closestuser getusername() + " \nyou are " + math round (distance 100 0) / 100 0 + " km from this user "); метод alertdisplayer alertdisplayer используется выше, следующий 1 private void alertdisplayer(string title,string message){ 2 android app alertdialog builder builder = new android app alertdialog builder(usersactivity this) 3 settitle(title) 4 setmessage(message) 5 setpositivebutton("ok", new dialoginterface onclicklistener() { 6 @override 7 public void onclick(dialoginterface dialog, int which) { 8 dialog cancel(); 9 } 10 }); 11 android app alertdialog ok = builder create(); 12 ok show(); 13 } 6\ вы также можете показать обоих пользователей на карте, используя следующий код 1 // showing current user in map, using the method implemented in step 5 2 showcurrentuserinmap(mmap); 3 // creating a marker in the map showing the closest user to the current user location, using method implemented in step 4 4 latlng closestuserlocation = new latlng(closestuser getparsegeopoint("location") getlatitude(), closestuser getparsegeopoint("location") getlongitude()); 5 googlemap addmarker(new markeroptions() position(closestuserlocation) title(closestuser getusername()) icon(bitmapdescriptorfactory defaultmarker(bitmapdescriptorfactory hue green))); 6 // zoom the map to the currentuserlocation 7 googlemap animatecamera(cameraupdatefactory newlatlngzoom(closestuserlocation, 3)); полный метод, который выполняет все 6 шагов выше, следующий 1 private void showclosestuser(final googlemap googlemap){ 2 parsequery\<parseuser> query = parseuser getquery(); 3 query wherenear("location", getcurrentuserlocation()); 4 // setting the limit of near users to find to 2, you'll have in the nearusers list only two users the current user and the closest user from the current 5 query setlimit(2); 6 query findinbackground(new findcallback\<parseuser>() { 7 @override public void done(list\<parseuser> nearusers, parseexception e) { 8 if (e == null) { 9 // avoiding null pointer 10 parseuser closestuser = parseuser getcurrentuser(); 11 // set the closestuser to the one that isn't the current user 12 for(int i = 0; i < nearusers size(); i++) { 13 if(!nearusers get(i) getobjectid() equals(parseuser getcurrentuser() getobjectid())) { 14 closestuser = nearusers get(i); 15 } 16 } 17 // finding and displaying the distance between the current user and the closest user to him, using method implemented in step 4 18 double distance = getcurrentuserlocation() distanceinkilometersto(closestuser getparsegeopoint("location")); 19 alertdisplayer("we found the closest user from you!", "it's " + closestuser getusername() + " \n you are " + math round (distance 100 0) / 100 0 + " km from this user "); 20 // showing current user in map, using the method implemented in step 5 21 showcurrentuserinmap(mmap); 22 // creating a marker in the map showing the closest user to the current user location 23 latlng closestuserlocation = new latlng(closestuser getparsegeopoint("location") getlatitude(), closestuser getparsegeopoint("location") getlongitude()); 24 googlemap addmarker(new markeroptions() position(closestuserlocation) title(closestuser getusername()) icon(bitmapdescriptorfactory defaultmarker(bitmapdescriptorfactory hue green))); 25 // zoom the map to the currentuserlocation 26 googlemap animatecamera(cameraupdatefactory newlatlngzoom(closestuserlocation, 3)); 27 } else { 28 log d("store", "error " + e getmessage()); 29 } 30 } 31 }); 32 parsequery clearallcachedresults(); 33 } 7 настройте back4app для ассоциации parsegeopoint с parseobjects предположим, что пример приложения, которое вы создаете, связано с группой магазинов с физическими филиалами было бы интересно показать все физические филиалы этого магазина на карте для этого создайте класс магазины на панели управления back4pp, сохраните существующие магазины как parseobjects, их местоположения, и после этого приложение сможет запрашивать физические филиалы и отображать их позиции на карте следующие шаги помогут вам в этом 1\ перейдите на веб сайт back4app , войдите в систему, найдите свое приложение и откройте его панель управления 2\ перейдите в основное основное > браузер браузер > создать класс создать класс , как показано на изображении ниже 3\ в поле какой тип а класса вам нужен? а класса вам нужен? , выберите опцию пользовательский пользовательский 4\ в поле как мы это назовем? как мы это назовем? , введите “магазины” и затем нажмите на создать класс создать класс кнопку 5\ затем будет показан новый класс под названием “магазины”, и вы должны вставить в него 2 колонки колонку с типом данных строка строка под названием имя имя , а также другую колонку с типом данных geopoint geopoint под названием местоположение местоположение если вы не помните, как создать колонку, вернитесь к шагу 2, там объясняется, как создать колонку в панели управления back4app ваш класс должен выглядеть так 6\ теперь заполните этот класс информацией для этого нажмите на добавить строку добавить строку кнопку в меню в правом верхнем углу или в середине страницы, как показано на изображении ниже 7\ затем заполните строку необходимой информацией названием магазина и его широтой и долготой после ввода некоторых данных ваш класс магазины должен выглядеть как на изображении ниже если вы хотите ввести больше данных, вы можете нажать на добавить строку добавить строку кнопку вверху или на + + кнопку под последней строкой данных теперь вы готовы использовать информацию о местоположении магазинов в вашем приложении 8 отобразите все местоположения магазинов на карте 1\ вы можете показать все магазины, которые вы добавили в свой класс, на mapsactivity mapsactivity с помощью parsequery сначала вам нужно создать запрос parseobject, указав имя класса back4pp dashboard, который вы хотите запросить (в данном случае класс “stores”), и ограничить его с помощью whereexists whereexists , указав столбец класса store на back4app, по которому вы выполняете запрос (в данном случае столбец “location”) следующий код делает это 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query whereexists("location"); 2\ теперь, когда вы ограничили свой запрос, давайте получим его результаты для этого вы вызовете метод findinbackground findinbackground и передадите в качестве аргумента список магазинов, в котором будут храниться результаты запроса, а также parseexception для обработки ошибок ограничение whereexists whereexists позволит сохранить в списке магазинов только те parseobjects класса, которые имеют связанный с ними parsegeopoint, указывающий их местоположение чтобы избежать ошибок, не забудьте очистить кэшированные результаты после выполнения запроса следующий код делает это 1 query findinbackground(new findcallback\<parseobject>() { 2 @override public void done(list\<parseobject> stores, parseexception e) { 3 if (e == null) { 4 // do something with the list of results of your query 5 } else { 6 // handle the error 7 } 8 } 9 }); 10 parsequery clearallcachedresults(); 11 } 3\ если ошибок не произошло, вы получите в stores stores списке все магазины с привязанным местоположением, теперь вам нужно просто сделать цикл, чтобы отобразить их на карте для этого внутри блока if (e == null) if (e == null) используйте следующий код 1 for(int i = 0; i < stores size(); i++) { 2 latlng storelocation = new latlng(stores get(i) getparsegeopoint("location") getlatitude(), stores get(i) getparsegeopoint("location") getlongitude()); 3 googlemap addmarker(new markeroptions() position(storelocation) title(stores get(i) getstring("name")) icon(bitmapdescriptorfactory defaultmarker(bitmapdescriptorfactory hue azure))); 4 } полный метод, который выполняет все 3 шага выше, приведен ниже вызовите его в методе onmapready onmapready , чтобы он заработал 1 private void showstoresinmap(final googlemap googlemap){ 2 3 parsequery\<parseobject> query = parsequery getquery("stores"); 4 query whereexists("location"); 5 query findinbackground(new findcallback\<parseobject>() { 6 @override public void done(list\<parseobject> stores, parseexception e) { 7 if (e == null) { 8 for(int i = 0; i < stores size(); i++) { 9 latlng storelocation = new latlng(stores get(i) getparsegeopoint("location") getlatitude(), stores get(i) getparsegeopoint("location") getlongitude()); 10 googlemap addmarker(new markeroptions() position(storelocation) title(stores get(i) getstring("name")) icon(bitmapdescriptorfactory defaultmarker(bitmapdescriptorfactory hue azure))); 11 } 12 } else { 13 // handle the error 14 log d("store", "error " + e getmessage()); 15 } 16 } 17 }); 18 parsequery clearallcachedresults(); 19 } 9 показать ближайшего пользователя к магазину 1\ теперь, когда у вас есть множество магазинов с ассоциированными пространственными координатами, было бы хорошо выяснить, какой магазин ближе всего к пользователю это можно сделать с помощью parsequery сначала вам нужно создать запрос parseobject, указав имя класса back4pp dashboard, который вы хотите запросить (в данном случае класс “stores”), и ограничить его с помощью wherenear wherenear , указав колонку класса store на back4app, по которой вы делаете запрос (в данном случае колонка “location”) следующий код делает это 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query wherenear("location", getcurrentuserlocation()); 2\ вы можете ограничить количество результатов этого запроса, добавив к нему ограничение setlimit setlimit по умолчанию результаты ограничены 100 поскольку wherenear wherenear ограничение заставит запрос извлекать массив пользователей, упорядоченных по расстоянию (от ближайшего к самому дальнему) от currentuserlocation, установив лимит близких пользователей для поиска на число 1, список результатов запроса будет содержать только один магазин ближайший к текущему пользователю следующий код устанавливает лимит результатов на 1 1 query setlimit(1); 3\ теперь, когда вы ограничили свой запрос, давайте получим его результаты для этого вы вызовете метод findinbackground findinbackground и передадите в качестве аргумента список объектов магазина, в котором будут храниться результаты запроса, а также parseexception для обработки ошибок чтобы избежать ошибок, не забудьте очистить кэшированные результаты после того, как запрос найдет какой либо результат следующий код делает это 1 query findinbackground(new findcallback\<parseobject>() { 2 @override public void done(list\<parseobject> nearstores, parseexception e) { 3 if (e == null) { 4 // do something with the list of results of your query 5 } else { 6 // handle the error 7 } 8 } 9 }); 10 parsequery clearallcachedresults(); 11 } 4\ если ошибок не произошло, у вас в nearstores nearstores списке будет ближайший магазин к текущему пользователю, теперь вам только нужно отобразить его на mapsactivity mapsactivity для этого внутри if (e == null) if (e == null) блока используйте следующий код 1 parseobject closeststore = nearstores get(0); 2 // showing current user location, using the method implemented in step 5 3 showcurrentuserinmap(mmap); 4 // finding and displaying the distance between the current user and the closest store to him, using method implemented in step 4 5 double distance = getcurrentuserlocation() distanceinkilometersto(closeststore getparsegeopoint("location")); 6 alertdisplayer("we found the closest store from you!", "it's " + closeststore getstring("name") + " \n you are " + math round (distance 100 0) / 100 0 + " km from this store "); 7 // creating a marker in the map showing the closest store to the current user 8 latlng closeststorelocation = new latlng(closeststore getparsegeopoint("location") getlatitude(), closeststore getparsegeopoint("location") getlongitude()); 9 googlemap addmarker(new markeroptions() position(closeststorelocation) title(closeststore getstring("name")) icon(bitmapdescriptorfactory defaultmarker(bitmapdescriptorfactory hue green))); 10 // zoom the map to the closeststorelocation 11 googlemap animatecamera(cameraupdatefactory newlatlngzoom(closeststorelocation, 3)); метод alertdisplayer alertdisplayer используется выше, такой же, как в шаге 6 (поиск ближайшего пользователя к текущему) полный метод, который выполняет все 4 шага выше, выглядит следующим образом 1 private void showcloseststore(final googlemap googlemap){ 2 parsequery\<parseobject> query = parsequery getquery("stores"); 3 query wherenear("location", getcurrentuserlocation()); 4 // setting the limit of near stores to 1, you'll have in the nearstores list only one object the closest store from the current user 5 query setlimit(1); 6 query findinbackground(new findcallback\<parseobject>() { 7 @override public void done(list\<parseobject> nearstores, parseexception e) { 8 if (e == null) { 9 parseobject closeststore = nearstores get(0); 10 // showing current user location, using the method implemented in step 5 11 showcurrentuserinmap(mmap); 12 // finding and displaying the distance between the current user and the closest store to him, using method implemented in step 4 13 double distance = getcurrentuserlocation() distanceinkilometersto(closeststore getparsegeopoint("location")); 14 alertdisplayer("we found the closest store from you!", "it's " + closeststore getstring("name") + " \nyou are " + math round (distance 100 0) / 100 0 + " km from this store "); 15 // creating a marker in the map showing the closest store to the current user 16 latlng closeststorelocation = new latlng(closeststore getparsegeopoint("location") getlatitude(), closeststore getparsegeopoint("location") getlongitude()); 17 googlemap addmarker(new markeroptions() position(closeststorelocation) title(closeststore getstring("name")) icon(bitmapdescriptorfactory defaultmarker(bitmapdescriptorfactory hue green))); 18 // zoom the map to the closeststorelocation 19 googlemap animatecamera(cameraupdatefactory newlatlngzoom(closeststorelocation, 3)); 20 } else { 21 log d("store", "error " + e getmessage()); 22 } 23 } 24 }); 25 26 parsequery clearallcachedresults(); 27 28 } 10 протестируйте ваше приложение 1\ войдите на сайт back4app https //www back4app com/ 2\ найдите ваше приложение и нажмите на панель управления панель управления > ядро ядро > браузер браузер > пользователь пользователь и создайте несколько пользователей с привязанными к ним местоположениями, чтобы метод showclosestuser showclosestuser работал 3\ запустите ваше приложение на реальном устройстве и зарегистрируйте аккаунт попробуйте все функции! 4\ вернитесь на панель управления back4pp и проверьте, сохранено ли ваше местоположение в строке пользователя готово! на этом этапе вы можете использовать некоторые функции parsegeopoint через back4app!