How can I cat latitude and longitude of Android device?

五迷三道 提交于 2021-02-11 17:42:28

问题


So I'm making this app which finds restaurants near you, fetching information from a food-delivery app, using JSoup library. The only problem with it is that sometimes the latitude and the longitude are getting null value. Situations in which my application is working: -turning on GPS and the waiting at least 1-2 minutes; -opening google maps, closing it, and then returning to the application;

So the main problem: I can't fetch the location right after I enable it and hit the 'Find restaurants' button, I need to wait 1-2 minutes after enabling location, then it's working.

    private TextView result;
    private FusedLocationProviderClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        requestPermission();
        client = LocationServices.getFusedLocationProviderClient(this);

       getBtn = findViewById(R.id.getRestaurants);
       result = findViewById(R.id.restaurantsList);

       getBtn.setOnClickListener(this);
    }



    private void requestPermission(){
        ActivityCompat.requestPermissions(this, new String[]{ACCESS_FINE_LOCATION}, 1 );
    }


public void onClick(View v) {
        if (ActivityCompat.checkSelfPermission(MainActivity.this, ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
                return;
        }

        client.getLastLocation().addOnSuccessListener(MainActivity.this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                result.setText("Getting location...");
                if(location != null){
                double latitude = getLat(location);
                double longitude = getLng(location);

                    result.setText("Finding restaurants near you...");
                getWebsite(latitude, longitude);
                }else{
                    result.setText("Couldn't fetch location!");
                }

            }
            });

回答1:


you must use requestLocationUpdates() you are using getLastLocation() and when the GPS is off and turned on after the last known location becomes null so you must call requestLocationUpdates() you can find more information in the below link

https://developer.android.com/training/location/receive-location-updates




回答2:


Here is a good way to implement the FusedLocationProvider in Kotlin (you might adapt to Java or use Java and Kotlin side by side) :

private fun startLoc() {
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
        try {
            fusedLocationClient.lastLocation
                .addOnSuccessListener { location: Location? ->
                    //showDialog(this@MapsActivity, TAG, "last know loc = ${location?.latitude} + ${location?.longitude}")
                    if (location != null){
                        lastKnowLoc = LatLng(location.latitude, location.longitude)
                        addMarkerToLocation(lastKnowLoc)
                    }
                }
            val locationRequest = LocationRequest()
            locationRequest.interval = 10000
            locationRequest.fastestInterval = 10000
            locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY

            locationCallback = object : LocationCallback() {
                override fun onLocationResult(locationResult: LocationResult?) {
                    locationResult ?: return
                    for (location in locationResult.locations){
                        //showDialog(this@MapsActivity, "locationResult", "location=${location.latitude};${location.longitude}")
                        addMarkerToLocation(LatLng(location.latitude, location.longitude))
                        val speed = location.speed
                        updateCamera(location.bearing)
                    }
                }
            }

            fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)

            btnStartLoc.isEnabled = false
            btnStopLoc.isEnabled = true
        }catch (e:SecurityException){}

    }



回答3:


create a class GPSTracker

public class GPSTracker extends Service implements LocationListener {

private final Context mContext;

// flag for GPS status
boolean isGPSEnabled = false;

// flag for network status
boolean isNetworkEnabled = false;

boolean canGetLocation = false;

Location location; // location
double latitude=0.0; // latitude
double longitude=0.0; // longitude

// The minimum distance to change Updates in meters
//private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0;
// The minimum time between updates in milliseconds
//private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
private static final long MIN_TIME_BW_UPDATES = 0;

// Declaring a Location Manager
protected LocationManager locationManager;

public GPSTracker(Context context) {
    this.mContext = context;
    getLocation();
}
public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            // First get location from Network Provider
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
            //    Log.d("Network", "Network");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {

                if(latitude==0 || longitude==0)
                {

                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    //Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }

            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}
/**
 * Function to get latitude
 * */
public double getLatitude(){
    if(location != null){
        latitude = location.getLatitude();
    }

    // return latitude
    return latitude;
}

/**
 * Function to get longitude
 * */
public double getLongitude(){
    if(location != null){
        longitude = location.getLongitude();
    }

    // return longitude
    return longitude;
}
public boolean canGetLocation() {
    return this.canGetLocation;
}

/**
 * Function to show settings alert dialog
 * */
public void showSettingsAlert(){
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

    // Setting Dialog Title
    alertDialog.setTitle("GPS is settings");

    // Setting Dialog Message
    alertDialog.setMessage("GPS is not enabled. Please go to settings menu and Switch it on");

    // Setting Icon to Dialog
    //alertDialog.setIcon(R.drawable.delete);

    // On pressing Settings button
    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
        }
    });

    // on pressing cancel button
    //not required comment by kp on 19-03-2017
 /*   alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
        }
    });
  */
    // Showing Alert Message
    alertDialog.show();
}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

    latitude = location.getLatitude();
    longitude = location.getLongitude();

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}


}

Where ever you want to fetch the lat, long values...there use implements LocationListener and below code

        locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);    
        // Creating an empty criteria object
        Criteria criteria = new Criteria();
        // Getting the name of the provider that meets the criteria
        provider = locationManager.getBestProvider(criteria, false);
        if(provider!=null && !provider.equals("")){
        // Get the location from the given provider 
         Location location = locationManager.getLastKnownLocation(provider);
         locationManager.requestLocationUpdates(provider, 20000, 1,BillingManual.this );

         if(location!=null){
            onLocationChanged(location);}

            }else{
                //Toast.makeText(getBaseContext(), "No Provider Found", Toast.LENGTH_SHORT).show();
        }
        GPSTracker gps = new GPSTracker(this);

        // check if GPS enabled     
        if(gps.canGetLocation()){

            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();
            latitude_1 = latitude;
            longitude_1 =longitude;
            // \n is for new line
           // Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();    
        }else{
            // can't get location
            // GPS or Network is not enabled
            // Ask user to enable GPS/network in settings
            gps.showSettingsAlert();
        }

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    try{
        latitude_1=location.getLatitude();
        longitude_1=location.getLongitude() ;
        }catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
        }
}


来源:https://stackoverflow.com/questions/59401709/how-can-i-cat-latitude-and-longitude-of-android-device

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!