Get current location name of user without using gps or internet but by using Network_Provider in android

前端 未结 6 627
南方客
南方客 2020-12-31 08:50

This question is directly related to the same prevailing stackoverflow question at \"Android: get current location of user without using gps or internet\" where the accepted

6条回答
  •  温柔的废话
    2020-12-31 09:18

    According to android docs using LocationManager is not the current recomended API (see reference):

    The Google Play services location APIs are preferred over the 
    Android framework location APIs (android.location) as a way of
    adding location awareness to your app.
    

    To learn how to set up the Google Services client library, see Setup in the Google Play services guide.

    Once you have linked Google Services client library to your app you can achieve user location using FusedLocationProviderApi:

        import android.location.Location;
        import android.os.Bundle;
        import android.support.v7.app.ActionBarActivity;
        import android.util.Log;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.widget.Toast;
    
        import com.google.android.gms.common.ConnectionResult;
        import com.google.android.gms.common.api.GoogleApiClient;
        import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
        import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
        import com.google.android.gms.common.api.PendingResult;
        import com.google.android.gms.common.api.ResultCallback;
        import com.google.android.gms.common.api.Status;
        import com.google.android.gms.location.FusedLocationProviderApi;
        import com.google.android.gms.location.LocationListener;
        import com.google.android.gms.location.LocationRequest;
        import com.google.android.gms.location.LocationServices;
    
        public class MainActivity extends ActionBarActivity
                implements ConnectionCallbacks, OnConnectionFailedListener {
    
            // ..
    
            private GoogleApiClient mGoogleAPIClient;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
    
                // create google api client object
                mGoogleAPIClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
            }
    
            @Override
            protected void onStart() {
                super.onStart();
    
                mGoogleAPIClient.connect();
            }
    
            @Override
            protected void onStop() {
                super.onStop();
    
                mGoogleAPIClient.disconnect();
            }
    
            @Override
            public void onConnectionFailed(ConnectionResult connectionResult) {
                Toast.makeText(this,
                    "Could not connect to Google Play Services",
                    Toast.LENGTH_SHORT).show();
    
                finish();
            }
    
            @Override
            public void onConnected(Bundle bundle) {
                Log.i(TAG,
                    "Successfuly connect to Google Play Services");
    
                // retrieve last location once connected
                Location lastLocation = LocationServices.FusedLocationApi
                    .getLastLocation(mGoogleAPIClient);
    
                if (lastLocation == null) {
                    // should request new one
                    // location should be enabled
                    Log.i(TAG,
                        "No location data previously acquired.. should request!");
    
                    Toast.makeText(this,
                        "Requesting location data ..",
                        Toast.LENGTH_SHORT).show();
    
                    LocationRequest locationRequest = LocationRequest.create();
                    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                    locationRequest.setInterval(5000);
    
                    PendingResult result = LocationServices.FusedLocationApi
                        .requestLocationUpdates(mGoogleAPIClient,
                            locationRequest,
                            new LocationListener() {
    
                        @Override
                        public void onLocationChanged(Location location) {
                            makeUseOfNewLocation(location);
                        }
                    });
    
                    // TODO: use result to retrieve more info
    
                } else {
                    makeUseOfNewLocation(lastLocation);
                }
            }
    
            @Override
            public void onConnectionSuspended(int i) {
            }
    
            private void makeUseOfNewLocation(Location location) {
                 // do your stuff here
            }
    

    I have tested the code above and it works without internet connection but it requires that user enable location feature on device. Also it requires that the user have already enabled Location History feature into location feature.

    Hope that this helps you.

提交回复
热议问题