Mostrar meu local

Este é um exemplo de como ativar a camada "Meu local" e de como o botão "Meu local" mostra a posição atual do dispositivo, que é representada por um ponto azul no mapa.

Para mais detalhes, consulte a documentação.

Vamos começar

Antes de testar o exemplo de código, é necessário configurar o ambiente de desenvolvimento. Confira mais detalhes em Exemplos de código do SDK do Maps para Android.

Ver o código



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");
   
}

}

     

Clonar e executar os exemplos

O Git é necessário para executar esta amostra localmente. O comando a seguir clona o repositório do aplicativo de exemplo.

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

Importe o projeto de amostra no Android Studio:

  1. No Android Studio, selecione File > New > Import Project.
  2. Acesse o local onde você salvou o repositório e selecione o diretório do projeto para Kotlin ou Java:

    • Kotlin: PATH-REPO/android-samples/ApiDemos/kotlin
    • Java: PATH-REPO/android-samples/ApiDemos/java
  3. Clique em Open. O Android Studio cria seu projeto usando a ferramenta Gradle.
  4. Crie um arquivo secrets.properties em branco no mesmo diretório do arquivo local.properties do seu projeto. Confira mais informações em Adicionar sua chave de API ao projeto.
  5. Inclua a seguinte string em secrets.properties, substituindo YOUR_API_KEY pelo valor da sua chave de API:

    MAPS_API_KEY=YOUR_API_KEY
  6. Execute o app.