Android Studio Map重置为默认视图应用程序重新启动

时间:2016-12-01 13:20:53

标签: java android google-maps google-maps-api-3

我不确定发生了什么,但是当我第一次运行我的应用时,有时地图会放大到我的标记。但是,有时它只显示没有我的标记的默认缩小状态。我希望有人可以看看我的代码,看看是否出了什么问题?

有时,如果我重新启动应用,则会出现标记。

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 个答案:

答案 0 :(得分:1)

抱歉!我终于意识到发生了什么。在连接时我实际上并没有绘制标记。

解决方案: 将这两行添加到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);
    }