Blue dot and circle is not shown on MyLocation using android fused location api
For targeting api-23 or higher
See this answer....
For targeting api-22 and lower:
This code works for me, it has the MyLocation
blue dot/circle, and it also places a Marker
on the current location using the Fused Location Provider.
Here is the entire Activity code I used:
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import com.google.android.gms.maps.GoogleMap;import com.google.android.gms.maps.SupportMapFragment;import android.location.Location;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.location.LocationListener;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;import com.google.android.gms.maps.OnMapReadyCallback;public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, OnMapReadyCallback { LocationRequest mLocationRequest; GoogleApiClient mGoogleApiClient; LatLng latLng; GoogleMap mGoogleMap; SupportMapFragment mFragment; Marker mCurrLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; mGoogleMap.setMyLocationEnabled(true); buildGoogleApiClient(); mGoogleApiClient.connect(); } @Override public void onPause() { super.onPause(); //Unregister for location callbacks: if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } } protected synchronized void buildGoogleApiClient() { Toast.makeText(this,"buildGoogleApiClient",Toast.LENGTH_SHORT).show(); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } @Override public void onConnected(Bundle bundle) { Toast.makeText(this,"onConnected",Toast.LENGTH_SHORT).show(); Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); if (mLastLocation != null) { //place marker at current position mGoogleMap.clear(); latLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title("Current Position"); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); mCurrLocation = mGoogleMap.addMarker(markerOptions); } mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(5000); //5 seconds mLocationRequest.setFastestInterval(3000); //3 seconds mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); //mLocationRequest.setSmallestDisplacement(0.1F); //1/10 meter LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } @Override public void onConnectionSuspended(int i) { Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show(); } @Override public void onLocationChanged(Location location) { //remove previous current location marker and add new one at current position if (mCurrLocation != null) { mCurrLocation.remove(); } 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)); mCurrLocation = mGoogleMap.addMarker(markerOptions); Toast.makeText(this,"Location Changed",Toast.LENGTH_SHORT).show(); //If you only need one location, unregister the listener //LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); }}
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <fragment class="com.google.android.gms.maps.SupportMapFragment" android:id="@+id/map" android:layout_width="wrap_content" android:layout_height="wrap_content"/></RelativeLayout>
Result:
You have to add the following permissions in manifest:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.INTERNET"/><uses-feature android:glEsVersion="0x00020000" android:required="true" />
MarkerOptions().position(new LatLng( location.getLatitude(), location.getLongitude()));
Try this,
if (location!=null) { googleMap.clear(); LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); CameraPosition cameraPosition = new CameraPosition.Builder() .target(new LatLng(location.getLatitude(), location.getLongitude())).zoom(14).build(); googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPosition)); // create markerOptions MarkerOptions markerOptions = new MarkerOptions().position(new LatLng( location.getLatitude(), location.getLongitude())); // ROSE color icon markerOptions.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); markerOptions.position(latLng); // adding markerOptions Marker marker = googleMap.addMarker(markerOptions); dropPinEffect(marker); }