Показать мое местоположение

В этом примере показано, как включить слой "Мое местоположение". При нажатии на кнопку появляется синяя точка на карте, обозначающая текущее местоположение устройства.

Подробную информацию вы найдете в документации.

Начало работы

Прежде чем воспользоваться образцом кода, настройте среду разработки. Подробнее об образцах кода Maps SDK для Android

Ознакомьтесь с кодом

KotlinJava


class MyLocationDemoActivity : AppCompatActivity(),
   
OnMyLocationButtonClickListener,
   
OnMyLocationClickListener, OnMapReadyCallback,
   
OnRequestPermissionsResultCallback {
   
/**
     * Flag indicating whether a requested permission has been denied after returning in
     * [.onRequestPermissionsResult].
     */

   
private var permissionDenied = false
   
private lateinit var map: GoogleMap
   
override fun onCreate(savedInstanceState: Bundle?) {
       
super.onCreate(savedInstanceState)
        setContentView
(R.layout.my_location_demo)
        val mapFragment
=
            supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment?
        mapFragment
?.getMapAsync(this)
   
}

   
override fun onMapReady(googleMap: GoogleMap) {
        map
= googleMap
        googleMap
.setOnMyLocationButtonClickListener(this)
        googleMap
.setOnMyLocationClickListener(this)
        enableMyLocation
()
   
}

   
/**
     * Enables the My Location layer if the fine location permission has been granted.
     */

   
@SuppressLint("MissingPermission")
   
private fun enableMyLocation() {

       
// 1. Check if permissions are granted, if so, enable the my location layer
       
if (ContextCompat.checkSelfPermission(
               
this,
               
Manifest.permission.ACCESS_FINE_LOCATION
           
) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
               
this,
               
Manifest.permission.ACCESS_COARSE_LOCATION
           
) == PackageManager.PERMISSION_GRANTED
       
) {
            map
.isMyLocationEnabled = true
           
return
       
}

       
// 2. If if a permission rationale dialog should be shown
       
if (ActivityCompat.shouldShowRequestPermissionRationale(
               
this,
               
Manifest.permission.ACCESS_FINE_LOCATION
           
) || ActivityCompat.shouldShowRequestPermissionRationale(
               
this,
               
Manifest.permission.ACCESS_COARSE_LOCATION
           
)
       
) {
           
PermissionUtils.RationaleDialog.newInstance(
                LOCATION_PERMISSION_REQUEST_CODE
, true
           
).show(supportFragmentManager, "dialog")
           
return
       
}

       
// 3. Otherwise, request permission
       
ActivityCompat.requestPermissions(
           
this,
            arrayOf
(
               
Manifest.permission.ACCESS_FINE_LOCATION,
               
Manifest.permission.ACCESS_COARSE_LOCATION
           
),
            LOCATION_PERMISSION_REQUEST_CODE
       
)
   
}

   
override fun onMyLocationButtonClick(): Boolean {
       
Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT)
           
.show()
       
// Return false so that we don't consume the event and the default behavior still occurs
       
// (the camera animates to the user's current position).
       
return false
   
}

   
override fun onMyLocationClick(location: Location) {
       
Toast.makeText(this, "Current location:\n$location", Toast.LENGTH_LONG)
           
.show()
   
}

   
override fun onRequestPermissionsResult(
        requestCode
: Int,
        permissions
: Array<String>,
        grantResults
: IntArray
   
) {
       
if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) {
           
super.onRequestPermissionsResult(
                requestCode
,
                permissions
,
                grantResults
           
)
           
return
       
}

       
if (isPermissionGranted(
                permissions
,
                grantResults
,
               
Manifest.permission.ACCESS_FINE_LOCATION
           
) || isPermissionGranted(
                permissions
,
                grantResults
,
               
Manifest.permission.ACCESS_COARSE_LOCATION
           
)
       
) {
           
// Enable the my location layer if the permission has been granted.
            enableMyLocation
()
       
} else {
           
// Permission was denied. Display an error message
           
// ...
       
}
   
}

   
override fun onResumeFragments() {
       
super.onResumeFragments()
       
if (permissionDenied) {
           
// Permission was not granted, display error dialog.
            showMissingPermissionError
()
            permissionDenied
= false
       
}
   
}

   
/**
     * Displays a dialog with error message explaining that the location permission is missing.
     */

   
private fun showMissingPermissionError() {
        newInstance
(true).show(supportFragmentManager, "dialog")
   
}

    companion
object {
       
/**
         * Request code for location permission request.
         *
         * @see .onRequestPermissionsResult
         */

       
private const val LOCATION_PERMISSION_REQUEST_CODE = 1
   
}
}

     

public class MyLocationDemoActivity extends AppCompatActivity
   
implements
   
OnMyLocationButtonClickListener,
   
OnMyLocationClickListener,
   
OnMapReadyCallback,
   
ActivityCompat.OnRequestPermissionsResultCallback {

   
/**
     * Request code for location permission request.
     *
     * @see #onRequestPermissionsResult(int, String[], int[])
     */

   
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;

   
/**
     * Flag indicating whether a requested permission has been denied after returning in {@link
     * #onRequestPermissionsResult(int, String[], int[])}.
     */

   
private boolean permissionDenied = false;

   
private GoogleMap map;

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

       
SupportMapFragment mapFragment =
           
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment
.getMapAsync(this);
   
}

   
@Override
   
public void onMapReady(@NonNull GoogleMap googleMap) {
        map
= googleMap;
        map
.setOnMyLocationButtonClickListener(this);
        map
.setOnMyLocationClickListener(this);
        enableMyLocation
();
   
}

   
/**
     * Enables the My Location layer if the fine location permission has been granted.
     */

   
@SuppressLint("MissingPermission")
   
private void enableMyLocation() {
       
// 1. Check if permissions are granted, if so, enable the my location layer
       
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
           
== PackageManager.PERMISSION_GRANTED
           
|| ContextCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION)
           
== PackageManager.PERMISSION_GRANTED) {
            map
.setMyLocationEnabled(true);
           
return;
       
}

       
// 2. Otherwise, request location permissions from the user.
       
PermissionUtils.requestLocationPermissions(this, LOCATION_PERMISSION_REQUEST_CODE, true);
   
}

   
@Override
   
public boolean onMyLocationButtonClick() {
       
Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
       
// Return false so that we don't consume the event and the default behavior still occurs
       
// (the camera animates to the user's current position).
       
return false;
   
}

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

   
@Override
   
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
       
@NonNull int[] grantResults) {
       
if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) {
           
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
           
return;
       
}

       
if (PermissionUtils.isPermissionGranted(permissions, grantResults,
           
Manifest.permission.ACCESS_FINE_LOCATION) || PermissionUtils
           
.isPermissionGranted(permissions, grantResults,
               
Manifest.permission.ACCESS_COARSE_LOCATION)) {
           
// Enable the my location layer if the permission has been granted.
            enableMyLocation
();
       
} else {
           
// Permission was denied. Display an error message
           
// ...
       
}
   
}

   
@Override
   
protected void onResumeFragments() {
       
super.onResumeFragments();
       
if (permissionDenied) {
           
// Permission was not granted, display error dialog.
            showMissingPermissionError
();
            permissionDenied
= false;
       
}
   
}

   
/**
     * Displays a dialog with error message explaining that the location permission is missing.
     */

   
private void showMissingPermissionError() {
       
PermissionUtils.PermissionDeniedDialog
           
.newInstance(true).show(getSupportFragmentManager(), "dialog");
   
}

}

     

Клонирование и запуск примеров приложений

Для локального запуска примера приложения вам потребуется Git. Используйте команду ниже, чтобы клонировать пример приложения в репозиторий.

git clone git@github.com:googlemaps-samples/android-samples.git

Импортируйте пример проекта в Android Studio:

  1. В Android Studio откройте меню File > New > Import Project (Файл > Создать > Импортировать проект).
  2. Перейдите в директорию, куда вы добавили репозиторий, и выберите каталог проекта для Kotlin или Java.

    • Kotlin: PATH-REPO/android-samples/ApiDemos/kotlin
    • Java: PATH-REPO/android-samples/ApiDemos/java
  3. Нажмите кнопку Открыть. Android Studio создаст проект с помощью Gradle.
  4. Создайте пустой файл secrets.properties в том же каталоге, где хранится файл проекта local.properties. Подробнее о том, как добавить в проект ключ API
  5. Добавьте в secrets.properties следующую строку, заменив YOUR_API_KEY на значение вашего ключа API:

    MAPS_API_KEY=YOUR_API_KEY
  6. Запустите приложение.