Android LocationServices.FusedLocationApi deprecated

后端 未结 8 766
没有蜡笔的小新
没有蜡笔的小新 2020-12-02 05:39

I couldn\'t figure out why LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest, this); \"FusedLocationApi\" is cross out

8条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-02 05:50

       // Better to use GoogleApiClient to show device location. I am using this way in my aap.
    
        public class SuccessFragment extends Fragment{
            private TextView txtLatitude, txtLongitude, txtAddress;
            // private AddressResultReceiver mResultReceiver;
            // removed here because cause wrong code when implemented and
            // its not necessary like the author says
    
            //Define fields for Google API Client
            private FusedLocationProviderClient mFusedLocationClient;
            private Location lastLocation;
            private LocationRequest locationRequest;
            private LocationCallback mLocationCallback;
    
            private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 14;
    
            @Nullable
            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.fragment_location, container, false);
    
                txtLatitude = (TextView) view.findViewById(R.id.txtLatitude);
                txtLongitude = (TextView) view.findViewById(R.id.txtLongitude);
                txtAddress = (TextView) view.findViewById(R.id.txtAddress);
    
                // mResultReceiver = new AddressResultReceiver(null);
                // cemented as above explained
                try {
                    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(getActivity());
                    mFusedLocationClient.getLastLocation()
                            .addOnSuccessListener(getActivity(), new OnSuccessListener() {
                                @Override
                                public void onSuccess(Location location) {
                                    // Got last known location. In some rare situations this can be null.
                                    if (location != null) {
                                        // Logic to handle location object
                                        txtLatitude.setText(String.valueOf(location.getLatitude()));
                                        txtLongitude.setText(String.valueOf(location.getLongitude()));
                                        if (mResultReceiver != null)
                                            txtAddress.setText(mResultReceiver.getAddress());
                                    }
                                }
                            });
                    locationRequest = LocationRequest.create();
                    locationRequest.setInterval(5000);
                    locationRequest.setFastestInterval(1000);
                    if (txtAddress.getText().toString().equals(""))
                        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                    else
                        locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    
                    mLocationCallback = new LocationCallback() {
                        @Override
                        public void onLocationResult(LocationResult locationResult) {
                            for (Location location : locationResult.getLocations()) {
                                // Update UI with location data
                                txtLatitude.setText(String.valueOf(location.getLatitude()));
                                txtLongitude.setText(String.valueOf(location.getLongitude()));
                            }
                        }
    
                        ;
                    };
                } catch (SecurityException ex) {
                    ex.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return view;
            }
    
            @Override
            public void onStart() {
                super.onStart();
    
                if (!checkPermissions()) {
                    startLocationUpdates();
                    requestPermissions();
                } else {
                    getLastLocation();
                    startLocationUpdates();
                }
            }
    
            @Override
            public void onPause() {
                stopLocationUpdates();
                super.onPause();
            }
    
            /**
             * Return the current state of the permissions needed.
             */
            private boolean checkPermissions() {
                int permissionState = ActivityCompat.checkSelfPermission(getActivity(),
                        Manifest.permission.ACCESS_COARSE_LOCATION);
                return permissionState == PackageManager.PERMISSION_GRANTED;
            }
    
            private void startLocationPermissionRequest() {
                ActivityCompat.requestPermissions(getActivity(),
                        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                        REQUEST_PERMISSIONS_REQUEST_CODE);
            }
    
    
            private void requestPermissions() {
                boolean shouldProvideRationale =
                        ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                                Manifest.permission.ACCESS_COARSE_LOCATION);
    
                // Provide an additional rationale to the user. This would happen if the user denied the
                // request previously, but didn't check the "Don't ask again" checkbox.
                if (shouldProvideRationale) {
                    Log.i(TAG, "Displaying permission rationale to provide additional context.");
    
                    showSnackbar(R.string.permission_rationale, android.R.string.ok,
                            new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    // Request permission
                                    startLocationPermissionRequest();
                                }
                            });
    
                } else {
                    Log.i(TAG, "Requesting permission");
                    // Request permission. It's possible this can be auto answered if device policy
                    // sets the permission in a given state or the user denied the permission
                    // previously and checked "Never ask again".
                    startLocationPermissionRequest();
                }
            }
    
            /**
             * Callback received when a permissions request has been completed.
             */
            @Override
            public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                                   @NonNull int[] grantResults) {
                Log.i(TAG, "onRequestPermissionResult");
                if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
                    if (grantResults.length <= 0) {
                        // If user interaction was interrupted, the permission request is cancelled and you
                        // receive empty arrays.
                        Log.i(TAG, "User interaction was cancelled.");
                    } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // Permission granted.
                        getLastLocation();
                    } else {
                        // Permission denied.
    
                        // Notify the user via a SnackBar that they have rejected a core permission for the
                        // app, which makes the Activity useless. In a real app, core permissions would
                        // typically be best requested during a welcome-screen flow.
    
                        // Additionally, it is important to remember that a permission might have been
                        // rejected without asking the user for permission (device policy or "Never ask
                        // again" prompts). Therefore, a user interface affordance is typically implemented
                        // when permissions are denied. Otherwise, your app could appear unresponsive to
                        // touches or interactions which have required permissions.
                        showSnackbar(R.string.permission_denied_explanation, R.string.settings,
                                new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        // Build intent that displays the App settings screen.
                                        Intent intent = new Intent();
                                        intent.setAction(
                                                Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                        Uri uri = Uri.fromParts("package",
                                                BuildConfig.APPLICATION_ID, null);
                                        intent.setData(uri);
                                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                        startActivity(intent);
                                    }
                                });
                    }
                }
            }
    
    
            /**
             * Provides a simple way of getting a device's location and is well suited for
             * applications that do not require a fine-grained location and that do not need location
             * updates. Gets the best and most recent location currently available, which may be null
             * in rare cases when a location is not available.
             * 

    * Note: this method should be called after location permission has been granted. */ @SuppressWarnings("MissingPermission") private void getLastLocation() { mFusedLocationClient.getLastLocation() .addOnCompleteListener(getActivity(), new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful() && task.getResult() != null) { lastLocation = task.getResult(); txtLatitude.setText(String.valueOf(lastLocation.getLatitude())); txtLongitude.setText(String.valueOf(lastLocation.getLongitude())); } else { Log.w(TAG, "getLastLocation:exception", task.getException()); showSnackbar(getString(R.string.no_location_detected)); } } }); } private void stopLocationUpdates() { mFusedLocationClient.removeLocationUpdates(mLocationCallback); } private void startLocationUpdates() { if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } mFusedLocationClient.requestLocationUpdates(locationRequest, mLocationCallback, null); } // private void showSnackbar(final String text) { // if (canvasLayout != null) { // Snackbar.make(canvasLayout, text, Snackbar.LENGTH_LONG).show(); // } //} // this also cause wrong code and as I see it dont is necessary // because the same method which is really used private void showSnackbar(final int mainTextStringId, final int actionStringId, View.OnClickListener listener) { Snackbar.make(getActivity().findViewById(android.R.id.content), getString(mainTextStringId), Snackbar.LENGTH_INDEFINITE) .setAction(getString(actionStringId), listener).show(); } }

    And our fragment_location.xml

           
           
    
                
    
                
            
    

提交回复
热议问题