Issue
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.
Answered By - Eddie Lopez
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.