मैं मानचित्र आधारित ऐप पर काम कर रहा हूं, और अब तक एप्लिकेशन को लाइवडेटा ऑब्जेक्ट के रूप में रूम डेटाबेस से मार्करों का डेटा प्राप्त होता है और मानचित्र पर मार्कर खींचता है और डिवाइस के स्थान को FusedLocationProviderClient के माध्यम से प्राप्त करता है।
अब मैंने एक ऐसी विधि बनाने की कोशिश की है जो डेटाबेस में एक कॉलम को 0 से 1 तक अपडेट करेगी यदि डिवाइस मार्कर तक पहुंचता है, मार्कर को "सक्रिय" बनाता है और फिर मार्कर का नाम टोस्ट के रूप में प्रदर्शित करता है यदि उस मार्कर का "सक्रिय" कॉलम बराबर होता है 1 करने के लिए
अब तक मैंने SphericalUtil.computeDistanceBetween(LatLng1, LatLng2) < distance
का उपयोग करने की कोशिश की है और यदि शर्त पूरी हो जाती है, तो यह कॉलम को अपडेट करने के लिए एक विधि कहता है, लेकिन मैं इसे काम करने में कामयाब नहीं हुआ, क्योंकि उपकरणों का स्थान बदलता रहता है और मार्कर आते हैं लाइवडाटा सूची ऑब्जेक्ट से जो दोनों परिवर्तनों के लिए चेक किए गए हैं और मुझे नहीं पता कि इन्हें कंप्यूटडिस्टेंस के बीच विधि में कैसे उपयोग किया जाए। मैंने मार्करों और अन्य मानचित्र आधारित वस्तुओं से संबंधित दस्तावेजों को देखा है लेकिन अभी तक मुझे कोई समाधान नहीं मिला है।
यहां वह तरीका है जो मानचित्र पर मार्करों को पुनः प्राप्त करता है और आकर्षित करता है।
markerViewModel.getAllMarkers().observe(this, new Observer<List<MarkerObject>>() {
@Override
public void onChanged(List<MarkerObject> markerObjects) {
for (MarkerObject markerObject : markerObjects) {
LatLng latLng = new LatLng(markerObject.getLatitude(), markerObject.getLongitude());
mMap.addMarker(new MarkerOptions()
.title(markerObject.getTitle())
.position(latLng)
.visible(true));
}
}
});
वे विधियाँ जो मानचित्र पर उपकरण का स्थान प्राप्त करती हैं और आकर्षित करती हैं।
/**
* Updates the map's UI settings based on whether the user has granted location permission.
*/
private void updateLocationUI() {
if (mMap == null) {
return;
}
getLocationPermission();
try {
if (locationPermissionGranted) {
mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(true);
} else {
mMap.setMyLocationEnabled(false);
mMap.getUiSettings().setMyLocationButtonEnabled(false);
lastKnownLocation = null;
}
} catch (SecurityException e) {
Log.e("Exception: %s", e.getMessage());
}
}
/**
* Gets the current location of the device, and positions the map's camera.
*/
public void getDeviceLocation() {
/*
* Get the best and most recent location of the device, which may be null in rare
* cases when a location is not available.
*/
try {
if (locationPermissionGranted) {
Task<Location> locationResult = fusedLocationProviderClient.getLastLocation();
locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if (task.isSuccessful()) {
// Set the map's camera position to the current location of the device.
lastKnownLocation = task.getResult();
if (lastKnownLocation != null) {
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(lastKnownLocation.getLatitude(),
lastKnownLocation.getLongitude()), DEFAULT_ZOOM));
}
} else {
Log.d(TAG, "Current location is null. Using defaults.");
Log.e(TAG, "Exception: %s", task.getException());
mMap.moveCamera(CameraUpdateFactory
.newLatLngZoom(defaultLocation, DEFAULT_ZOOM));
mMap.getUiSettings().setMyLocationButtonEnabled(false);
}
}
});
}
} catch (SecurityException e) {
Log.e("Exception: %s", e.getMessage(), e);
}
}
मैंने कई परीक्षणों के माध्यम से काफी समय तक समाधान तक पहुंचने की कोशिश की है, लेकिन कोई सफलता नहीं है, मुझे उम्मीद है कि कोई मदद कर सकता है क्योंकि मैं विचारों से बाहर हूं। किसी भी मदद की सराहना की जाती है। इसके अलावा मैं किसी भी मामले में मदद नहीं मांगता लेकिन इसके साथ मैं वास्तव में संघर्ष कर रहा हूं, इसलिए सचमुच कोई दस्तावेज या जानकारी का टुकड़ा जो मदद करेगा वह बहुत अच्छा होगा।
1 उत्तर
यह कुछ ऐसा है जिसे मैंने पहले स्थान वस्तुओं के बीच की दूरी की जांच करने के लिए उपयोग किया है, आप इसका उपयोग कर सकते हैं या इसे अपनी आवश्यकताओं के अनुसार संशोधित कर सकते हैं, कोड बहुत सीधे आगे है।
public final boolean isLocationCloseEnough(Location currentLocation, Location markerLocation, double distance) {
// this is where the method stores the distance between the two locations
float[] distanceInMeters = new float[1];
Location.distanceBetween(currentLocation.getLatitude(), currentLocation.getLongitude(), markerLocation.getLatitude(), markerLocation.getLongitude(), distanceInMeters);
return (double)distanceInMeters[0] < distance;
}
स्थान अपडेट का अनुरोध करने में सक्षम होने के लिए आपको एक स्थान की आवश्यकता है ऐसा अनुरोध करें और स्थान अपडेट का अनुरोध करें
LocationRequest locationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY).setInterval(5);
LocationCallback callback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
// here is the location
Location lastLocation = locationResult.getLastLocation();
// do what needs to be done
}
};
public void sample() {
FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(context);
client.requestLocationUpdates(locationRequest, callback, Looper.getMainLooper());
}
अंत में जब आपकी गतिविधि या खंड रुक जाता है तो इस तरह के अपडेट को हटाना / रोकना सुनिश्चित करें
client.removeLocationUpdates(callback)
आप यहां LocarionRequest के बारे में अधिक जानकारी प्राप्त कर सकते हैं, और इसके कॉन्फ़िगरेशन के साथ खेल सकते हैं, https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।