Wer hat Zeit, mir code-snipsel zu erklären ?

  • 3 Antworten
  • Letztes Antwortdatum
B

Benreis61

Fortgeschrittenes Mitglied
32
Hallo,
Ich versuche, ein MapApp zu realisieren. Dabei übernehme ich auch Code Snipsel von verschiedenen Quellen.
Unten angegebene Funktion ist so eine. Die Funktion gibt
Log.e(TAG, "getCurrentPlaceLikelihoods:place not found: " aus.

Um den Fehler herauszufinden, muss ich die Funktion verstehen. Das tue ich aber leider zu ca 30%
Wer kann das mir erklären ?
zB Was macht
@SuppressWarnings("MissingPermission") final FindCurrentPlaceRequest request =
FindCurrentPlaceRequest.builder(placeFields).build();

Oder woher nimmt die Funktion die aktuelle Position ?

private void getCurrentPlaceLikelihoods() {
Log.d(TAG, "!!! getCurrentPlaceLikelihoods");
// Use fields to define the data types to return.
List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME, Place.Field.ADDRESS,
Place.Field.LAT_LNG);

// Get the likely places - that is, the businesses and other points of interest that
// are the best match for the device's current location.
@SuppressWarnings("MissingPermission") final FindCurrentPlaceRequest request =
FindCurrentPlaceRequest.builder(placeFields).build();

Task<FindCurrentPlaceResponse> placeResponse = mPlacesClient.findCurrentPlace(request);
placeResponse.addOnCompleteListener(this, task -> {
if (task.isSuccessful()) {
FindCurrentPlaceResponse response = task.getResult();
// Set the count, handling cases where less than 5 entries are returned.
int count;
if (response.getPlaceLikelihoods().size() < M_MAX_ENTRIES) {
count = response.getPlaceLikelihoods().size();
} else {
count = M_MAX_ENTRIES;
}

int i = 0;
mLikelyPlaceNames = new String[count];
mLikelyPlaceAddresses = new String[count];
mLikelyPlaceAttributions = new String[count];
mLikelyPlaceLatLngs = new LatLng[count];

for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
Place currPlace = placeLikelihood.getPlace();
mLikelyPlaceNames = currPlace.getName();
mLikelyPlaceAddresses = currPlace.getAddress();
mLikelyPlaceAttributions = (currPlace.getAttributions() == null) ?
null : TextUtils.join(" ", currPlace.getAttributions());
mLikelyPlaceLatLngs = currPlace.getLatLng();

String currLatLng = (mLikelyPlaceLatLngs == null) ?
"" : mLikelyPlaceLatLngs.toString();

Log.i(TAG, String.format("Place " + currPlace.getName()
+ " has likelihood: " + placeLikelihood.getLikelihood()
+ " at " + currLatLng));

i++;
if (i > (count - 1)) {
break;
}
}
// COMMENTED OUT UNTIL WE DEFINE THE METHOD
// Populate the ListView

fillPlacesList();
} else {
Exception exception = task.getException();
if (exception instanceof ApiException) {
ApiException apiException = (ApiException) exception;
Log.e(TAG, "getCurrentPlaceLikelihoods:place not found: "
+ apiException.getStatusCode());
}
}
});

}
 
Zuletzt bearbeitet:
@Benreis61

Deine gesamter Code entspricht leider nicht der neuen Google MAP API.
Diese solltest du eher verwenden, da im Juli die "alten" nicht mehr unterstützt werden.
Der Schnipsel ist daher deprecated.

Hier die Einführung für dich :
Maps SDK for Android – Kurzanleitung | Google Developers

Und hier der Aufbau auf die Schnelle

a) MAP Fragment im Layout erstellen (android:name="com.google.android.gms.maps.SupportMapFragment")
b) OnMapReadCallback in deine Klasse implementieren (ableiten)
c) in Override "onMapReady" reagieren , Map initialisieren und Listener setzen
d) Permission für Location anfordern und freigeben.
e) "Location" klasse zur Ermittlung deiner Position implementieren (Callback) und an Map übergeben.

Fertig

Bitte darauf achten, dass du einen beschränkten API-Key erstellst, sonst können schnell Kosten entstehen.

@SuppressWarnings("MissingPermission")
Es muss in dem Falle eine Genehmigung des Nutzers zur Einholung der Location vorliegen.
Vorher gibt es auch keine Daten.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Benreis61
swa00 schrieb:
Bitte darauf achten, dass du einen beschränkten API-Key erstellst, sonst können schnell Kosten entstehen.
Danke für den Hinweis. Das hatte ich vergessen.

swa00 schrieb:
Es muss in dem Falle eine Genehmigung des Nutzers zur Einholung der Location vorliegen.
Vorher gibt es auch keine Daten.
Dies habe ich so implementiert

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}

Trotzdem habe ich den selben Fehler

Vorher hole ich die Location mit dieser Funktion

private void getDeviceLocation() {

Log.d(TAG, "!!! getDeviceLocation:entry");

latLng = mDefaultLocation;

try {
if (mLocationPermissionGranted) {
Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
locationResult.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@override
public void onSuccess(Location location) {
if (location != null) {
latLng = new LatLng(location.getLatitude(), location.getLongitude());
} else {
Log.d(TAG, "getDeviceLocation:location null");
}

Log.d(TAG, "getDeviceLocation:Latitude:" + latLng.latitude);
Log.d(TAG, "getDeviceLocation:Longitude:" + latLng.longitude);

moveCamera(latLng);
}
});
}
} catch (Exception e) {
Log.e("getDeviceLocation:%s", e.getMessage());
}
}

Nun wie kommt getCurrentPlaceLikelihoods an diese Location dran ?
Denn die muss ja anhand dieser Location die likelyplaces bestimmen ?
Und wo baut die likelyplaces zusammen ?

Hier ?

@SuppressWarnings("MissingPermission") final FindCurrentPlaceRequest request =
FindCurrentPlaceRequest.builder(placeFields).build();

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Task<FindCurrentPlaceResponse> placeResponse = mPlacesClient.findCurrentPlace(request);
placeResponse.addOnCompleteListener(this, task -> {
if (task.isSuccessful()) {
...
...
oder hier ?

for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
Place currPlace = placeLikelihood.getPlace();
...
...
 
Hiermit prüfst du nur ob du die Permission hast mehr nicht.
Wenn du sie nicht hast erfragst du sie aber nicht.

Code:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}

mit "requestPermissions(... " würdest du erst den User danach fragen und die antwort vom user kommt in
"onRequestPermissionsResult" an.

du hast also gar nicht gefragt.

schaue hier wie das geht.
The Android permissions model - Tutorial

Permissions on Android | Android Developers
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Benreis61 und swa00

Ähnliche Themen

Soljim
Antworten
8
Aufrufe
483
Soljim
Soljim
SpeedySix
Antworten
13
Aufrufe
1.546
jogimuc
J
6
Antworten
13
Aufrufe
177
swa00
swa00
Zurück
Oben Unten