Отслеживание текущего местоположения на Картах Google

#java #android #google-maps

#java #Android #google-карты

Вопрос:

Я попытался создать приложение, в котором есть действие с картой, которое, как только оно открывается, карта начинается с текущего местоположения пользователя. Я пытался использовать руководства и онлайн-справку, но, похоже, все эти руководства устарели, потому что по умолчанию в активности maps у них есть методы onResume и OnStart, а вместо этого у меня есть метод onMapReady и ни один из этих методов. это код, который я пытался написать, но он не работает (сбой приложения),

 package com.imt.civilwatch;
import android.content.pm.PackageManager;
import android.location.Location;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import com.google.android.gms.common.ConnectionResu<
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import java.text.StringCharacterIterator;
public class MapActivity extends FragmentActivity implements         OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private GoogleMap mMap;
protected GoogleApiClient mGoogleApiClient;
Location mLastLocation;
private double mLatitudeText;
private double mLongitudeText;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}
protected void onStart() {
    mGoogleApiClient.connect();
    super.onStart();
}
protected void onStop() {
    mGoogleApiClient.disconnect();
    super.onStop();
}
@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(32, 35);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    //mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
@Override
public void onConnected(Bundle connectionHint) {
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, 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;
    }
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
    if (mLastLocation != null) {
        mLatitudeText = (Double.valueOf(mLastLocation.getLatitude()));
        mLongitudeText = (Double.valueOf(mLastLocation.getLongitude()));
        LatLng last = new LatLng( mLatitudeText,mLongitudeText);
        mMap.moveCamera(CameraUpdateFactory.newLatLng(last));
    }
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
 

}

Комментарии:

1. Если у вас сбой приложения, пожалуйста, укажите logcat в своих вопросах

Ответ №1:

Из документации Google Maps Android API данные о местоположении, доступные для устройства Android, включают в себя текущее местоположение устройства, определенное с помощью комбинации технологий — направление и способ перемещения, а также то, пересекло ли устройство предопределенную географическую границу или геозону.

В зависимости от потребностей вашего приложения вы можете выбрать один из этих вариантов:


Для получения дополнительной информации ознакомьтесь с этим руководством о том, как получить текущее местоположение:

Комментарии:

1. спасибо вам, ребята, за обратную связь, вы действительно помогли. руководство, на которое вы ссылались, было действительно полезным, и благодаря этому мой код наконец-то заработал!

Ответ №2:

Метод onMapReady запускается, когда фрагмент карты готов и отображает карту.

Метод OnConnected запускается, когда устройство успешно подключается к службе определения местоположения Google Play и (если доступно) получает ваше последнее известное местоположение.

Если вы не хотите, чтобы камера перемещалась в ваше текущее местоположение, удалите что между этим условием:

 if(mLastLocation != null){...}
 

Для карт камера — это то, что видно на экране. Метод mMap.moveCamera(…) указывает карте центрировать изображение на определенном расстоянии.

Если ваша карта будет готова до того, как ваш телефон подключится к Google Play Location API, текущее местоположение будет отображаться следующим образом:

 if (mLastLocation != null) {
    mLatitudeText = (Double.valueOf(mLastLocation.getLatitude()));
    mLongitudeText = (Double.valueOf(mLastLocation.getLongitude()));
    LatLng last = new LatLng( mLatitudeText,mLongitudeText);
    mMap.moveCamera(CameraUpdateFactory.newLatLng(last));
}
 

Надеюсь, я был ясен.


Смотрите Документы CameraFactory, чтобы узнать о работе с камерой на Картах: https://developers.google.com/android/reference/com/google/android/gms/maps/CameraUpdateFactory

Ответ №3:

Братан, для этого тебе нужны GoogleApiClient и LocationRequest , а также в манифесте два разрешения пользователей: «ДОСТУП К ТОЧНОМУ МЕСТОПОЛОЖЕНИЮ И ДОСТУП К ГРУБОМУ МЕСТОПОЛОЖЕНИЮ», и чтобы получить текущее местоположение, вам нужно сделать что-то вроде этого: включить это в манифест:-

  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
 

—> И текущий код местоположения в Acticity будет выглядеть следующим образом:
—> Создайте эти две переменные глобально в действии:

 GoogleApiClient mGoogleapiClient;
LocationRequest mUserLocationRequest;
 

—> Затем перейдите к @override Onconnected() и сделайте вот так :-

  @Override
public void onConnected(Bundle bundle) {
    mUserLocationRequest = LocationRequest.create();
    /* Priority = High so that more Correct User Location will be Accessed
       up to date information ot highest information get*/
    /* Priority = Low if you Don't Want The Exect Location Of The User */
    mUserLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    /*For every 1 min I have to Fetch My User Location*/
    mUserLocationRequest.setInterval(1000);

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleapiClient, mUserLocationRequest,  (LocationListener) MainActivity.this);
}
 

—> Теперь запускает LocationListener в Activity, который внедряет метод onLocationChanged(): и делайте в этом такие вещи, которые будут предоставлять вам актуальную информацию всякий раз, когда пользователь меняет свое местоположение:-

 @Override
public void onLocationChanged(Location location) {
    if (location == null)
    {
        Toast.makeText(this, "Sorry We Can't able to Get Your Current Location", Toast.LENGTH_SHORT).show();
    }
    else
    {
        LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng,15);
        mGoogleMap.animateCamera(update);
    }
}