Android
Data objects
Implementación de Parse GeoPoints en aplicaciones Android
34 min
uso de parse geopoints en tu aplicación de android introducción parse te permite asociar coordenadas de latitud y longitud del mundo real con un objeto al agregar un parsegeopoint a un parseuser , podrás averiguar fácilmente qué usuario está más cerca de otro, mostrar las ubicaciones de los usuarios de tu aplicación y también almacenar la información de ubicación del usuario, entre otras posibilidades también puedes asociar un parsegeopoint a cualquier parseobject por ejemplo, si tu aplicación está asociada con una tienda con afiliados físicos, podrás crear una actividad para mostrar la ubicación de esas tiendas o para mostrar al usuario qué tienda está más cerca de él otro ejemplo de este uso de asociación si tu aplicación es un juego en el que creaste parseobjects para representar personajes, agregar parsegeopoints a estos personajes permitiría que se mostraran a lo largo del camino del jugador este tutorial explica cómo usar algunas características de parsegeopoint a través de back4app después de seguir este tutorial, podrás hacer esto en cualquier momento, puedes acceder al proyecto completo de android construido con este tutorial en nuestro repositorio de github requisitos previos para completar este tutorial, necesitamos android studio una aplicación de registro de usuario inicio de sesión creada en back4app nota sigue el tutorial de registro de usuario inicio de sesión para aprender cómo crear una aplicación de registro de usuario inicio de sesión en back4app un dispositivo real que ejecute android 4 0 (ice cream sandwich) o más reciente nota es muy probable que la aplicación construida con este tutorial no funcione como se espera en un dispositivo virtual y puede incluso fallar porque podría no recuperar la ubicación actual del dispositivo virtual por lo tanto, recomendamos encarecidamente que uses un dispositivo real para ejecutarlo 1 configurar la clave de api de google para mostrar la ubicación que almacenaste en un parsegeopoint, necesitarás mostrar un mapa para hacer eso, es interesante usar una actividad de google maps para crear una actividad de google maps en android studio, haz lo siguiente ve a archivo archivo > nuevo nuevo > google google > actividad de google maps actividad de google maps luego, automáticamente, se creará un archivo java archivo java , un archivo de diseño archivo de diseño y un archivo de valores archivo de valores correspondiente a la actividad de google maps que has creado ve al archivo de valores valores creado (puedes hacer esto accediendo a app app > res res > valores valores > google maps api xml google maps api xml ), como se muestra en la imagen a continuación este archivo te dará algunas instrucciones sobre cómo obtener una clave de api de google maps básicamente, deberías abrir el enlace que se muestra en la imagen 3\ después de abrirlo, debes iniciar sesión en tu cuenta de google, seleccionar la crear un proyecto crear un proyecto opción y hacer clic en continuar continuar al crear el proyecto, google habilitará tu api 4\ después de que tu api esté habilitada, podrás obtener una clave api, para hacerlo haz clic en 5\ luego, tu clave será creada y podrás copiarla y pegarla en el valores valores archivo que te llevó a esta página, en el lugar donde dice tu clave aquí tu clave aquí 6\ es importante tener los permisos de uso a continuación en tu archivo androidmanifest xml si creaste la actividad de google maps siguiendo las instrucciones anteriores, entonces uno de estos permisos ya debería estar en tu manifiesto, de todos modos, necesitarás ambos para que tu aplicación funcione correctamente, así que verifica si están en tu archivo androidmanifest xml, de lo contrario, insértalos 1 \<uses permission android\ name="android permission access coarse location" /> 2 \<uses permission android\ name="android permission access fine location" /> 7\ al comienzo de tu mapsactivity mapsactivity , importa lo siguiente 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 configura el panel de control de back4app para guardar la ubicación del usuario ve a el sitio web de back4app inicia sesión, encuentra tu aplicación y abre su panel de control ve a core core > browser browser > user user , como se muestra en la imagen a continuación 3\ ahora, crea una nueva columna para guardar la ubicación del usuario para hacerlo, haz clic en el editar editar botón en la parte superior derecha, como se muestra a continuación 4\ luego, haz clic en agregar una columna agregar una columna 5\ en el campo ¿qué tipo de datos deseas almacenar?, elige la opción geopoint 6\ en el campo ¿cómo deberíamos llamarlo?, escribe “ ubicación ” 7\ entonces, haz clic en agregar columna, como se muestra en la imagen a continuación 8\ ahora, tu aplicación es capaz de almacenar datos de ubicación de los usuarios y tu clase de usuario en tu panel de control de back4pp debería verse así 3 guarda la ubicación actual de los usuarios en tu panel de control de back4pp abre tu mapsactivity mapsactivity y dentro de la clase pública mapsactivity mapsactivity define un int llamado request location request location con valor 1 y un locationmanager locationmanager , como en el siguiente código 1 private static final int request location = 1; 2 locationmanager locationmanager; 2\ en el oncreate oncreate método crea el locationmanager locationmanager , como en el siguiente código 1 locationmanager = (locationmanager)getsystemservice(context location service); 3\ para guardar la ubicación del usuario en tu panel de control de back4pp, simplemente implementa el siguiente método y llámalo en tu onmapready onmapready método 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\ es realmente importante implementar el siguiente método para que el savecurrentuserlocation savecurrentuserlocation método funcione 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 recuperar la ubicación del usuario para recuperar la ubicación del usuario, necesitarás encontrar quién es el usuario actual, guardar su ubicación y luego devolver la ubicación guardada en tu panel de control de back4app para hacer eso, implementa el siguiente método en tu mapsactivity mapsactivity y llámalo cuando sea necesario 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 mostrando la ubicación actual del usuario en el mapa para mostrar la ubicación del usuario en el mapa, necesitarás recuperar la ubicación del usuario y luego crear un marcador en el mapa usando la información recuperada para hacer eso, implementa el siguiente método en tu mapsactivity mapsactivity y llámalo en el onmapready onmapready método 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 encontrando el usuario más cercano al actual ahora que tienes un montón de usuarios con coordenadas espaciales asociadas, sería bueno averiguar qué usuario está más cerca de otro esto se puede hacer utilizando un parsequery primero, necesitarás crear una consulta de parseuser y restringirla con wherenear wherenear , informando en qué columna de la clase user en back4app estás haciendo la consulta (en este caso la columna “location”) y también informar el parsegeopoint de referencia para la consulta desde la cual se encontrará el usuario más cercano (en este caso el parsegeopoint asociado a la ubicación actual del usuario) el siguiente código hace eso 1 parsequery\<parseuser> query = parseuser getquery(); 2 query wherenear("location", getcurrentuserlocation()); 2\ puedes limitar el número de resultados de esta consulta añadiendo la restricción setlimit setlimit por defecto, los resultados están limitados a 100 como la wherenear wherenear la restricción hará que la consulta recupere un array de usuarios ordenados por distancia (del más cercano al más lejano) desde currentuserlocation, estableciendo el límite de usuarios cercanos a encontrar en el número 2, la lista de resultados de la consulta solo tendrá dos usuarios el actual y el usuario más cercano a él el siguiente código establece el límite de resultados en 2 1 query setlimit(2); 3\ ahora que has restringido tu consulta, vamos a recuperar sus resultados para hacer eso, llamarás a un findinbackground findinbackground método y pasarás como argumento una lista de usuarios, en la que se almacenarán los resultados de la consulta y también un parseexception para manejar errores para evitar errores, no olvides limpiar los resultados en caché después de que se ejecute la consulta el siguiente código hace eso 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\ si no ocurre ningún error, tendrás en la lista de usuarios cercanos lista de usuarios cercanos los dos usuarios más cercanos al usuario actual (el usuario actual y el usuario más cercano a él), ahora solo tendrás que encontrar quién no es el usuario actual para hacer eso, dentro del if (e == null) if (e == null) bloque usa el siguiente código 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\ ahora que sabes quién es el usuario más cercano al actual, puedes medir la distancia entre ellos usando el distanceinkilometersto distanceinkilometersto método para hacer eso, usa el siguiente código 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 "); el alertdisplayer alertdisplayer método utilizado arriba es el siguiente 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\ también puedes mostrar ambos usuarios en el mapa, utilizando el siguiente código 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)); el método completo que ejecuta los 6 pasos anteriores es el siguiente 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 configurar back4app para asociar parsegeopoint a parseobjects suponga que la aplicación de ejemplo que está construyendo está asociada con un grupo de tiendas con afiliados físicos sería interesante mostrar todos los afiliados físicos de esta tienda en el mapa para hacerlo, cree una clase de tiendas en el dashboard de back4pp, guarde las tiendas existentes como parseobjects, sus ubicaciones y después la aplicación podrá consultar los afiliados físicos y mostrar sus posiciones en el mapa los siguientes pasos le ayudarán con eso 1 vaya a el sitio web de back4app , inicie sesión, encuentre su aplicación y abra su dashboard 2\ vaya a núcleo núcleo > navegador navegador > crear una clase crear una clase , como se muestra en la imagen a continuación 3\ en el campo ¿qué tip o de clase necesita? o de clase necesita? , elija la opción personalizada opción personalizada 4\ en el campo ¿cómo deberíamos llamarlo? ¿cómo deberíamos llamarlo? , escribe “stores” y luego haz clic en crear clase crear clase botón 5\ luego se mostrará una nueva clase llamada “stores” y deberías insertar 2 columnas en ella una columna con tipo de dato string string llamada nombre nombre , así como otra columna con tipo de dato geopoint geopoint llamada ubicación ubicación si no recuerdas cómo crear una columna, vuelve al paso 2, allí se explica cómo crear una columna en el panel de control de back4app tu clase debería terminar así 6\ ahora, llena esta clase con información para hacerlo, haz clic en el agregar una fila agregar una fila botón en el menú en la parte superior derecha o en el medio de la página, como se muestra en la imagen a continuación 7\ luego llena la fila con la información requerida el nombre de la tienda y su latitud y longitud después de insertar algunos datos, tu clase de tiendas debería verse como la imagen a continuación si deseas insertar más datos, puedes hacer clic en el agregar una fila agregar una fila botón en la parte superior, o en el + + botón debajo de la última fila de datos ahora estás listo para usar la información de ubicación de las tiendas en tu aplicación 8 mostrar la ubicación de todas las tiendas en el mapa 1\ puedes mostrar todas las tiendas que agregaste a tu clase en el mapsactivity mapsactivity utilizando un parsequery primero, necesitarás crear una consulta de parseobject, informando el nombre de la clase del back4pp dashboard que deseas consultar (en este caso la clase “stores”), y restringirla con whereexists whereexists , informando la columna de la clase store en back4app que estás consultando (en este caso la columna “location”) el siguiente código hace eso 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query whereexists("location"); 2\ ahora que restringiste tu consulta, vamos a recuperar sus resultados para hacer eso, llamarás a un findinbackground findinbackground método y pasarás como argumento una lista de tiendas, en la que se almacenarán los resultados de la consulta y también una parseexception para manejar errores la whereexists whereexists restricción hará que solo los parseobjects de la clase que tengan un parsegeopoint asociado a ellos indicando su ubicación se almacenen en la lista de tiendas para evitar errores, no olvides limpiar los resultados en caché después de que se ejecute la consulta el siguiente código hace eso 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\ si no ocurre ningún error, tendrás en la stores stores lista todas las tiendas con ubicación asociada, ahora solo tendrás que hacer un bucle para mostrarlas en el mapa para hacerlo, dentro del if (e == null) if (e == null) bloque usa el siguiente código 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 } el método completo que ejecuta los 3 pasos anteriores está abajo llámalo en el onmapready onmapready método para que funcione 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 mostrar el usuario más cercano a una tienda 1\ ahora que tienes un montón de tiendas con coordenadas espaciales asociadas, sería bueno averiguar qué tienda está más cerca de un usuario esto se puede hacer utilizando un parsequery primero, necesitarás crear una consulta de parseobject, informando el nombre de la clase del dashboard de back4pp que deseas consultar (en este caso la clase “stores”), y restringirla con wherenear wherenear , informando la columna de la clase store en back4app que estás consultando (en este caso la columna “location”) el siguiente código hace eso 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query wherenear("location", getcurrentuserlocation()); 2\ puedes limitar el número de resultados de esta consulta añadiendo a ella la restricción setlimit setlimit por defecto, los resultados están limitados a 100 como la wherenear wherenear restricción hará que la consulta recupere un array de usuarios ordenados por distancia (del más cercano al más lejano) desde currentuserlocation, estableciendo el límite de usuarios cercanos a encontrar en el número 1, la lista de resultados de la consulta solo tendrá una tienda la más cercana al usuario actual el siguiente código establece el límite de resultados a 1 1 query setlimit(1); 3\ ahora que has restringido tu consulta, recuperemos sus resultados para hacer eso, llamarás a un findinbackground findinbackground método y pasarás como argumento una lista de objetos de tienda, en la que se almacenarán los resultados de la consulta y también una parseexception para manejar errores para evitar errores, no olvides limpiar los resultados en caché después de que la consulta encuentre algún resultado el siguiente código hace eso 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\ si no ocurre ningún error, tendrás en la nearstores nearstores lista la tienda más cercana al usuario actual, ahora solo tendrás que mostrarla en el mapsactivity mapsactivity para hacer eso, dentro del if (e == null) if (e == null) bloque usa el siguiente código 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)); the alertdisplayer alertdisplayer method used above, is the same of the step 6 (finding the closest user to the current one) the complete method that executes all 4 steps above is the following 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 prueba tu aplicación 1\ inicia sesión en sitio web de back4app https //www back4app com/ 2\ encuentra tu aplicación y haz clic en tablero tablero > núcleo núcleo > navegador navegador > usuario usuario y crea algunos usuarios con ubicación asociada a ellos para permitir que el método showclosestuser showclosestuser funcione 3\ ejecuta tu aplicación en un dispositivo real y regístrate en una cuenta ¡prueba cada función! 4\ regresa al tablero de back4pp y verifica si tu ubicación está almacenada en la fila de tu usuario ¡está hecho! ¡en esta etapa, puedes usar algunas funciones de parsegeopoint a través de back4app!