JianYA
JianYA

Reputation: 3024

Android Studio Map resets to default view app is restarted

I am not sure what is happening but when I run my app the first time, sometimes the the map zooms in to my marker. However, at times, it will just show the default zoomed out state without my marker. I hope someone can take a look at my code and see if something went wrong?

Sometimes if I restart my app, the marker will then appear.

public class MapFragment extends SupportMapFragment implements LocationListener,OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{

    private GoogleMap googleMap;
    private GoogleApiClient googleApiClient;
    private LocationRequest locationRequest;
    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
    Location location;
    Marker locationMarker;
    SharedPreferences sharedPreferences;
    String firstName;
    String lastName;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Important as without this, you will be loading a map only
        getMapAsync(this);
        sharedPreferences = getActivity().getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE);
        firstName = sharedPreferences.getString("Firstname","");
        lastName = sharedPreferences.getString("Lastname","");
    }

    protected synchronized void buildGoogleAPIClient(){
        googleApiClient = new GoogleApiClient.Builder(getActivity())
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        googleApiClient.connect();
    }

    @Override
    public void onLocationChanged(Location location) {
        LatLng currentLocation = new LatLng(location.getLatitude(),location.getLongitude());
        Double latitude = currentLocation.latitude;
        Double longitude = currentLocation.longitude;
        this.location = location;
        if(locationMarker!=null){
            locationMarker.remove();
        }
        Log.d("Current Location",latitude + " " + longitude);
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(currentLocation);
        markerOptions.title(firstName + " " + lastName);
        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
        locationMarker = googleMap.addMarker(markerOptions);
        float zoomLevel = 18;
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLocation,zoomLevel));

        if(googleApiClient!=null){
            LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient,this);
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        this.googleMap = googleMap;
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){
                buildGoogleAPIClient();
                this.googleMap.setMyLocationEnabled(true);
                this.googleMap.getUiSettings().setMapToolbarEnabled(false);
            }else{
                checkLocationPermission();
            }
        }else{
            buildGoogleAPIClient();
            this.googleMap.setMyLocationEnabled(true);
            this.googleMap.getUiSettings().setMapToolbarEnabled(false);
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if(googleApiClient!=null){
            LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient,this);
        }
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        locationRequest = new LocationRequest();
        locationRequest.setInterval(1000);
        locationRequest.setFastestInterval(1000);
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_FINE_LOCATION)==PackageManager.PERMISSION_GRANTED){
            LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,locationRequest,this);
        }
    }

    private void checkLocationPermission(){
        if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
            //Ask for permission again once the user sees the explanation
            if(ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.ACCESS_FINE_LOCATION)){
                new AlertDialog.Builder(getActivity())
                        .setTitle("Location Permission required")
                        .setMessage("This app requires location permissions in order to function")
                        .setPositiveButton("Allow", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_LOCATION);
                            }
                        })
                        .create()
                        .show();
            }else{
                //No explanation required. Just request for permissions
                ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_LOCATION);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case MY_PERMISSIONS_REQUEST_LOCATION: {
                if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    if(googleApiClient==null){
                        buildGoogleAPIClient();
                    }
                    if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){
                        this.googleMap.setMyLocationEnabled(true);
                        this.googleMap.getUiSettings().setMapToolbarEnabled(false);
                    }
                }else{
                    Toast.makeText(getActivity(),"Permission denied",Toast.LENGTH_LONG).show();
                }
                return;
            }
        }
    }

Upvotes: 0

Views: 112

Answers (1)

JianYA
JianYA

Reputation: 3024

Sorry! I finally realized what was happening. I wasn't actually drawing the marker when it was connecting.

Solution : Add these 2 lines to the onConnected

String getLastLocation = ""+LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
updateLocation(getLastLocation);

I created a function to handle getting the last location

private void updateLocation(String getLastLocation){
        getLastLocation = getLastLocation.replace("Location[fused","");
        String[] splitLocation = getLastLocation.split("acc");
        String[] splitLocationResult = splitLocation[0].split(",");
        Double latitude = Double.parseDouble(splitLocationResult[0]);
        Double longitude = Double.parseDouble(splitLocationResult[1]);
        LatLng coordinates = new LatLng(latitude,longitude);
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(coordinates,ZOOMLEVEL);
        googleMap.moveCamera(cameraUpdate);
        addMarkers(coordinates);
    }

Upvotes: 1

Related Questions