I'm quite a beginner to android and I'm trying out my best to learn android. I'm trying to create an android application that identify the user location using google maps. However I was able to identify user's location, but not as I expected.
As in the following picture it shows a default location. Once I click the button in top left corner, the map shows my location.
I would like to know my location straight away, without clicking a button. Also I want to know the user location and store it in a string, not in longitude and latitude values. Any Help?
Code:
package com.example.lalinda.googlemap1;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
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.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// 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);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setMyLocationEnabled(true);
}
}
Google maps uses user's lastKnownLocation
for location, If the lastknownLocation
is unknown it takes time to fetch location through different provider say GPS
or Network
. I would suggest to use lastKnownLocation as base location and update it with LocationListener.
@Override
public void onMapReady(GoogleMap googleMap) {
if (ActivityCompat.checkSelfPermission
(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&&
ActivityCompat.checkSelfPermission
(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
requestPermissions(new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
}, 1);
}
else {
// enable location buttons
googleMap.setMyLocationEnabled(true);
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
// fetch last location if any from provider - GPS.
final LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
final Location loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//if last known location is not available
if (loc == null) {
final LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(final Location location) {
clearMap(googleMap); // clear map for every new location to update your marker unless `n` number of markers will form.
// getting location of user
final double latitude = location.getLatitude();
final double longitude = location.getLongitude();
final LatLng userCurrentLocation = new LatLng(latitude, longitude);
//focus added here **edited**
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userCurrentLocation, 14));
googleMap.addMarker(new MarkerOptions()
.position(userCurrentLocation)
.draggable(true)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.your_marker_icon_from_deawable)));
//do something with Lat and Lng, Parse to String if u want or set marker.
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
//when user enables the GPS setting, this method is triggered.
}
@Override
public void onProviderDisabled(String provider) {
//when no provider is available in this case GPS provider, trigger your gpsDialog here.
}
};
//update location every 10sec in 500m radius with both provider GPS and Network.
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10*1000, 500, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 500, locationListener);
}
else {
//do something with last known location.
// getting location of user
final double latitude = loc.getLatitude();
final double longitude = loc.getLongitude();
final LatLng userCurrentLocation = new LatLng(latitude, longitude);
//focus added here **edited**
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userCurrentLocation, 14));
googleMap.addMarker(new MarkerOptions()
.position(userCurrentLocation)
.draggable(true)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.your_marker_icon_from_deawable)));
}
}
}
Permission handling:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults[0] != PackageManager.PERMISSION_GRANTED){
//do something
}
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
This example is just for demonstration (example purpose) and I did not optimized my code by using methods. please edit in future.