Использование Parse GeoPoints в Android для ближайших пользователей
33 мин
использование parse geopoints в вашем android приложении введение parse позволяет вам ассоциировать реальные координаты широты и долготы с объектом добавив parsegeopoint к parseuser , вы сможете легко узнать, какой пользователь ближе к другому, показать местоположения пользователей вашего приложения, а также хранить информацию о местоположении пользователя, среди прочих возможностей вы также можете ассоциировать parsegeopoint с любым parseobject например, если ваше приложение связано с магазином с физическими филиалами, вы сможете создать активность, чтобы показать местоположение этих магазинов или показать пользователю, какой магазин ближе всего к нему другой пример использования этой ассоциации если ваше приложение — это игра, в которой вы создали parseobjects для представления персонажей, добавление parsegeopoints к этим персонажам позволит им отображаться вдоль пути игрока этот учебник объясняет, как использовать некоторые функции parsegeopoint через back4app после прохождения этого учебника вы сможете сделать следующее в любое время вы можете получить доступ к полному проекту android, созданному с помощью этого учебника, в нашем репозитории github https //github com/back4app/android geopoints tutorial предварительные требования чтобы завершить этот учебник, нам нужно android studio https //developer android com/studio/index html приложение для регистрации пользователей входа, созданное на back4app примечание следуйте учебнику по регистрации пользователей входу, чтобы узнать, как создать приложение для регистрации пользователей входа на back4app настоящее устройство с android 4 0 (ice cream sandwich) или новее примечание очень вероятно, что приложение, созданное с помощью этого учебника, не будет работать должным образом на виртуальном устройстве и даже может вызывать сбои, потому что оно может не получить текущее местоположение виртуального устройства поэтому мы настоятельно рекомендуем использовать настоящее устройство для его запуска 1 настройка ключа api google чтобы показать местоположение, которое вы сохранили в parsegeopoint, вам нужно отобразить карту для этого интересно использовать активность google maps чтобы создать активность google maps в android studio, выполните следующие действия перейдите в \<font color="#2166ae">файл\</font> > \<font color="#2166ae">новый\</font> > \<font color="#2166ae">google\</font> > \<font color="#2166ae">активность google maps\</font> затем автоматически будет создан файл \<font color="#2166ae">java\</font> , файл \<font color="#2166ae">layout\</font> и файл \<font color="#2166ae">values\</font> соответствующие созданной вами активности google maps перейдите в созданный \<font color="#2166ae"> values\</font> файл (вы можете сделать это, перейдя в \<font color="#2166ae">app\</font> > \<font color="#2166ae">res\</font> > \<font color="#2166ae">values\</font> > \<font color="#2166ae">google maps api xml\</font> ), как показано на изображении ниже этот файл даст вам некоторые инструкции о том, как получить ключ api google maps в основном, вам следует открыть ссылку, показанную на изображении 3\ после открытия вам нужно войти в свою учетную запись google, выбрать \<font color="#2166ae">создать проект\</font> и нажать на \<font color="#2166ae">продолжить\</font> при создании проекта google активирует ваш api 4\ после активации вашего api вы сможете получить ключ api, для этого нажмите на 5\ затем ваш ключ будет создан, и вы сможете скопировать его и вставить в файл \<font color="#2166ae">значения\</font> , который привел вас на эту страницу, в место, где написано \<font color="#2166ae">ваш ключ здесь\</font> 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\ в начале вашего \<font color="#2166ae">mapsactivity\</font> , импортируйте следующее 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 https //www back4app com/ , найдите ваше приложение и откройте его панель управления перейдите в \<font color="#2166ae">core\</font> > \<font color="#2166ae">browser\</font> > \<font color="#2166ae">user\</font> , как показано на изображении ниже 3\ теперь создайте новый столбец для сохранения местоположения пользователя для этого нажмите кнопку \<font color="#2166ae">редактировать\</font> в правом верхнем углу, как показано ниже 4\ затем нажмите на \<font color="#2166ae">добавить столбец\</font> 5\ в поле какой тип данных вы хотите сохранить?, выберите опцию geopoint 6\ в поле как мы это назовем?, введите “ местоположение ” 7\ итак, нажмите на добавить столбец, как показано на изображении ниже 8\ теперь ваше приложение может хранить данные о местоположении пользователей, и ваш класс пользователя в панели управления back4pp должен выглядеть так 3 сохраните текущее местоположение пользователей в вашей панели управления back4pp откройте ваш \<font color="#2166ae">mapsactivity \</font> и внутри публичного класса \<font color="#2166ae">mapsactivity \</font> определите int с именем \<font color="#2166ae">request location \</font> со значением 1 и \<font color="#2166ae">locationmanager\</font> , как в следующем коде 1 private static final int request location = 1; 2 locationmanager locationmanager; 2\ в методе \<font color="#2166ae">oncreate \</font> создайте \<font color="#2166ae">locationmanager\</font> , как в следующем коде 1 locationmanager = (locationmanager)getsystemservice(context location service); 3\ чтобы сохранить местоположение пользователя в вашей панели управления back4pp, просто реализуйте следующий метод и вызовите его в вашем \<font color="#2166ae">onmapready \</font> методе 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\ очень важно реализовать следующий метод, чтобы метод \<font color="#2166ae">savecurrentuserlocation \</font> работал 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 для этого реализуйте следующий метод в вашем \<font color="#2166ae">mapsactivity \</font> и вызовите его при необходимости 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 показ текущего местоположения пользователя на карте чтобы отобразить местоположение пользователя на карте, вам нужно будет получить местоположение пользователя, а затем создать маркер на карте, используя полученную информацию для этого реализуйте следующий метод в вашем \<font color="#2166ae">mapsactivity \</font> и вызовите его в методе \<font color="#2166ae">onmapready \</font> 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 и ограничить его с помощью \<font color="#2166ae">wherenear\</font> , указав, в каком столбце класса user на back4app вы выполняете запрос (в данном случае столбец “location”) и также указать ссылку parsegeopoint для запроса, с помощью которого будет найден ближайший пользователь (в данном случае parsegeopoint, связанный с текущим местоположением пользователя) следующий код делает это 1 parsequery\<parseuser> query = parseuser getquery(); 2 query wherenear("location", getcurrentuserlocation()); 2\ вы можете ограничить количество результатов этого запроса, добавив к нему ограничение \<font color="#2166ae">setlimit\</font> по умолчанию результаты ограничены 100 поскольку \<font color="#2166ae">wherenear \</font> ограничение заставит запрос извлечь массив пользователей, упорядоченных по расстоянию (от ближайшего к дальнему) от currentuserlocation, установив лимит близких пользователей для поиска на число 2, список результатов запроса будет содержать только двух пользователей текущего и ближайшего к нему пользователя следующий код устанавливает лимит результатов на 2 1 query setlimit(2); 3\ теперь, когда вы ограничили свой запрос, давайте извлечем его результаты для этого вы вызовете метод \<font color="#2166ae">findinbackground \</font> и передадите в качестве аргумента список пользователей, в котором будут храниться результаты запроса, а также 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\ если ошибок не возникает, у вас будет в \<font color="#2166ae">списке ближайшие пользователи \</font> два ближайших пользователя к текущему пользователю (фактический текущий пользователь и ближайший к нему пользователь), теперь вам нужно только найти, кто не является текущим пользователем для этого внутри \<font color="#2166ae"> if (e == null)\</font> блока используйте следующий код 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\ теперь, когда вы знаете, кто является ближайшим пользователем к текущему, вы можете измерить расстояние между ними, используя метод \<font color="#2166ae">distanceinkilometersto \</font> для этого используйте следующий код 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 "); метод \<font color="#2166ae">alertdisplayer\</font> используется выше, следующий 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 https //www back4app com/ , войдите в систему, найдите свое приложение и откройте его панель управления 2\ перейдите в \<font color="#2166ae">основное \</font> > \<font color="#2166ae">браузер \</font> > \<font color="#2166ae">создать класс\</font> , как показано на изображении ниже 3\ в поле какой тип \<font color="#2166ae">а класса вам нужен?\</font> , выберите опцию \<font color="#2166ae">пользовательский \</font> 4\ в поле \<font color="#2166ae">как мы это назовем?\</font> , введите “магазины” и затем нажмите на \<font color="#2166ae">создать класс\</font> кнопку 5\ затем будет показан новый класс под названием “магазины”, и вы должны вставить в него 2 колонки колонку с типом данных \<font color="#2166ae">строка \</font> под названием \<font color="#2166ae">имя\</font> , а также другую колонку с типом данных \<font color="#2166ae">geopoint \</font> под названием \<font color="#2166ae">местоположение\</font> если вы не помните, как создать колонку, вернитесь к шагу 2, там объясняется, как создать колонку в панели управления back4app ваш класс должен выглядеть так 6\ теперь заполните этот класс информацией для этого нажмите на \<font color="#2166ae">добавить строку\</font> кнопку в меню в правом верхнем углу или в середине страницы, как показано на изображении ниже 7\ затем заполните строку необходимой информацией названием магазина и его широтой и долготой после ввода некоторых данных ваш класс магазины должен выглядеть как на изображении ниже если вы хотите ввести больше данных, вы можете нажать на \<font color="#2166ae">добавить строку\</font> кнопку вверху или на \<font color="#2166ae">+\</font> кнопку под последней строкой данных теперь вы готовы использовать информацию о местоположении магазинов в вашем приложении 8 отобразите все местоположения магазинов на карте 1\ вы можете показать все магазины, которые вы добавили в свой класс, на \<font color="#2166ae">mapsactivity \</font> с помощью parsequery сначала вам нужно создать запрос parseobject, указав имя класса back4pp dashboard, который вы хотите запросить (в данном случае класс “stores”), и ограничить его с помощью \<font color="#2166ae">whereexists\</font> , указав столбец класса store на back4app, по которому вы выполняете запрос (в данном случае столбец “location”) следующий код делает это 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query whereexists("location"); 2\ теперь, когда вы ограничили свой запрос, давайте получим его результаты для этого вы вызовете метод \<font color="#2166ae">findinbackground\</font> и передадите в качестве аргумента список магазинов, в котором будут храниться результаты запроса, а также parseexception для обработки ошибок ограничение \<font color="#2166ae">whereexists \</font> позволит сохранить в списке магазинов только те 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\ если ошибок не произошло, вы получите в \<font color="#2166ae">stores \</font> списке все магазины с привязанным местоположением, теперь вам нужно просто сделать цикл, чтобы отобразить их на карте для этого внутри блока \<font color="#2166ae">if (e == null)\</font> используйте следующий код 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 шага выше, приведен ниже вызовите его в методе \<font color="#2166ae">onmapready \</font> , чтобы он заработал 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”), и ограничить его с помощью \<font color="#2166ae">wherenear\</font> , указав колонку класса store на back4app, по которой вы делаете запрос (в данном случае колонка “location”) следующий код делает это 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query wherenear("location", getcurrentuserlocation()); 2\ вы можете ограничить количество результатов этого запроса, добавив к нему ограничение \<font color="#2166ae">setlimit\</font> по умолчанию результаты ограничены 100 поскольку \<font color="#2166ae">wherenear \</font> ограничение заставит запрос извлекать массив пользователей, упорядоченных по расстоянию (от ближайшего к самому дальнему) от currentuserlocation, установив лимит близких пользователей для поиска на число 1, список результатов запроса будет содержать только один магазин ближайший к текущему пользователю следующий код устанавливает лимит результатов на 1 1 query setlimit(1); 3\ теперь, когда вы ограничили свой запрос, давайте получим его результаты для этого вы вызовете метод \<font color="#2166ae">findinbackground \</font> и передадите в качестве аргумента список объектов магазина, в котором будут храниться результаты запроса, а также 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\ если ошибок не произошло, у вас в \<font color="#2166ae">nearstores \</font> списке будет ближайший магазин к текущему пользователю, теперь вам только нужно отобразить его на \<font color="#2166ae">mapsactivity\</font> для этого внутри \<font color="#2166ae">if (e == null)\</font> блока используйте следующий код 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)); метод \<font color="#2166ae">alertdisplayer\</font> используется выше, такой же, как в шаге 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\ найдите ваше приложение и нажмите на \<font color="#2166ae">панель управления \</font> > \<font color="#2166ae">ядро \</font> > \<font color="#2166ae">браузер \</font> > \<font color="#2166ae">пользователь \</font> и создайте несколько пользователей с привязанными к ним местоположениями, чтобы метод \<font color="#2166ae">showclosestuser \</font> работал 3\ запустите ваше приложение на реальном устройстве и зарегистрируйте аккаунт попробуйте все функции! 4\ вернитесь на панель управления back4pp и проверьте, сохранено ли ваше местоположение в строке пользователя готово! на этом этапе вы можете использовать некоторые функции parsegeopoint через back4app!