Как отобразить мое местоположение на Картах Google для Android API v2

Я искал ответ на этот вопрос повсюду, и никто, ни на одном форуме, не смог помочь. Я просмотрел учебники. В Руководстве по API говорится:

Кнопка «Мое местоположение» появляется в правом верхнем углу экрана, только если включен слой «Мое местоположение».

Итак, я искал этот слой «Мое местоположение» и ничего не смог найти. Как показать свое местоположение на карте Google?


person Yos233    schedule 28.02.2013    source источник
comment
Есть несколько других вопросов о поиске текущего местоположения в Google Maps Android V2 на SO. С учетом сказанного, вот решение, которое позволит определить местоположение, а также позволит вам реагировать на изменения местоположения: stackoverflow.com/a/13753518 /1103584   -  person DiscDev    schedule 01.03.2013
comment
Спасибо за ссылку. Я уже понял, как получить доступ к GPS и центрировать карту на пользователе. Руководство по API пришло туда. Я искал определенный фрагмент кода, который показывает местоположение пользователя на карте в виде синей точки.   -  person Yos233    schedule 01.03.2013


Ответы (6)


В руководстве по API все неправильно (правда, Google?). С Maps API v2 вам не нужно включать слой, чтобы показать себя, есть простой вызов экземпляра GoogleMaps, который вы создали со своей картой.

Документация Google

Фактическая документация, которую предоставляет Google, дает вам ответ. Вам просто нужно

Если вы используете Котлин

// map is a GoogleMap object
map.isMyLocationEnabled = true


Если вы используете Java

// map is a GoogleMap object
map.setMyLocationEnabled(true);

и наблюдайте, как происходит волшебство.

Просто убедитесь, что у вас есть разрешение на определение местоположения, и вы запросили его во время выполнения на уровне API 23 (M ) или выше

person Yos233    schedule 28.02.2013
comment
Есть ли способ автоматического нажатия кнопки MyLocationButton для центрирования карты? Теперь мне нужно использовать LocationClient, чтобы сделать то же самое, что и MyLocationButton. - person iForests; 15.06.2013
comment
Я не верю, что есть способ программно вызвать кнопку MyLocation. Однако вы можете использовать объект LocationManager. - person Yos233; 16.06.2013
comment
Затем вы можете использовать объект CameraPosition для перемещения карты в любое место. - person Yos233; 16.06.2013
comment
Большое спасибо за ваш ответ. У меня вопрос в продолжении. По умолчанию кнопка «Мое местоположение» отображается вверху справа. Как можно показать слой внизу справа? Вы можете помочь? - person Srikar Reddy; 17.06.2016
comment
Аналогичная проблема здесь. Как я могу переместить или добавить немного поля к кнопке моего местоположения? - person Akronix; 24.12.2017
comment
Я нашел решение! Просто добавьте отступы к карте, как сказано здесь: stackoverflow.com/questions/14489880/ - person Akronix; 24.12.2017
comment
Можно ли увеличить размер этой иконки? - person Sethuraman Srinivasan; 14.01.2019

Java-код:

public class MapActivity extends FragmentActivity implements LocationListener  {

    GoogleMap googleMap;
    LatLng myPosition;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        // Getting reference to the SupportMapFragment of activity_main.xml
        SupportMapFragment fm = (SupportMapFragment)
        getSupportFragmentManager().findFragmentById(R.id.map);

        // Getting GoogleMap object from the fragment
        googleMap = fm.getMap();

        // Enabling MyLocation Layer of Google Map
        googleMap.setMyLocationEnabled(true);

        // Getting LocationManager object from System Service LOCATION_SERVICE
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        // Creating a criteria object to retrieve provider
        Criteria criteria = new Criteria();

        // Getting the name of the best provider
        String provider = locationManager.getBestProvider(criteria, true);

        // Getting Current Location
        Location location = locationManager.getLastKnownLocation(provider);

        if (location != null) {
            // Getting latitude of the current location
            double latitude = location.getLatitude();

            // Getting longitude of the current location
            double longitude = location.getLongitude();

            // Creating a LatLng object for the current location
            LatLng latLng = new LatLng(latitude, longitude);

            myPosition = new LatLng(latitude, longitude);

            googleMap.addMarker(new MarkerOptions().position(myPosition).title("Start"));
        }
    }
}

Activity_map.xml:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:map="http://schemas.android.com/apk/res-auto"
  android:id="@+id/map"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  class="com.google.android.gms.maps.SupportMapFragment"/>

Вы получите свое текущее местоположение в синем круге.

person UdiT    schedule 01.03.2013
comment
Спасибо UdiT, выглядит очень красиво. Но что вы делаете с вашей переменной latLing? Этот код показывает, что он не используется. Спасибо. - person Azurespot; 30.12.2014
comment
Ах, неважно, я думаю, что 2 объекта LatLng не нужны, поэтому я удалил один и вместо этого использовал myPosition. Это сработало! Спасибо еще раз! - person Azurespot; 30.12.2014
comment
Код отлично показывает текущее местоположение, но карта сильно уменьшена. Как установить уровень масштабирования по умолчанию, который вы видите при запуске карты Google? - person BTR Naidu; 28.12.2015
comment
@BTRNaidu Ну, вы должны сделать поворот камеры следующим образом: CameraPosition cameraPosition = new CameraPosition.Builder().target(location).zoom(16).build(); googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); - person Copacel; 12.11.2016
comment
пожалуйста, добавьте разрешение запроса на ваш код для завершения - person roghayeh hosseini; 23.04.2019

С Android 6.0 вам нужно проверить разрешение пользователя, если вы хотите использовать GoogleMap.setMyLocationEnabled(true), вы получите ошибку Call requires permission which may be rejected by user

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
   mMap.setMyLocationEnabled(true);
} else {
// Show rationale and request permission.
}

если вы хотите узнать больше, проверьте документы карт Google.

person Vasil Valchev    schedule 10.02.2016

Чтобы показать кнопку «Мое местоположение», вам нужно позвонить

map.getUiSettings().setMyLocationButtonEnabled(true);

на вашем объекте GoogleMap.

person FabioLor    schedule 28.02.2013
comment
Но сначала карта должна показать местоположение пользователя. Это то, о чем я спрашивал. Кнопка бесполезна, если нет синей точки. - person Yos233; 01.03.2013
comment
Если вы используете MapView, то: map.setMyLocationEnabled(true); map.getUiSettings().setMyLocationButtonEnabled(true); оба должны быть написаны - person Bam; 26.10.2014

Позвоните GoogleMap.setMyLocationEnabled(true) в свой Activity и добавьте этот двухстрочный код в Manifest:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
person Terranology    schedule 26.11.2013

Перед включением слоя «Мое местоположение» необходимо запросить у пользователя разрешение на определение местоположения. Этот образец не включает запрос на разрешение местоположения.

Для упрощения, с точки зрения строк кода, запрос на разрешение местоположения можно сделать с помощью библиотеки EasyPermissions.

Затем, следуя примеру официальной документации уровню "Мое местоположение" мой код работает следующим образом для всех версий Android, содержащих сервисы Google.

  1. Создайте действие, содержащее карту и реализующее интерфейсы OnMyLocationClickListener и OnMyLocationButtonClickListener.
  2. Определить в приложении/build.gradle implementation 'pub.devrel:easypermissions:2.0.1'
  3. Направить результаты в EasyPermissions в методе onRequestPermissionsResult()

    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);

  4. Запросите разрешение и действуйте в соответствии с ответом пользователя с помощью requestLocationPermission()

  5. Вызовите requestLocationPermission() и установите слушателей на onMapReady().

MapsActivity.java

public class MapsActivity extends FragmentActivity implements 
    OnMapReadyCallback,
    GoogleMap.OnMyLocationClickListener,
    GoogleMap.OnMyLocationButtonClickListener {

    private final int REQUEST_LOCATION_PERMISSION = 1;

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // 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);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        requestLocationPermission();
        mMap.setOnMyLocationButtonClickListener(this);
        mMap.setOnMyLocationClickListener(this);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    @SuppressLint("MissingPermission")
    @AfterPermissionGranted(REQUEST_LOCATION_PERMISSION)
    public void requestLocationPermission() {
        String[] perms = {Manifest.permission.ACCESS_FINE_LOCATION};
        if(EasyPermissions.hasPermissions(this, perms)) {
            mMap.setMyLocationEnabled(true);
            Toast.makeText(this, "Permission already granted", Toast.LENGTH_SHORT).show();
        }
        else {
            EasyPermissions.requestPermissions(this, "Please grant the location permission", REQUEST_LOCATION_PERMISSION, perms);
        }
    }

    @Override
    public boolean onMyLocationButtonClick() {
        Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
        return false;
    }

    @Override
    public void onMyLocationClick(@NonNull Location location) {
        Toast.makeText(this, "Current location:\n" + location, Toast.LENGTH_LONG).show();
    }
}

Источник

person Braian Coronel    schedule 03.03.2019