title: how to fix java.lang.AbstractMethodError: abstract method not implemented
body: <p>I have this activity and i got the crash saied java.lang.AbstractMethodError: abstract method not implemented how can i solve it?
  it is like i make the activity impelements of something not implemented but i don't know how to fix it!
  i faced this problem for many times and i don't know how to solve it!!</p>
  
  <pre><code>public class SelectEndPoint extends AppCompatActivity implements  OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener {
  private GoogleMap mMap;
  private GoogleApiClient mGoogleApiClient;
  private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
  private static String TAG = "MAP LOCATION";
  Context mContext;
  TextView mLocationMarkerText;
  private LatLng mCenterLatLong;
  
  
  /**
   * Receiver registered with this activity to get the response from FetchAddressIntentService.
   */
  private AddressResultReceiver mResultReceiver;
  /**
   * The formatted location address.
   */
  protected String mAddressOutput;
  protected String mAreaOutput;
  protected String mCityOutput;
  protected String mStateOutput;
  EditText mLocationAddress;
  TextView mLocationText;
  private static final int REQUEST_CODE_AUTOCOMPLETE = 1;
  Toolbar mToolbar;
  
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.select_end_point);
      mContext = this;
      // Obtain the SupportMapFragment and get notified when the map is ready to be used.
      SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
              .findFragmentById(R.id.map);
  
      mLocationMarkerText = (TextView) findViewById(R.id.locationMarkertext);
  
      mToolbar = (Toolbar) findViewById(R.id.toolbar);
      setSupportActionBar(mToolbar);
      getSupportActionBar().setDisplayShowHomeEnabled(true);
  
      getSupportActionBar().setTitle(getResources().getString(R.string.app_name));
  
  
  
  
  
      mapFragment.getMapAsync(this);
      mResultReceiver = new AddressResultReceiver(new Handler());
  
      if (checkPlayServices()) {
          // If this check succeeds, proceed with normal processing.
          // Otherwise, prompt user to get valid Play Services APK.
          if (!AppUtils.isLocationEnabled(mContext)) {
              // notify user
              AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
              dialog.setMessage("Location not enabled!");
              dialog.setPositiveButton("Open location settings", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                      Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                      startActivity(myIntent);
                  }
              });
              dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
  
                  @Override
                  public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                      // TODO Auto-generated method stub
  
                  }
              });
              dialog.show();
          }
          buildGoogleApiClient();
      } else {
          Toast.makeText(mContext, "Location not supported in this device", Toast.LENGTH_SHORT).show();
      }
  
  }
  
  
  /**
   * 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) {
      Log.d(TAG, "OnMapReady");
      mMap = googleMap;
  
      mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
          @Override
          public void onCameraChange(CameraPosition cameraPosition) {
              Log.d("Camera postion change" + "", cameraPosition + "");
              mCenterLatLong = cameraPosition.target;
  
  
              mMap.clear();
  
              try {
  
                  Location mLocation = new Location("");
                  mLocation.setLatitude(mCenterLatLong.latitude);
                  mLocation.setLongitude(mCenterLatLong.longitude);
  
                  startIntentService(mLocation);
                  mLocationMarkerText.setText("Lat : " + mCenterLatLong.latitude + "," + "Long : " + mCenterLatLong.longitude);
  
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      });
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &amp;&amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
          // TODO: Consider calling
          //    ActivityCompat#requestPermissions
          // here to request the missing permissions, and then overriding
          //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
          //                                          int[] grantResults)
          // to handle the case where the user grants the permission. See the documentation
          // for ActivityCompat#requestPermissions for more details.
          return;
      }
  
    //mMap.setMyLocationEnabled(true);
    //        mMap.getUiSettings().setMyLocationButtonEnabled(true);
    //
   //        // Add a marker in Sydney and move the camera
    //        LatLng sydney = new LatLng(-34, 151);
   //        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
  //        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
  }
  
  @Override
  public void onConnected(Bundle bundle) {
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &amp;&amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
          // TODO: Consider calling
          //    ActivityCompat#requestPermissions
          // here to request the missing permissions, and then overriding
          //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
          //                                          int[] grantResults)
          // to handle the case where the user grants the permission. See the documentation
          // for ActivityCompat#requestPermissions for more details.
          return;
      }
      Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
              mGoogleApiClient);
      if (mLastLocation != null) {
          changeMap(mLastLocation);
          Log.d(TAG, "ON connected");
  
      } else
          try {
              LocationServices.FusedLocationApi.removeLocationUpdates(
                      mGoogleApiClient, this);
  
          } catch (Exception e) {
              e.printStackTrace();
          }
      try {
          LocationRequest mLocationRequest = new LocationRequest();
          mLocationRequest.setInterval(10000);
          mLocationRequest.setFastestInterval(5000);
          mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
          LocationServices.FusedLocationApi.requestLocationUpdates(
                  mGoogleApiClient, mLocationRequest, this);
  
      } catch (Exception e) {
          e.printStackTrace();
      }
  
  }
  
  @Override
  public void onConnectionSuspended(int i) {
      Log.i(TAG, "Connection suspended");
      mGoogleApiClient.connect();
  }
  
  @Override
  public void onLocationChanged(Location location) {
      try {
          if (location != null)
              changeMap(location);
          LocationServices.FusedLocationApi.removeLocationUpdates(
                  mGoogleApiClient, this);
  
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  
  @Override
  public void onConnectionFailed(ConnectionResult connectionResult) {
  
  }
  
  
  protected synchronized void buildGoogleApiClient() {
      mGoogleApiClient = new GoogleApiClient.Builder(this)
              .addConnectionCallbacks(this)
              .addOnConnectionFailedListener(this)
              .addApi(LocationServices.API)
              .build();
  }
  
  @Override
  protected void onStart() {
      super.onStart();
      try {
          mGoogleApiClient.connect();
  
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  
  @Override
  protected void onStop() {
      super.onStop();
      try {
  
      } catch (RuntimeException e) {
          e.printStackTrace();
      }
      if (mGoogleApiClient != null &amp;&amp; mGoogleApiClient.isConnected()) {
          mGoogleApiClient.disconnect();
      }
  }
  
  private boolean checkPlayServices() {
      int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
      if (resultCode != ConnectionResult.SUCCESS) {
          if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
              GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                      PLAY_SERVICES_RESOLUTION_REQUEST).show();
          } else {
              //finish();
          }
          return false;
      }
      return true;
  }
  
  private void
  
  changeMap(Location location) {
  
      Log.d(TAG, "Reaching map" + mMap);
  
  
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &amp;&amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
          // TODO: Consider calling
          //    ActivityCompat#requestPermissions
          // here to request the missing permissions, and then overriding
          //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
          //                                          int[] grantResults)
          // to handle the case where the user grants the permission. See the documentation
          // for ActivityCompat#requestPermissions for more details.
          return;
      }
  
      // check if map is created successfully or not
      if (mMap != null) {
          mMap.getUiSettings().setZoomControlsEnabled(false);
          LatLng latLong;
  
  
          latLong = new LatLng(location.getLatitude(), location.getLongitude());
  
          CameraPosition cameraPosition = new CameraPosition.Builder()
                  .target(latLong).zoom(19f).tilt(70).build();
  
          mMap.setMyLocationEnabled(true);
          mMap.getUiSettings().setMyLocationButtonEnabled(true);
          mMap.animateCamera(CameraUpdateFactory
                  .newCameraPosition(cameraPosition));
  
          mLocationMarkerText.setText("Lat : " + location.getLatitude() + "," + "Long : " + location.getLongitude());
          startIntentService(location);
  
  
      } else {
          Toast.makeText(getApplicationContext(),
                  "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                  .show();
      }
  
  }
  
  
  /**
   * Receiver for data sent from FetchAddressIntentService.
   */
  class AddressResultReceiver extends ResultReceiver {
      public AddressResultReceiver(Handler handler) {
          super(handler);
      }
  
      /**
       * Receives data sent from FetchAddressIntentService and updates the UI in MainActivity.
       */
      @Override
      protected void onReceiveResult(int resultCode, Bundle resultData) {
  
          // Display the address string or an error message sent from the intent service.
          mAddressOutput = resultData.getString(AppUtils.LocationConstants.RESULT_DATA_KEY);
  
          mAreaOutput = resultData.getString(AppUtils.LocationConstants.LOCATION_DATA_AREA);
  
          mCityOutput = resultData.getString(AppUtils.LocationConstants.LOCATION_DATA_CITY);
          mStateOutput = resultData.getString(AppUtils.LocationConstants.LOCATION_DATA_STREET);
  
          displayAddressOutput();
  
          // Show a toast message if an address was found.
          if (resultCode == AppUtils.LocationConstants.SUCCESS_RESULT) {
              //  showToast(getString(R.string.address_found));
  
  
          }
  
  
      }
  
  }
  
  /**
   * Updates the address in the UI.
   */
  protected void displayAddressOutput() {
      //  mLocationAddressTextView.setText(mAddressOutput);
      try {
          if (mAreaOutput != null)
              // mLocationText.setText(mAreaOutput+ "");
  
              mLocationAddress.setText(mAddressOutput);
          //mLocationText.setText(mAreaOutput);
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  
  /**
   * Creates an intent, adds location data to it as an extra, and starts the intent service for
   * fetching an address.
   */
  protected void startIntentService(Location mLocation) {
      // Create an intent for passing to the intent service responsible for fetching the address.
      Intent intent = new Intent(this, FetchAddressIntentService.class);
  
      // Pass the result receiver as an extra to the service.
      intent.putExtra(AppUtils.LocationConstants.RECEIVER, mResultReceiver);
  
      // Pass the location data as an extra to the service.
      intent.putExtra(AppUtils.LocationConstants.LOCATION_DATA_EXTRA, mLocation);
  
      // Start the service. If the service isn't already running, it is instantiated and started
      // (creating a process for it if needed); if it is running then it remains running. The
      // service kills itself automatically once all intents are processed.
      startService(intent);
  }
  
  
        /* private void openAutocompleteActivity() {
      try {
          // The autocomplete activity requires Google Play Services to be available. The intent
          // builder checks this and throws an exception if it is not the case.
          Intent intent = new PlaceAutocomplete.IntentBuilder(PlaceAutocomplete.MODE_FULLSCREEN)
                  .build(this);
          startActivityForResult(intent, REQUEST_CODE_AUTOCOMPLETE);
      } catch (GooglePlayServicesRepairableException e) {
          // Indicates that Google Play Services is either not installed or not up to date. Prompt
          // the user to correct the issue.
          GoogleApiAvailability.getInstance().getErrorDialog(this, e.getConnectionStatusCode(),
                  0 /* requestCode *//*).show();
      } catch (GooglePlayServicesNotAvailableException e) {
          // Indicates that Google Play Services is not available and the problem is not easily
          // resolvable.
     /*     String message = "Google Play Services is not available: " +
                  GoogleApiAvailability.getInstance().getErrorString(e.errorCode);
  
          Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
      }
  }
   */
  
      /**
      * Called after the autocomplete activity has finished to return its   result.
   */
  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
  
      // Check that the result was from the autocomplete widget.
      if (requestCode == REQUEST_CODE_AUTOCOMPLETE) {
          if (resultCode == RESULT_OK) {
     }}}
  </code></pre>
  
  <p>the error is :</p>
  
  <pre><code>java.lang.AbstractMethodError: abstract method not implemented
                                                                   at com.google.android.gms.common.api.Api$zza.zza(Unknown Source)
                                                                   at com.google.android.gms.common.api.GoogleApiClient$Builder.zza(Unknown Source)
                                                                   at com.google.android.gms.common.api.GoogleApiClient$Builder.zzarg(Unknown Source)
                                                                   at com.google.android.gms.common.api.GoogleApiClient$Builder.build(Unknown Source)
                                                                   at com.wneet.white.services.SelectEndPoint.buildGoogleApiClient(SelectEndPoint.java:252)
                                                                   at com.wneet.white.services.SelectEndPoint.onCreate(SelectEndPoint.java:118)
                                                                   at android.app.Activity.performCreate(Activity.java:5581)
                                                                   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2483)
                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2578)
                                                                   at android.app.ActivityThread.access$900(ActivityThread.java:170)
                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                   at android.os.Looper.loop(Looper.java:146)
                                                                   at android.app.ActivityThread.main(ActivityThread.java:5727)
                                                                   at java.lang.reflect.Method.invokeNative(Native Method)
                                                                   at java.lang.reflect.Method.invoke(Method.java:515)
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
                                                                   at dalvik.system.NativeStart.main(Native Method)
  </code></pre>