2016-12-01 36 views
0

我不確定發生了什麼,但是當我第一次運行我的應用程序時,有時地圖會放大我的標記。然而,有時,它只會顯示出縮小的狀態,而我的標識默認值。我希望有人能來看看我的代碼,看看是否出了問題?Android Studio地圖重置爲默認視圖應用程序重啓

有時,如果我重新啓動我的應用程序,標記將出現在屏幕上。

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

回答

1

對不起!我終於意識到發生了什麼。我本來就不是畫標記,當它被連接。

解決方案: 這2行添加到onConnected

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

我創建了一個函數來處理得到的最後位置

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); 
    } 
相關問題