Google Maps API location button (Android Studio) Not Displayed

I am developing a native Android application, with the Android Studio IDE, which performs an integration with the Google Maps API.

I noticed in several videos that when activating the setmylocation property (True) should activate the location button (top Direct corner of activity), but when I activate this property the button is not being displayed. I have tried several ways to solve the error, but I still did not find the solution.

Details:

  • I am inheriting the SupportMapFragment class.
  • I use Google'S location API to pick up location.
  • every part of the location is working properly, the only problem is this button that is not displayed.

Source Codes:

  • map activity (the setMyLocation (true) property is called in the onmapready

    public class ActMap extends SupportMapFragment implements 
    OnMapReadyCallback, GoogleMap.OnMapLongClickListener, 
    GoogleApiClient.ConnectionCallbacks,
        LocationListener {
    
    private GoogleMap mMap;
    private GoogleApiClient googleApi;
    private LocationRequest locationRequest;
    private LatLng myLocation;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getMapAsync(this);
    }
    
    @Override
    public void onResume() {
        super.onResume();
    
        if (googleApi != null && googleApi.isConnected()) {
            startLocationUpdate();
        }
    }
    
    @Override
    public void onPause() {
        super.onPause();
    
        if (googleApi != null) {
            stopLocationUpdate();
        }
    }
    
    // Evento principal, após carregar o mapa
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    
        mMap.setMyLocationEnabled(true);
        setSettingsMap();
        callConenection();
            }
    
    // quando conecta na API Location. O Bandle retorna um objeto location
    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Location location = 
     LocationServices.FusedLocationApi.getLastLocation(googleApi);
    
        if (location != null) {
            myLocation = new LatLng(location.getLatitude(), 
       location.getLongitude());
            moveCameraMyLocation(myLocation);
        }
    
        initLocationRequest();
        startLocationUpdate();
    }
    
    @Override
    public void onConnectionSuspended(int i) {
    
    }
    
    @Override
    public void onMapLongClick(LatLng latLng) {
        createMarker("Click no mapa", latLng);
    }
    
    
    //resultado do location request
    @Override
    public void onLocationChanged(Location location) {
        myLocation = new LatLng(location.getLatitude(), l 
     ocation.getLongitude());
        Toast.makeText(getContext(), "Latitude:" + myLocation.latitude + " 
     Longetude:" + myLocation.longitude, Toast.LENGTH_LONG).show();
     }
    
    //------------ FUNCOES PROPRIAS -----------//
    
    private void moveCameraMyLocation(LatLng latLng) {
        mMap.moveCamera(CameraUpdateFactory.newLatLng(myLocation));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);
    }
    
    //configurações da requisição da localização que é executada em um 
    intervalo de tempo.
    private void initLocationRequest() {
        locationRequest = new LocationRequest();
        locationRequest.setInterval(10000);//tempo que sera atualizado
        locationRequest.setFastestInterval(5000); // tempo minimo que sera 
    atualiza (caso uma outra APP tentar atualizar dentro esse intervao, o 
    metodo não executa}
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     // HIGH_ACCURAY é alta precisão (GPS);
    }
    
    //dispara o locationRequest
    private void startLocationUpdate() {
        LocationServices.FusedLocationApi.requestLocationUpdates(googleApi, 
     locationRequest, this);// pegar dados de localização
    }
    
    //Pausa o location request
    private void stopLocationUpdate() {
        LocationServices.FusedLocationApi.removeLocationUpdates(googleApi, 
    this);
    }
    
    //setando configurações iniciais;
    private void setSettingsMap() {
        try {
            mMap.getUiSettings().setZoomControlsEnabled(true);
            mMap.getUiSettings().setMyLocationButtonEnabled(true);
            mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    
            //Eventos
            mMap.setOnMapLongClickListener(this);
    
    
        } catch (Exception e) {
            Toast.makeText(getContext(), "Erro ao realizar configuração do 
    mapa. Detalhes: " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
    
    
    // metodo para criar marcadores
    public void createMarker(String title, LatLng position) {
        MarkerOptions marker = new MarkerOptions();
        marker.title(title);
        marker.position(position);
    
        mMap.addMarker(marker);
        mMap.moveCamera(CameraUpdateFactory.newLatLng(position));
    }
    
    //Conexão com api Location
    private synchronized void callConenection() {
        googleApi = new GoogleApiClient.Builder(getContext())
                .addConnectionCallbacks(this)
                .addApi(LocationServices.API)
                .build();
        googleApi.connect();
    }   
    

    - Layout (XML):

     <fragment xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:map="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/map"
     android:name="com.google.android.gms.maps.SupportMapFragment"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context="com.example.joao.deliall.ActMap"
     map:mapType="normal"
     map:uiCompass="true"/>
    
  • AndroidManifest.xml

       <?xml version="1.0" encoding="utf-8"?>
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.example.joao.deliall">
    
       <uses-permission android:name="android.permission.INTERNET" />
       <uses-permission 
        android:name="android.permission.ACCESS_COARSE_LOCATION" />
       <uses-permission 
       android:name="android.permission.ACCESS_FINE_LOCATION" />
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".ActSplashScreen"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ActMain"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ActLogin"
            android:label="@string/title_activity_act_login" />
        <!--
             The API key for Google Maps-based APIs is defined as a string 
          resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to 
          sign the APK.
             You need a different API key for each encryption key, including 
         the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in 
           src/debug/ and src/release/. 
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />
    
        <activity
            android:name=".ActMap"
            android:label="@string/title_activity_act_map"></activity>
          </application>
      </manifest>
    
Author: ramaral, 2017-07-31

1 answers

Fortunately I found the problem, it gets ridiculous from so simple. The detail is that the navbar was capping the button, I put a vertical LinearLayout and solved the problem.

 1
Author: João Paulo Muller, 2017-08-01 03:08:47