मैं मानचित्र आधारित ऐप पर काम कर रहा हूं, और अब तक एप्लिकेशन को लाइवडेटा ऑब्जेक्ट के रूप में रूम डेटाबेस से मार्करों का डेटा प्राप्त होता है और मानचित्र पर मार्कर खींचता है और डिवाइस के स्थान को 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);
        }
    }
    

मैंने कई परीक्षणों के माध्यम से काफी समय तक समाधान तक पहुंचने की कोशिश की है, लेकिन कोई सफलता नहीं है, मुझे उम्मीद है कि कोई मदद कर सकता है क्योंकि मैं विचारों से बाहर हूं। किसी भी मदद की सराहना की जाती है। इसके अलावा मैं किसी भी मामले में मदद नहीं मांगता लेकिन इसके साथ मैं वास्तव में संघर्ष कर रहा हूं, इसलिए सचमुच कोई दस्तावेज या जानकारी का टुकड़ा जो मदद करेगा वह बहुत अच्छा होगा।

0
Edward Aarma 12 फरवरी 2021, 03:17

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

1
Mohammed Abdul Bari 12 फरवरी 2021, 07:55
विधि के लिए धन्यवाद, लेकिन मेरी समस्या यह है कि अगर यह बदलता है तो मैं वर्तमान स्थान कैसे प्राप्त करूं। अगर मैं getDeviceLocation से वर्तमान स्थान लौटाता हूं, तो यह एक पल में स्थान है, लेकिन वर्तमान स्थान में परिवर्तन होने पर मैं लगातार स्थिति की जांच कैसे करूं?
 – 
Edward Aarma
12 फरवरी 2021, 07:37
1
मैंने स्थान अपडेट दिखाने के लिए अपना उत्तर संपादित किया
 – 
Mohammed Abdul Bari
12 फरवरी 2021, 07:56