title: MapsActivity cannot be cast to com.google.android.gms.location.LocationListener
body: <p>I am trying to build an android app related to google map using an android studio 3.0.1 that uses the user location.I am facing an exception in my application, the exception is related to <code>com.google.android.gms.location.LocationListner</code> in android. I tried searching for an answer but I can't figure out what the problem is.I tried this code, but it did not work on Android.</p>
  
  <pre><code>  package com.example.mrunal.firebase;
  
   import android.Manifest;
   import android.app.AlertDialog;
   import android.content.DialogInterface;
   import android.content.pm.PackageManager;
   import android.location.Location;
   import android.location.LocationListener;
   import android.os.Build;
   import android.os.Bundle;
   import android.support.annotation.NonNull;
   import android.support.annotation.Nullable;
   import android.support.v4.app.ActivityCompat;
   import android.support.v4.app.FragmentActivity;
   import android.support.v4.content.ContextCompat;
   import android.widget.Toast;
  
   import com.google.android.gms.common.ConnectionResult;
   import com.google.android.gms.common.api.GoogleApiClient;
   import com.google.android.gms.location.LocationRequest;
   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.BitmapDescriptorFactory;
   import com.google.android.gms.maps.model.LatLng;
   import com.google.android.gms.maps.model.Marker;
   import com.google.android.gms.maps.model.MarkerOptions;
  
    public class MapsActivity extends FragmentActivity implements 
    OnMapReadyCallback,
      GoogleApiClient.ConnectionCallbacks,
      GoogleApiClient.OnConnectionFailedListener,
      LocationListener {
  
  private GoogleMap mMap;
  GoogleApiClient mGoogleApiClient;
  Location mLastLocation;
  Marker mCurrLocationMarker;
  LocationRequest mLocationRequest;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_maps);
  
      if (android.os.Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.M) {
          checkLocationPermission();
      }
  
      // 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);
  }
  
  
  /**
   * Manipulates the map once available.
   * This callback is triggered when the map is ready to be used.
   * This is where we can add markers or lines, add listeners or move the camera. In this case,
   * we just add a marker near Sydney, Australia.
   * If Google Play services is not installed on the device, the user will be prompted to install
   * it inside the SupportMapFragment. This method will only be triggered once the user has
   * installed Google Play services and returned to the app.
   */
  @Override
  public void onMapReady(GoogleMap googleMap) {
      mMap = googleMap;
  
      // Add a marker in Sydney and move the camera
      mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
  
      //Initialize Google Play Services
      if (android.os.Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.M) {
          if (ContextCompat.checkSelfPermission(this,
                  Manifest.permission.ACCESS_FINE_LOCATION)
                  == PackageManager.PERMISSION_GRANTED) {
              buildGoogleApiClient();
              mMap.setMyLocationEnabled(true);
          }else {
              //Request Location Permission
              checkLocationPermission();
          }
      }
      else {
          buildGoogleApiClient();
          mMap.setMyLocationEnabled(true);
      }
  }
  
  protected synchronized void buildGoogleApiClient() {
      mGoogleApiClient = new GoogleApiClient.Builder(this)
              .addConnectionCallbacks(this)
              .addOnConnectionFailedListener(this)
              .addApi(LocationServices.API)
              .build();
      mGoogleApiClient.connect();
  }
  
  @Override
  public void onLocationChanged(Location location) {
  
      mLastLocation = location;
      if (mCurrLocationMarker != null) {
          mCurrLocationMarker.remove();
      }
      //Place current location marker
      LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
      MarkerOptions markerOptions = new MarkerOptions();
      markerOptions.position(latLng);
      markerOptions.title("Current Position");
      markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
      mCurrLocationMarker = mMap.addMarker(markerOptions);
      //move map camera
      mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
      mMap.animateCamera(CameraUpdateFactory.zoomTo(11));
      //stop location updates
      if (mGoogleApiClient != null) {
          LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, (com.google.android.gms.location.LocationListener) this);
      }
  
  }
  
  @Override
  public void onStatusChanged(String provider, int status, Bundle extras) {}
  
  @Override
  public void onProviderEnabled(String provider) {}
  
  @Override
  public void onProviderDisabled(String provider) {}
  
  @Override
  public void onConnected(@Nullable Bundle bundle) {
  
      mLocationRequest = new LocationRequest();
      mLocationRequest.setInterval(1000);
      mLocationRequest.setFastestInterval(1000);
      mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
      if (ContextCompat.checkSelfPermission(this,
              Manifest.permission.ACCESS_FINE_LOCATION)
              == PackageManager.PERMISSION_GRANTED) {
          LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);
      }
  }
  
  @Override
  public void onConnectionSuspended(int i) {}
  
  @Override
  public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {}
  
  public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
  
  public boolean checkLocationPermission(){
      if (ContextCompat.checkSelfPermission(this,
              Manifest.permission.ACCESS_FINE_LOCATION)
              != PackageManager.PERMISSION_GRANTED) {
  
          // Asking user if explanation is needed
          if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                  Manifest.permission.ACCESS_FINE_LOCATION)) {
  
              // Show an explanation to the user *asynchronously* -- don't block
              // this thread waiting for the user's response! After the user
              // sees the explanation, try again to request the permission.
  
              //Prompt the user once explanation has been shown
              new AlertDialog.Builder(this)
                      .setTitle("Location Permission Needed")
                      .setMessage("This app needs the Location permission, please accept to use location functionality")
                      .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialogInterface, int i) {
                              //Prompt the user once explanation has been shown
                              ActivityCompat.requestPermissions(MapsActivity.this,
                                      new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                                      MY_PERMISSIONS_REQUEST_LOCATION );
                          }
                      })
                      .create()
                      .show();
  
          } else {
              // No explanation needed, we can request the permission.
              ActivityCompat.requestPermissions(this,
                      new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                      MY_PERMISSIONS_REQUEST_LOCATION);
          }
          return false;
      } else {
          return true;
      }
  }
  
  @Override
  public void onRequestPermissionsResult(int requestCode,
                                         String permissions[], int[] grantResults) {
      switch (requestCode) {
          case MY_PERMISSIONS_REQUEST_LOCATION: {
              // If request is cancelled, the result arrays are empty.
              if (grantResults.length &gt; 0
                      &amp;&amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  
                  // permission was granted. Do the
                  // contacts-related task you need to do.
                  if (ContextCompat.checkSelfPermission(this,
                          Manifest.permission.ACCESS_FINE_LOCATION)
                          == PackageManager.PERMISSION_GRANTED) {
  
                      if (mGoogleApiClient == null) {
                          buildGoogleApiClient();
                      }
                      mMap.setMyLocationEnabled(true);
                  }
  
              } else {
  
                  // Permission denied, Disable the functionality that depends on this permission.
                  Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
              }
              return;
          }
          // other 'case' lines to check for other permissions this app might request.
          // You can add here other case statements according to your requirement.
      }
  }
  }
  </code></pre>
  
  <p><strong>build.gradle</strong></p>
  
  <pre><code>   apply plugin: 'com.android.application'
  
  android {
  compileSdkVersion 26
  defaultConfig {
      applicationId "com.example.mrunal.firebase"
      minSdkVersion 19
      targetSdkVersion 26
      versionCode 1
      versionName "1.0"
      testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  }
  buildTypes {
      release {
          minifyEnabled false
          proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      }
  }
  }
  
   dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  implementation 'com.android.support:appcompat-v7:26.1.0'
  implementation 'com.android.support:support-v4:26.1.0'
  implementation 'com.android.support:cardview-v7:26.1.0'
  implementation 'com.android.support:recyclerview-v7:26.1.0'
  implementation 'com.android.support.constraint:constraint-layout:1.0.2'
  implementation 'com.google.firebase:firebase-auth:11.8.0'
  implementation 'com.google.firebase:firebase-storage:11.8.0'
  implementation 'com.google.firebase:firebase-database:11.8.0'
  implementation 'com.android.support:support-v4:26.1.0'
  implementation 'com.google.android.gms:play-services-maps:11.8.0'
  compile 'com.google.android.gms:play-services-location:11.8.0'
  testImplementation 'junit:junit:4.12'
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.firebase:firebase-client-android:2.5.0'
  androidTestImplementation 'com.android.support.test:runner:1.0.1'
  androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
  }
  apply plugin: 'com.google.gms.google-services'
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/fL9fl.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/fL9fl.png" alt="my Logcat"></a></p>