我正在制作像uber这样的应用,并且我使用了FusedLocationApi,但是它崩溃了

时间:2018-07-30 15:11:58

标签: android

public class Welcome extends FragmentActivity implements OnMapReadyCallback,

GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener

    {
        private GoogleMap mMap;

        private static final int MY_PERMISSION_REQUEST_CODE = 7000;
        private static final int PLAY_SERVICE_RES_REQUEST = 7001;

        private LocationRequest mLocationRequest;
        private GoogleApiClient googleApiClient;
        private Location mLastLocation;

        private static int UPDATE_INTERVAL = 5000;
        private static int FATEST_INTERVAL = 3000;
        private static int DISPLACMENT = 10;

        DatabaseReference drivers;
        GeoFire geoFire;

        Marker mCurrent;

        MaterialAnimatedSwitch animatedSwitch;
        SupportMapFragment mapFragment;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    animatedSwitch = (MaterialAnimatedSwitch) findViewById(R.id.location_switch);
    animatedSwitch.setOnCheckedChangeListener(new MaterialAnimatedSwitch.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(boolean isOnline) {
            if (isOnline){

                startLocationUpdates();
                displayLocation();
                Snackbar.make(mapFragment.getView(),"you are online!!",Snackbar.LENGTH_SHORT).show();
            }
            else {
                stopLocationUpdates();
                mCurrent.remove();
                Snackbar.make(mapFragment.getView(),"you are offline!!",Snackbar.LENGTH_SHORT).show();

            }
        }
    });

    drivers = FirebaseDatabase.getInstance().getReference("Drivers");
    geoFire = new GeoFire(drivers);
    setUpLocation();
}


        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode)
            {
                case MY_PERMISSION_REQUEST_CODE:
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                        if (checkPlayServices()) {

                            buildGoogleApiClient();
                            createLocationRequest();
                            if (animatedSwitch.isChecked())
                                displayLocation();
                            }


                    }


            }
        }

        private void setUpLocation() {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                    ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION )!= PackageManager.PERMISSION_GRANTED)
            {
                ActivityCompat.requestPermissions(this , new String[]{
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_FINE_LOCATION
                },MY_PERMISSION_REQUEST_CODE);

            }
            else {

                if (checkPlayServices()) {

                    buildGoogleApiClient();
                    createLocationRequest();
                    if (animatedSwitch.isChecked()) {
                        displayLocation();
                    }
                }
            }



        }

        private void createLocationRequest() {

    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(FATEST_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setSmallestDisplacement(DISPLACMENT);
        }

        private void buildGoogleApiClient() {

    googleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    googleApiClient.connect();


        }

        private boolean checkPlayServices() {
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (resultCode != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode))
            GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICE_RES_REQUEST).show();

        else {
            Toast.makeText(this, "This device is not supported", Toast.LENGTH_SHORT).show();
            finish();
        }
        return false;
    }
    return true;

        }

        private void stopLocationUpdates() {

            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                    ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION )!= PackageManager.PERMISSION_GRANTED)
            {
                return;

            }

            LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, (com.google.android.gms.location.LocationListener) this);
        }

        private void displayLocation() {


            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                    ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION )!= PackageManager.PERMISSION_GRANTED)
            {
                return;

            }

            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
            if(mLastLocation != null) {
                if (animatedSwitch.isChecked()) {
                    final double latitude = mLastLocation.getLatitude();
                    final double longtitiude = mLastLocation.getLongitude();

                    geoFire.setLocation(FirebaseAuth.getInstance().getCurrentUser().getUid(), new GeoLocation(latitude, longtitiude), new GeoFire.CompletionListener() {
                        @Override
                        public void onComplete(String key, DatabaseError error) {
                            if(mCurrent != null) {
                                mCurrent.remove();
                                mCurrent = mMap.addMarker(new MarkerOptions()
                                 .icon(BitmapDescriptorFactory.fromResource(R.drawable.car)).position(new LatLng(latitude,longtitiude)).title("you"));

                                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude,longtitiude),15.0f));
                                rotateMArker(mCurrent,-360,mMap);
                            }
                        }
                    });
                }
            }

            else {
                Log.d("ERROR","Cannot find your Location");
            }
        }

        private void rotateMArker(final Marker mCurrent, final float i, GoogleMap mMap) {

            final Handler handler = new Handler();

            final long start = SystemClock.uptimeMillis();

            final float startRotating = mCurrent.getRotation();
             final long duration = 1500;

            final Interpolator interpolator = new LinearInterpolator();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    long elapsed = SystemClock.uptimeMillis() - start;
                    float t = interpolator.getInterpolation((float)elapsed/duration);
                    float rot = t*i+(1-t)*startRotating;
                    mCurrent.setRotation(-rot > 180?rot/2:rot);

                    if (t<1.0) {

                        handler.postDelayed(this,16);

                    }


                }
            });




        }

        private void startLocationUpdates() {

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION )!= PackageManager.PERMISSION_GRANTED)
            {
                return;

            }

            LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,mLocationRequest, (com.google.android.gms.location.LocationListener) this);

        }


        @Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;


}

        @Override
        public void onLocationChanged(Location location) {

    mLastLocation = location;
    displayLocation();

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }

        @Override
        public void onConnected(@Nullable Bundle bundle) {
    displayLocation();
    startLocationUpdates();

        }

        @Override
        public void onConnectionSuspended(int i) {
    googleApiClient.connect();

        }

由于不推荐使用FusedLocationApi,因此每次崩溃。 我尝试了很多事情,但是没有用,它崩溃了,崩溃了 如何替换FusedLocationApi。

0 个答案:

没有答案