Parse GeoPoints Android: Integração Completa em Aplicativos
34 min
usando parse geopoints no seu aplicativo android introdução parse permite que você associe coordenadas de latitude e longitude do mundo real a um objeto adicionando um parsegeopoint a um parseuser , você poderá descobrir facilmente qual usuário está mais próximo de outro, mostrar as localizações dos usuários do seu aplicativo e também armazenar as informações de localização do usuário, entre outras possibilidades você também pode associar um parsegeopoint a qualquer parseobject por exemplo, se seu aplicativo estiver associado a uma loja com afiliados físicos, você poderá criar uma atividade para mostrar a localização dessas lojas ou para mostrar ao usuário qual loja está mais próxima dele outro exemplo de uso dessa associação se seu aplicativo for um jogo no qual você criou parseobjects para representar personagens, adicionar parsegeopoints a esses personagens permitiria que eles fossem mostrados ao longo do caminho do jogador este tutorial explica como usar alguns recursos do parsegeopoint através do back4app após seguir este tutorial, você será capaz de fazer isso a qualquer momento, você pode acessar o projeto android completo construído com este tutorial em nosso repositório do github https //github com/back4app/android geopoints tutorial pré requisitos para completar este tutorial, precisamos android studio https //developer android com/studio/index html um aplicativo de registro de usuário login criado no back4app nota siga o tutorial de registro de usuário login para aprender como criar um aplicativo de registro de usuário login no back4app um dispositivo real rodando android 4 0 (ice cream sandwich) ou mais recente nota é muito provável que o aplicativo construído com este tutorial não funcione como esperado em um dispositivo virtual e pode até travar porque pode não recuperar a localização atual do dispositivo virtual portanto, recomendamos fortemente que você use um dispositivo real para executá lo 1 configurar a chave da api do google para mostrar a localização que você armazenou em um parsegeopoint, você precisará exibir um mapa para fazer isso, é interessante usar uma atividade do google maps para criar uma atividade do google maps no android studio, faça o seguinte vá para arquivo arquivo > novo novo > google google > atividade do google maps atividade do google maps então, automaticamente, será criado um arquivo arquivo layout layout e um arquivo arquivo valores valores correspondentes à atividade do google maps que você criou vá para o arquivo de valores valores criado (você pode fazer isso acessando app app > res res > valores valores > google maps api xml google maps api xml ), como mostrado na imagem abaixo este arquivo fornecerá algumas instruções sobre como obter uma chave da api do google maps basicamente, você deve abrir o link mostrado na imagem 3\ após abri lo, você deve fazer login na sua conta do google, selecionar o criar um projeto criar um projeto opção e clicar em continuar continuar ao criar o projeto, o google habilitará sua api 4\ após sua api ser habilitada, você poderá obter uma chave de api, para isso clique em 5\ então, sua chave será criada e você pode copiá la e colá la no valores valores arquivo que o levou a esta página, no lugar onde está escrito sua chave aqui sua chave aqui 6\ é importante ter as permissões de uso abaixo no seu arquivo androidmanifest xml se você criou a atividade do google maps seguindo as instruções acima, então uma dessas permissões já deve estar no seu manifesto, de qualquer forma, você precisará de ambas para que seu aplicativo funcione corretamente, então verifique se elas estão no seu arquivo androidmanifest xml, caso contrário, insira as 1 \<uses permission android\ name="android permission access coarse location" /> 2 \<uses permission android\ name="android permission access fine location" /> 7\ no início do seu mapsactivity mapsactivity , importe o seguinte 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 configure o painel do back4app para salvar a localização do usuário vá para o site back4app https //www back4app com/ faça login, encontre seu aplicativo e abra seu painel vá para core core > browser browser > user user , conforme mostrado na imagem abaixo 3\ agora, crie uma nova coluna para salvar a localização do usuário para fazer isso, clique no botão editar editar no canto superior direito, conforme mostrado abaixo 4\ então, clique em adicionar uma coluna adicionar uma coluna 5\ no campo que tipo de dados você deseja armazenar?, escolha a opção geopoint 6\ no campo como devemos chamá lo?, digite “ localização ” 7\ então, clique em adicionar coluna, conforme mostrado na imagem abaixo 8\ agora, seu aplicativo é capaz de armazenar dados de localização dos usuários e sua classe de usuário no seu painel do back4pp deve parecer com isso 3 salve a localização atual dos usuários no seu painel do back4pp abra seu mapsactivity mapsactivity e dentro da classe pública mapsactivity mapsactivity defina um int chamado request location request location com valor 1 e um locationmanager locationmanager , como no seguinte código 1 private static final int request location = 1; 2 locationmanager locationmanager; 2\ no método oncreate oncreate crie o locationmanager locationmanager , como no seguinte código 1 locationmanager = (locationmanager)getsystemservice(context location service); 3\ para salvar a localização do usuário no seu painel do back4pp, simplesmente implemente o seguinte método e chame o em seu 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\ é realmente importante implementar o seguinte método para que o 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 a localização do usuário para recuperar a localização do usuário, você precisará descobrir quem é o usuário atual, salvar sua localização e então retornar a localização salva no seu painel do back4app para fazer isso, implemente o seguinte método em sua mapsactivity mapsactivity e chame o quando necessário 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 a localização atual do usuário no mapa para exibir a localização do usuário no mapa, você precisará recuperar a localização do usuário e, em seguida, criar um marcador no mapa usando as informações recuperadas para fazer isso, implemente o seguinte método em seu mapsactivity mapsactivity e chame o no 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 o usuário mais próximo do atual agora que você tem um monte de usuários com coordenadas espaciais associadas, seria bom descobrir qual usuário está mais próximo de outro isso pode ser feito usando um parsequery primeiro, você precisará criar uma consulta parseuser e restringi la com wherenear wherenear , informando em qual coluna da classe user no back4app você está fazendo a consulta (neste caso, a coluna “location”) e também informando o parsegeopoint de referência para a consulta a partir do qual será encontrado o usuário mais próximo (neste caso, o parsegeopoint associado à localização atual do usuário) o seguinte código faz isso 1 parsequery\<parseuser> query = parseuser getquery(); 2 query wherenear("location", getcurrentuserlocation()); 2\ você pode limitar o número de resultados desta consulta adicionando a restrição setlimit setlimit por padrão, os resultados são limitados a 100 como a wherenear wherenear a restrição fará com que a consulta recupere um array de usuários ordenados por distância (do mais próximo ao mais distante) da currentuserlocation, definindo o limite de usuários próximos a encontrar para o número 2, a lista de resultados da consulta terá apenas dois usuários o atual e o usuário mais próximo dele o seguinte código define o limite de resultados para 2 1 query setlimit(2); 3\ agora que você restringiu sua consulta, vamos recuperar seus resultados para fazer isso, você chamará um findinbackground findinbackground método e passará como argumento uma lista de usuários, na qual serão armazenados os resultados da consulta e também um parseexception para tratar erros para evitar erros, não se esqueça de limpar os resultados em cache após a execução da consulta o seguinte código faz isso 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\ se nenhum erro ocorrer, você terá na lista de usuários próximos lista de usuários próximos os dois usuários mais próximos do usuário atual (o usuário atual e o usuário mais próximo dele), agora você só precisa encontrar quem não é o usuário atual para fazer isso, dentro do if (e == null) if (e == null) bloco, use o seguinte 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\ agora que você sabe quem é o usuário mais próximo do atual, você pode medir a distância entre eles usando o distanceinkilometersto distanceinkilometersto método para fazer isso, use o seguinte 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 "); o alertdisplayer alertdisplayer método usado acima é o seguinte 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\ você também pode mostrar ambos os usuários no mapa, usando o seguinte 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)); o método completo que executa todos os 6 passos acima é o seguinte 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 configure o back4app para associar parsegeopoint a parseobjects suponha que o aplicativo de exemplo que você está construindo esteja associado a um grupo de lojas com afiliados físicos seria interessante mostrar todos os afiliados físicos desta loja no mapa para fazer isso, crie uma classe de lojas no back4pp dashboard, salve as lojas existentes como parseobjects, suas localizações e, após isso, o aplicativo poderá consultar os afiliados físicos e exibir suas posições no mapa os seguintes passos ajudarão você com isso 1 vá para o site do back4app https //www back4app com/ , faça login, encontre seu aplicativo e abra seu dashboard 2\ vá para core core > browser browser > criar uma classe criar uma classe , como mostrado na imagem abaixo 3\ no campo que tipo de classe você precisa? de classe você precisa? , escolha a opção personalizada opção personalizada 4\ no campo como devemos chamá lo? como devemos chamá lo? , digite “stores” e então clique no criar classe criar classe botão 5\ então uma nova classe chamada “stores” será exibida e você deve inserir 2 colunas nela uma coluna com tipo de dado string string chamada nome nome , assim como outra coluna com tipo de dado geopoint geopoint chamada localização localização se você não se lembrar de como criar uma coluna, volte ao passo 2, lá está explicado como criar uma coluna no painel do back4app sua classe deve ficar assim 6\ agora, preencha esta classe com informações para fazer isso, clique no adicionar uma linha adicionar uma linha botão no menu no canto superior direito ou no meio da página, conforme mostrado na imagem abaixo 7\ em seguida, preencha a linha com as informações necessárias o nome da loja e sua latitude e longitude após inserir alguns dados, sua classe de lojas deve parecer com a imagem abaixo se você quiser inserir mais dados, pode clicar no adicionar uma linha adicionar uma linha botão na parte superior, ou no + + botão abaixo da última linha de dados agora você está pronto para usar as informações de localização das lojas em seu aplicativo 8 exibir todas as localizações das lojas no mapa 1\ você pode mostrar todas as lojas que adicionou à sua classe no mapsactivity mapsactivity usando um parsequery primeiro, você precisará criar uma consulta parseobject, informando o nome da classe do back4pp dashboard que deseja consultar (neste caso, a classe “stores”), e restringi la com whereexists whereexists , informando a coluna da classe store no back4app que você está consultando (neste caso, a coluna “location”) o seguinte código faz isso 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query whereexists("location"); 2\ agora que você restringiu sua consulta, vamos recuperar seus resultados para fazer isso, você chamará um findinbackground findinbackground método e passará como argumento uma lista de lojas, na qual serão armazenados os resultados da consulta e também um parseexception para tratar erros a whereexists whereexists restrição fará com que apenas os parseobjects da classe que têm um parsegeopoint associado a eles indicando sua localização sejam armazenados na lista de lojas para evitar erros, não se esqueça de limpar os resultados em cache após a execução da consulta o seguinte código faz isso 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\ se nenhum erro ocorrer, você terá na lista de lojas lista de lojas todas as lojas com localização associada, agora você só precisará fazer um loop para exibi las no mapa para fazer isso, dentro do if (e == null) if (e == null) bloco, use o seguinte 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 } o método completo que executa todos os 3 passos acima está abaixo chame o no 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 o usuário mais próximo de uma loja 1\ agora que você tem um monte de lojas com coordenadas espaciais associadas, seria bom descobrir qual loja está mais próxima de um usuário isso pode ser feito usando um parsequery primeiro, você precisará criar uma consulta parseobject, informando o nome da classe do back4pp dashboard que deseja consultar (neste caso, a classe “stores”), e restringi la com wherenear wherenear , informando a coluna da classe store no back4app que você está consultando (neste caso, a coluna “location”) o seguinte código faz isso 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query wherenear("location", getcurrentuserlocation()); 2\ você pode limitar o número de resultados dessa consulta adicionando a ela a restrição setlimit setlimit por padrão, os resultados são limitados a 100 como a wherenear wherenear restrição fará com que a consulta recupere um array de usuários ordenados por distância (do mais próximo ao mais distante) da currentuserlocation, definindo o limite de usuários próximos a encontrar para o número 1, a lista de resultados da consulta terá apenas uma loja a mais próxima do usuário atual o seguinte código define o limite de resultados para 1 1 query setlimit(1); 3\ agora que você restringiu sua consulta, vamos recuperar seus resultados para fazer isso, você chamará um findinbackground findinbackground método e passará como argumento uma lista de objetos de loja, na qual serão armazenados os resultados da consulta e também uma parseexception para tratar erros para evitar erros, não se esqueça de limpar os resultados em cache após a consulta encontrar algum resultado o código a seguir faz isso 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\ se nenhum erro ocorrer, você terá na nearstores nearstores lista a loja mais próxima do usuário atual, agora você só precisará exibi la na mapsactivity mapsactivity para fazer isso, dentro do if (e == null) if (e == null) bloco, use o seguinte 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)); o alertdisplayer alertdisplayer método usado acima é o mesmo do passo 6 (encontrando o usuário mais próximo do atual) o método completo que executa todos os 4 passos acima é o seguinte 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 teste seu aplicativo 1\ faça login em back4app website https //www back4app com/ 2\ encontre seu aplicativo e clique em painel painel > núcleo núcleo > navegador navegador > usuário usuário e crie alguns usuários com localização associada a eles para permitir que o método showclosestuser showclosestuser funcione 3\ execute seu aplicativo em um dispositivo real e crie uma conta experimente todos os recursos! 4\ volte ao painel do back4pp e verifique se sua localização está armazenada na linha do seu usuário está feito! neste estágio, você pode usar alguns recursos do parsegeopoint através do back4app!