В чем разница между этими двумя способами определения местоположения пользователей?

Насколько я понимаю, это способ получить местоположение пользователей и отобразить синий кружок на карте Google.

/**
 * Enables the My Location layer if the fine location permission has been granted.
 */
private void enableMyLocation() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        // Permission to access the location is missing.
        PermissionUtils.requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE,
                Manifest.permission.ACCESS_FINE_LOCATION, true);
    } else if (mMap != null) {
        // Access to the location has been granted to the app.
        mMap.setMyLocationEnabled(true);
    }
}

Что означает строка mMap.setMyLocationEnabled (true); на самом деле делать? Могу ли я получить значения широты и долготы пользователей с помощью этого метода.

Есть еще один метод, который, кажется, тоже работает. Он использует провайдер слитого местоположения.

public class LocationProvider implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {

    public interface LocationCallback {
        void handleNewLocation(Location location);
    }

    public static final String TAG = LocationProvider.class.getSimpleName();

    /*
     * Define a request code to send to Google Play services
     * This code is returned in Activity.onActivityResult
     */
    private static final int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
    private static final int LOCATION_INTERVAL = 5000;
    private static final int LOCATION_FAST_INTERVAL = 1000;

    private LocationCallback mLocationCallback;
    private Context mContext;
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;

    public LocationProvider(Context context) {
        mGoogleApiClient = new GoogleApiClient.Builder(context)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        // Create the LocationRequest object
        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(LOCATION_INTERVAL)        // 5 seconds, in milliseconds
                .setFastestInterval(LOCATION_FAST_INTERVAL); // 1 second, in milliseconds
        if (context instanceof LocationCallback) mLocationCallback = (LocationCallback) context;
        mContext = context;
    }

    public void connect() {
            mGoogleApiClient.connect();
    }

    public void disconnect() {
        if (mGoogleApiClient.isConnected()) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
            mGoogleApiClient.disconnect();
        }
    }

    @Override
    public void onConnected(Bundle bundle) {
        Log.i(TAG, "Location services connected.");

        if (ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }

        Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (location == null) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
        else {
            mLocationCallback.handleNewLocation(location);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        /*
         * Google Play services can resolve some errors it detects.
         * If the error has a resolution, try sending an Intent to
         * start a Google Play services activity that can resolve
         * error.
         */
        if (connectionResult.hasResolution() && mContext instanceof Activity) {
            try {
                Activity activity = (Activity) mContext;
                // Start an Activity that tries to resolve the error
                connectionResult.startResolutionForResult(activity, CONNECTION_FAILURE_RESOLUTION_REQUEST);
            /*
             * Thrown if Google Play services canceled the original
             * PendingIntent
             */
            } catch (IntentSender.SendIntentException e) {
                // Log the error
                e.printStackTrace();
            }
        } else {
            /*
             * If no resolution is available, display a dialog to the
             * user with the error.
             */
            Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode());
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        mLocationCallback.handleNewLocation(location);
    }
}

Действия с моими картами переопределяют метод handleNewLocation(Location location) и отображают на карте Google маркер для местоположения пользователя.

Какой метод является лучшим и что на самом деле делает первый метод. Нужно ли использовать оба?


person Tom Finet    schedule 27.08.2016    source источник


Ответы (1)


Оба метода использовать НЕ нужно; они избыточны.

Я предполагаю, что вы прочитали setMyLocationEnabled () docs, поэтому вам может быть интересно, является ли это лучшим / самым прямым способом узнать местоположение устройства. Это не так, в том смысле, что для этого требуется наличие MapView. Что делать, если вы не хотите показывать своему пользователю MapView? GoogleMap запускает несколько фоновых потоков / подключений к Интернету (для кеширования фрагментов карты и т. Д.), И это большая дополнительная работа, которую нужно сделать, если вы просто хотите получить координаты этого маленького синего кружка. Что вы могли бы сделать, кстати, используя устаревший setOnMyLocationChangeListener () аналогично вашему второму примеру.

setMyLocationEnabled() сообщает GoogleMap о необходимости негласно установить поставщика местоположения. Это в основном ваш второй пример; способ получить постоянный поток локаций - в данном случае из Fused Location API. Затем вы передаете эту информацию маркеру в GoogleMap, что, конечно, почти то же самое, что вы сделали в примере 1, вызвав setMyLocationEnabled().

Если вы просто хотите знать свои координаты GPS, я считаю, что GPS_PROVIDER гораздо более прямолинейный:

LocationManager lm = (LocationManager) getSystemService( Context.LOCATION_SERVICE );
lm.requestLocationUpdates( LocationManager.GPS_PROVIDER, 100, 0.0f, this, null );

Таким образом, вам не нужно сообщать Google, где вы находитесь, просто чтобы они могли сказать вам, где вы находитесь ...

person greeble31    schedule 29.08.2016