Android
Data objects
Implementierung von Parse GeoPoints in Android-Apps
34 min
verwendung von parse geopoints in ihrer android app einführung parse ermöglicht es ihnen, reale breiten und längengradkoordinaten mit einem objekt zu verknüpfen wenn sie einen parsegeopoint zu einem parseuser , können sie leicht herausfinden, welcher benutzer einem anderen am nächsten ist, die standorte der benutzer ihrer app anzeigen und auch die standortinformationen des benutzers speichern, unter anderem sie können auch einen parsegeopoint mit jedem parseobject wenn ihre app beispielsweise mit einem geschäft mit physischen filialen verbunden ist, können sie eine aktivität erstellen, um den standort dieser geschäfte anzuzeigen oder dem benutzer zu zeigen, welches geschäft ihm am nächsten ist ein weiteres beispiel für die verwendung dieser assoziation wenn ihre app ein spiel ist, in dem sie parseobjects erstellt haben, um charaktere darzustellen, würde das hinzufügen von parsegeopoints zu diesen charakteren es ermöglichen, sie entlang des weges des spielers anzuzeigen dieses tutorial erklärt, wie man einige funktionen von parsegeopoint über back4app verwendet nachdem sie dieses tutorial befolgt haben, werden sie in der lage sein, dies zu tun zu jeder zeit können sie das vollständige android projekt, das mit diesem tutorial erstellt wurde, in unserem github repository aufrufen voraussetzungen um dieses tutorial abzuschließen, benötigen wir android studio eine benutzerregistrierungs login app, die auf back4app erstellt wurde hinweis befolgen sie das tutorial zur benutzerregistrierung login, um zu lernen, wie sie eine benutzerregistrierungs login app auf back4app erstellen ein echtes gerät mit android 4 0 (ice cream sandwich) oder neuer hinweis es ist sehr wahrscheinlich, dass die mit diesem tutorial erstellte app nicht wie erwartet auf einem virtuellen gerät funktioniert und sogar abstürzen kann, da sie möglicherweise den aktuellen standort des virtuellen geräts nicht abrufen kann daher empfehlen wir dringend, ein echtes gerät zu verwenden, um es auszuführen 1 google api schlüssel einrichten um den standort anzuzeigen, den sie in einem parsegeopoint gespeichert haben, müssen sie eine karte anzeigen dazu ist es interessant, eine google maps aktivität zu verwenden um eine google maps aktivität in android studio zu erstellen, gehen sie wie folgt vor gehen sie zu datei datei > neu neu > google google > google maps aktivität google maps aktivität dann wird automatisch eine java java datei, eine layout layout datei und eine values values datei erstellt, die der google maps aktivität entspricht, die sie erstellt haben gehen sie zur erstellten values values datei (sie können dies tun, indem sie auf app app > res res > values values > google maps api xml google maps api xml ), wie im bild unten gezeigt diese datei gibt ihnen einige anweisungen, wie sie einen google maps api schlüssel erhalten grundsätzlich sollten sie den im bild gezeigten link öffnen 3\ nachdem sie es geöffnet haben, sollten sie sich in ihr google konto einloggen, die ein projekt erstellen ein projekt erstellen option auswählen und auf fortfahren fortfahren während sie das projekt erstellen, wird google ihre api aktivieren 4\ nachdem ihre api aktiviert ist, können sie einen api schlüssel erhalten klicken sie dazu auf 5\ dann wird ihr schlüssel erstellt und sie können ihn kopieren und in die werte werte datei einfügen, die sie zu dieser seite geführt hat, an der stelle, wo steht ihren schlüssel hier ihren schlüssel hier 6\ es ist wichtig, die unten stehende berechtigung in ihrer androidmanifest xml datei zu haben wenn sie die google maps aktivität gemäß den obigen anweisungen erstellt haben, sollte eine dieser berechtigungen bereits in ihrem manifest vorhanden sein sie benötigen jedoch beide für ihre app, damit sie ordnungsgemäß funktioniert überprüfen sie also, ob sie in ihrer androidmanifest xml datei vorhanden sind, andernfalls fügen sie sie hinzu 1 \<uses permission android\ name="android permission access coarse location" /> 2 \<uses permission android\ name="android permission access fine location" /> 7\ zu beginn ihrer mapsactivity mapsactivity , importieren sie folgendes 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 richten sie das back4app dashboard ein, um den standort des benutzers zu speichern gehe zu back4app website anmeldung, finde deine app und öffne das dashboard gehe zu core core > browser browser > benutzer benutzer , wie im bild unten gezeigt 3\ jetzt erstelle eine neue spalte, um den standort des benutzers zu speichern klicke dazu auf die bearbeiten bearbeiten schaltfläche oben rechts, wie unten gezeigt 4\ klicken sie dann auf spalte hinzufügen spalte hinzufügen 5\ wählen sie im feld welchen datentyp möchten sie speichern? die option geopoint 6\ geben sie im feld wie sollen wir es nennen? „ standort “ ein 7\ klicken sie also auf spalte hinzufügen, wie im bild unten gezeigt 8\ jetzt kann ihre app die standortdaten der benutzer speichern, und ihre benutzerklasse in ihrem back4pp dashboard sollte so aussehen 3 speichern sie den aktuellen standort der benutzer in ihrem back4pp dashboard öffnen sie ihre mapsactivity mapsactivity und definieren sie innerhalb der öffentlichen klasse mapsactivity mapsactivity eine int variable namens request location request location mit dem wert 1 und einem locationmanager locationmanager , wie im folgenden code 1 private static final int request location = 1; 2 locationmanager locationmanager; 2\ im oncreate oncreate methoden erstellen sie den locationmanager locationmanager , wie im folgenden code 1 locationmanager = (locationmanager)getsystemservice(context location service); 3\ um den standort des benutzers in ihrem back4pp dashboard zu speichern, implementieren sie einfach die folgende methode und rufen sie sie in ihrer onmapready onmapready methode auf 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 ist wirklich wichtig, die folgende methode zu implementieren, damit die savecurrentuserlocation savecurrentuserlocation methode funktioniert 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 den standort des benutzers abrufen um den standort des benutzers abzurufen, müssen sie herausfinden, wer der aktuelle benutzer ist, seinen standort speichern und dann den im back4app dashboard gespeicherten standort zurückgeben um dies zu tun, implementieren sie die folgende methode in ihrer mapsactivity mapsactivity und rufen sie sie bei bedarf auf 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 anzeige des aktuellen standorts des benutzers auf der karte um den standort des benutzers auf der karte anzuzeigen, müssen sie den standort des benutzers abrufen und dann einen marker auf der karte mit den abgerufenen informationen erstellen um dies zu tun, implementieren sie die folgende methode in ihrer mapsactivity mapsactivity und rufen sie sie in der onmapready onmapready methode auf 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 finden des nächsten benutzers zum aktuellen jetzt, da sie eine reihe von benutzern mit räumlichen koordinaten haben, wäre es gut herauszufinden, welcher benutzer einem anderen am nächsten ist dies kann durch die verwendung einer parsequery erfolgen zuerst müssen sie eine parseuser abfrage erstellen und sie mit wherenear wherenear , einschränken, indem sie angeben, in welcher spalte der benutzerklasse auf back4app sie die abfrage durchführen (in diesem fall die spalte „location“) und auch den referenz parsegeopoint für die abfrage angeben, von dem aus der nächste benutzer gefunden wird (in diesem fall der parsegeopoint, der mit dem aktuellen standort des benutzers verknüpft ist) der folgende code tut dies 1 parsequery\<parseuser> query = parseuser getquery(); 2 query wherenear("location", getcurrentuserlocation()); 2\ sie können die anzahl der ergebnisse dieser abfrage einschränken, indem sie die einschränkung hinzufügen setlimit setlimit standardmäßig sind die ergebnisse auf 100 begrenzt da die wherenear wherenear einschränkung die abfrage anweist, ein array von benutzern nach entfernung (nächster zu weitest entfernt) von currentuserlocation abzurufen, wird die begrenzung der nahen benutzer auf die zahl 2 gesetzt, sodass die ergebnisliste der abfrage nur zwei benutzer enthält den aktuellen und den nächsten benutzer von ihm der folgende code setzt die begrenzung der ergebnisse auf 2 1 query setlimit(2); 3\ jetzt, da sie ihre abfrage eingeschränkt haben, lassen sie uns die ergebnisse abrufen um dies zu tun, rufen sie eine findinbackground findinbackground methode auf und übergeben als argument eine liste von benutzern, in der die ergebnisse der abfrage gespeichert werden, sowie eine parseexception zur fehlerbehandlung um fehler zu vermeiden, vergessen sie nicht, die zwischengespeicherten ergebnisse nach der ausführung der abfrage zu löschen der folgende code macht das 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\ wenn kein fehler auftritt, haben sie in der nahebenutzer nahebenutzer liste die zwei nächsten benutzer zum aktuellen benutzer (den tatsächlichen aktuellen benutzer und den nächsten benutzer von ihm), jetzt müssen sie nur noch herausfinden, wer nicht der aktuelle benutzer ist um das zu tun, verwenden sie im if (e == null) if (e == null) block den folgenden code 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\ jetzt, da sie wissen, wer der nächste benutzer zum aktuellen ist, können sie die entfernung zwischen ihnen mit der distanceinkilometersto distanceinkilometersto methode messen um das zu tun, verwenden sie den folgenden code 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 "); die alertdisplayer alertdisplayer methode, die oben verwendet wird, ist die folgende 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\ sie können auch beide benutzer auf der karte anzeigen, indem sie den folgenden code verwenden 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)); die vollständige methode, die alle 6 oben genannten schritte ausführt, ist die folgende 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 einrichten, um parsegeopoint mit parseobjects zu verknüpfen angenommen, die beispiel app, die sie erstellen, ist mit einer gruppe von geschäften mit physischen filialen verbunden es wäre interessant, alle physischen filialen dieses geschäfts auf der karte anzuzeigen um dies zu tun, erstellen sie eine stores klasse im back4pp dashboard, speichern sie die vorhandenen geschäfte als parseobjects, deren standorte, und danach wird die app in der lage sein, die physischen filialen abzufragen und deren positionen auf der karte anzuzeigen die folgenden schritte helfen ihnen dabei 1\ gehen sie zu back4app website , melden sie sich an, finden sie ihre app und öffnen sie deren dashboard 2\ gehen sie zu kern kern > browser browser > eine klasse erstellen eine klasse erstellen , wie im bild unten gezeigt 3\ im feld was für ein e art von klasse benötigen sie? e art von klasse benötigen sie? , wählen sie die benutzerdefinierte benutzerdefinierte option 4\ im feld wie sollen wir es nennen? wie sollen wir es nennen? , geben sie „stores“ ein und klicken sie dann auf klasse erstellen klasse erstellen schaltfläche 5\ dann wird eine neue klasse namens „stores“ angezeigt und sie sollten 2 spalten hinzufügen eine spalte mit dem datentyp string string mit dem namen name name , sowie eine weitere spalte mit dem datentyp geopoint geopoint mit dem namen standort standort wenn sie sich nicht erinnern, wie man eine spalte erstellt, gehen sie zurück zu schritt 2, dort wird erklärt, wie man eine spalte im back4app dashboard erstellt ihre klasse sollte so aussehen 6\ füllen sie jetzt diese klasse mit informationen klicken sie dazu auf den eine zeile hinzufügen eine zeile hinzufügen button im menü oben rechts oder in der mitte der seite, wie im bild unten gezeigt 7\ füllen sie dann die zeile mit den erforderlichen informationen aus den namen des geschäfts sowie dessen breiten und längengrad nachdem sie einige daten eingegeben haben, sollte ihre stores klasse wie im bild unten aussehen wenn sie weitere daten eingeben möchten, können sie auf den eine zeile hinzufügen eine zeile hinzufügen button oben oder auf den + + button unter der letzten datenzeile klicken jetzt sind sie bereit, die standortinformationen der geschäfte in ihrer app zu verwenden 8 alle geschäfte auf der karte anzeigen 1\ sie können alle geschäfte, die sie ihrer klasse hinzugefügt haben, auf der mapsactivity mapsactivity anzeigen, indem sie eine parsequery verwenden zuerst müssen sie eine parseobject abfrage erstellen, die den namen der back4pp dashboard klasse angibt, die sie abfragen möchten (in diesem fall die klasse „stores“), und sie mit whereexists whereexists , wobei sie die spalte der store klasse auf back4app angeben, die sie abfragen (in diesem fall die spalte „location“) der folgende code macht das 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query whereexists("location"); 2\ jetzt, da sie ihre abfrage eingeschränkt haben, lassen sie uns die ergebnisse abrufen um dies zu tun, rufen sie eine findinbackground findinbackground methode auf und übergeben als argument eine liste von geschäften, in der die ergebnisse der abfrage gespeichert werden, sowie eine parseexception zur fehlerbehandlung die whereexists whereexists einschränkung sorgt dafür, dass nur die parseobjects der klasse, die einen zugeordneten parsegeopoint haben, der ihren standort angibt, in der liste der geschäfte gespeichert werden um fehler zu vermeiden, vergessen sie nicht, die zwischengespeicherten ergebnisse nach der abfrage zu löschen der folgende code macht das 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\ wenn kein fehler auftritt, haben sie in der stores stores liste alle geschäfte mit zugeordnetem standort, jetzt müssen sie nur noch eine schleife erstellen, um sie auf der karte anzuzeigen dazu verwenden sie im if (e == null) if (e == null) block den folgenden code 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 } die vollständige methode, die alle 3 oben genannten schritte ausführt, ist unten rufen sie sie in der onmapready onmapready methode auf, damit sie funktioniert 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 nächster benutzer zu einem geschäft anzeigen 1\ jetzt, da sie eine reihe von geschäften mit räumlichen koordinaten haben, wäre es gut herauszufinden, welches geschäft dem benutzer am nächsten ist dies kann durch die verwendung einer parsequery erfolgen zuerst müssen sie eine parseobject abfrage erstellen, in der sie den namen der back4pp dashboard klasse angeben, die sie abfragen möchten (in diesem fall die klasse „stores“), und sie mit wherenear wherenear , wobei sie die spalte der store klasse auf back4app angeben, die sie abfragen (in diesem fall die spalte „location“) der folgende code macht das 1 parsequery\<parseobject> query = parsequery getquery("stores"); 2 query wherenear("location", getcurrentuserlocation()); 2\ sie können die anzahl der ergebnisse dieser abfrage einschränken, indem sie die einschränkung setlimit setlimit standardmäßig sind die ergebnisse auf 100 begrenzt da die wherenear wherenear einschränkung die abfrage anweist, ein array von benutzern nach entfernung (nächster zu weitesten) von currentuserlocation abzurufen, wird die begrenzung der nahen benutzer auf die zahl 1 gesetzt, sodass die ergebnisliste der abfrage nur ein geschäft enthält das nächste zum aktuellen benutzer der folgende code setzt die ergebnisgrenze auf 1 1 query setlimit(1); 3\ jetzt, da sie ihre abfrage eingeschränkt haben, lassen sie uns die ergebnisse abrufen um dies zu tun, rufen sie eine findinbackground findinbackground methode auf und übergeben sie als argument eine liste von store objekten, in denen die ergebnisse der abfrage gespeichert werden, sowie eine parseexception zur fehlerbehandlung um fehler zu vermeiden, vergessen sie nicht, die zwischengespeicherten ergebnisse zu löschen, nachdem die abfrage ein ergebnis gefunden hat der folgende code macht das 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\ wenn kein fehler auftritt, haben sie in der nearstores nearstores liste den nächstgelegenen store zum aktuellen benutzer, jetzt müssen sie ihn nur noch in der mapsactivity mapsactivity um das zu tun, verwenden sie im if (e == null) if (e == null) block den folgenden code 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)); die alertdisplayer alertdisplayer methode, die oben verwendet wird, ist die gleiche wie in schritt 6 (den nächsten benutzer zum aktuellen finden) die vollständige methode, die alle 4 oben genannten schritte ausführt, ist die folgende 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 testen sie ihre app 1\ melden sie sich an bei back4app website https //www back4app com/ 2\ finden sie ihre app und klicken sie auf dashboard dashboard > core core > browser browser > benutzer benutzer und erstellen sie einige benutzer mit einem standort, der mit ihnen verbunden ist, um die methode showclosestuser showclosestuser funktionsfähig zu machen 3\ führen sie ihre app auf einem echten gerät aus und registrieren sie ein konto probieren sie jede funktion aus! 4\ gehen sie zurück zum back4pp dashboard und überprüfen sie, ob ihr standort in ihrer benutzerzeile gespeichert ist es ist erledigt! in diesem stadium können sie einige funktionen von parsegeopoint über back4app nutzen!