/ / Android Studio Map si ripristina alla visualizzazione predefinita l'app viene riavviata: java, android, google-maps, google-maps-api-3

Viene riavviata l'app Studio Android Map ripristinata alla visualizzazione predefinita: java, android, google-maps, google-maps-api-3

Non sono sicuro di cosa stia succedendo ma quando corro il mio fileapp la prima volta, a volte la mappa ingrandisce il mio indicatore. Tuttavia, a volte, mostrerà solo lo stato di zoom indietro predefinito senza il mio indicatore. Spero che qualcuno possa dare un'occhiata al mio codice e vedere se qualcosa è andato storto?

A volte, se riavvio la mia app, verrà visualizzato il marcatore.

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;
}
}
}

risposte:

1 per risposta № 1

Spiacente! Alla fine ho capito cosa stava succedendo. In realtà non stavo disegnando il marcatore durante il collegamento.

Soluzione: Aggiungi queste 2 linee a onConnected

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

Ho creato una funzione per gestire il recupero dell'ultima posizione

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);
}