Search code examples
androidandroid-studiogoogle-mapsandroid-emulatorlocation

Android Studio Google Maps Working on Android Device but not on Emulator


I am trying to get my current location in Android Studio by using the Google Maps API Key I got from Google Cloud platform. If I run the app on my phone, everything is OK. If I run the app on the emulator, my location appears to be Google Plex, as in the following image(which would be completely wrong): emulator app showing the wrong location

I am not sure if it's because of the API key or maybe a mistake in the code/persmission/GPS? I took the code from a tutorial, but now it seems that Google Client is now deprecated (not sure if this is the problem). I believe it is because of the emulator, but I don't know why.I am currently using Pixel 2 API 26.

I will show the code here:

  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="com.google.android.providers.gsf.permisson.READ_GSERVICES"/>
<meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/google_maps_key" />

BUILD.GRADLE:

implementation 'com.google.android.gms:play-services-maps:17.0.1'
implementation 'com.google.android.gms:play-services-location:18.0.0'

MAPS ACTIVITY:

public class GoogleMapsActivity extends FragmentActivity implements OnMapReadyCallback,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    LocationListener {

private GoogleMap mMap;
private GoogleApiClient googleClient;
private LocationRequest locationRequest;
private Location ultimateLocation;
private Marker markerCurrentLocation;
private static final int Request_User_Location_Code = 90;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_google_maps);

    if(Build.VERSION.SDK_INT >= 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);
    assert mapFragment != null;
    mapFragment.getMapAsync(this);

}

@Override
public void onMapReady(@NotNull GoogleMap googleMap) {
    mMap = googleMap;
    //current location
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
        createGoogleApiClient();
        mMap.setMyLocationEnabled(true);
    }


}

protected synchronized void createGoogleApiClient() { // ok
    googleClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    googleClient.connect();

}

@Override
public void onLocationChanged(@NonNull Location location) { // ok
    ultimateLocation = location;
    if (markerCurrentLocation !=null)
    {
        markerCurrentLocation.remove();;
    }
    LatLng coordinates = new LatLng(location.getLatitude(), location.getLongitude());
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(coordinates);
    markerOptions.title("Current Location");
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));

    markerCurrentLocation = mMap.addMarker(markerOptions);
    mMap.moveCamera(CameraUpdateFactory.newLatLng(coordinates));
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 17.0f));

    if(googleClient!=null)
    {
        LocationServices.FusedLocationApi.removeLocationUpdates(googleClient,this);
    }
    else
    {
        Toast.makeText(this, "NULLLLLLLL", Toast.LENGTH_SHORT).show();
    }

}


@Override
public void onConnected(@Nullable Bundle bundle) { // ok
    locationRequest = new LocationRequest();
    locationRequest.setInterval(1100);
    locationRequest.setFastestInterval(1100);
    locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        LocationServices.FusedLocationApi.requestLocationUpdates(googleClient, locationRequest, this);
    }
}

public boolean checkLocationPermission(){ // ok
    boolean ret;
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
        if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION))
        {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, Request_User_Location_Code);
        }
        else
        {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, Request_User_Location_Code);

        }
        ret = false;
    }
    else
    {
        ret = true;
    }
    return ret;
}
//ok
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode)
    {
        case Request_User_Location_Code:
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED)
                {
                    if(googleClient==null)
                    {
                        createGoogleApiClient();;
                    }
                    mMap.setMyLocationEnabled(true);
                }
            }
            else
            {
                Toast.makeText(this, " PERMISSION DENIED", Toast.LENGTH_SHORT).show();
            }
            return ;
    }
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

}


Solution

  • Just go to the Emulator controls (Three dots menu) and in the Location tab, pin any location in the map and click Set Location.

    Then verify if you received the location you were expecting in your app.